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

@xeaone/server

v5.4.1

Published

X-Server Deno server module with built in middleware.

Downloads

10

Readme

deno module deno compatibility CodeQL GitHub

X-Server

Deno server module with built in middleware.

Use

https://deno.land/x/xserver/src/mod.ts

Example

import { Handler, Normalize, Router, Server } from 'https://deno.land/x/xserver/src/mod.ts';

const router = new Router();
const handler = new Handler();
const normalize = new Normalize();

normalize.any('/*', true);

router.get('/*', (context) => context.html`<h1>Hello World</h1>`);
router.post('/*', (context) => context.ok({ message: 'posted' }));

handler.add(normalize);
handler.add(router);

Server((request) => handler.handle(request));

Server

Wraps Deno.serve

Handler

Constructor that stores the middleware/plugins/tools used on each request.

import { Handler, Normalize, Server } from 'https://deno.land/x/xserver/src/mod.ts';

const handler = new Handler();
const normalize = new Normalize();

handler.add(normalize);

Server((request) => handler.handle(request));

Normalize

Constructor Plugin that will remove index.html, .html, and // from the url then redirect. Optionally you can redirect http to https and www to non-www.

import { Normalize } from 'https://deno.land/x/xserver/src/mod.ts';
const normalize = new Normalize();
normalize.www(true); // redirects www to non www
normalize.https(true); // redirects http to https
normalize.any('/*', true); // any method and any path Normalize

Cors

Constructor Plugin that will add cors header.

import { Cors } from 'https://deno.land/x/xserver/src/mod.ts';
const cors = new Cors();
cors.get('/foo', 'https://foo.com/'); // get method test path and CORS on only foo.com domain
cors.any('/*', '*'); // any method any path and CORS on any domain

Payload

Constructor Plugin that will parse the request body.

import { Payload } from 'https://deno.land/x/xserver/src/mod.ts';
const payload = new Payload();
payload.parse('json'); // default is json
payload.post('/*', true); // post method any path

Router

Constructor Plugin that will route request to a handle method.

import { Router } from 'https://deno.land/x/xserver/src/mod.ts';
const router = new Router();
router.post('/*', (context) => context.ok('hello world')); // post method any path

File

Constructor Plugin that will serve files. SPA mode will route all non existent files in the path folder to the /index.html.

import { File } from 'https://deno.land/x/xserver/src/mod.ts';
const file = new File();
file.spa(true);
file.path('./web');
file.get('/*', true); // get method any path serve files from the ./web folder

Session

Constructor Plugin that will provide session using Secure Session Cookies https://tools.ietf.org/html/rfc6896.

import { Session } from 'https://deno.land/x/xserver/src/mod.ts';

const sessions = new Map();
const session = new Session();

session.validate((context) => {
    const { session } = context.tool.session.data;
    // return a response to prevent access end exit the handler loop early
    if (!sessions.has(session)) return context.unauthorized();
});

session.secret('secret'); // unique secret
session.signature('signature'); // unique signature

session.any('/*', true); // any method and any path is protected
session.get('/*', false); // get method any path disable session protection
session.post('/sign-up', false); // post method specific path disable session protection
session.post('/sign-in', false); // post method specific path disable session protection

Forwarded

Constructor Plugin that will parse the forwarded header. This is good for getting client/remote IP address behind a proxy/loadbalancer.

import { Forwarded } from 'https://deno.land/x/xserver/src/mod.ts';
import { Handler, Server } from 'https://deno.land/x/xserver/src/mod.ts';

const forwarded = new Forwarded();
const handler = new Handler();

forwarded.any('/*', true); // any method and any path parse forwarded header

handler.add(forwarded);

/*
    type ForwardedData = {
        by: Array<string>;
        for: Array<string>;
        host: Array<string>;
        proto: Array<string>;
    };
*/
handler.add(function (context) {
    const { for: [client] } = context.tool.forwarded.data;
    return context.ok(client);
});

Server((request) => handler.handle(request), { port: 8080 });

Socket

Constructor Plugin that will