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

mem-box

v1.1.0

Published

Shared memory.

Downloads

596

Readme

mem-box

Shared memory.

npm version GitHub code size GitHub tag npm license

$ npm i mem-box

shared memory pattern

Frontend and backend applications often use some globally-configured objects, like axios instance with custom headers and base url, authenticated cloud services provider instance, express.js instance, database connection object, configured redux store, etc...

One might stick these to window (or global) object, but it's considered an anti-pattern.

Another solution is to pass these objects as parameters to functions that needs to use them, but it's cumbersome and scales poorly.

Using mem-box solves these problems and resembles the usage of hooks in react.

example

  • main.js file of an express.js-based microservice application:

    import express from "express";
    import { share } from "mem-box";
    import configureRoutes from "./routes";
    
    // main express application
    const app = express();
    
    // share it with any other module interested
    share({ app });
    
    // complex configuration - e.g. enable CORS,
    // authentication, redirects, etc.
    // ...
    
    // routes configuration
    configureRoutes();
    
    app.listen(/* ... */);
  • example routes.js file:

    import { useMemory } from "mem-box";
    
    export default configureRoutes () {
    
        // get access to main express application
        const { app } = useMemory();
    
        // add "hello world" route
        app.get("/hello/", (req, res, next) => {
            res.status(200).send({ hello: "world" });
            return next();
        });
    
    }

usage with typescript

In order to provide type-safety (and nice IntelliSense hints) declaration merging typescript feature can be utilized.

  • main.ts file of an express.js-based microservice application:

    import express from "express";
    import { share } from "mem-box";
    import configureAuth from "./auth";
    
    // main express application
    const app = express();
    
    // private key (read from env or keystore in real-world)
    const secretKey = "-----BEGIN PRIVATE KEY-----\nMIIEvqhkiGwgEqh...";
    
    // share with other modules
    share({ app, secretKey });
    
    // authentication config (based on external service provider)
    configureAuth();
    
    // ...
    
    app.listen(/* ... */);
    
    // global declaration merging
    declare global {
    
        // shared memory type augmentation
        interface Mem {
            app: ReturnType<typeof express>;
            secretKey: string;
        }
    
    }
  • example auth.ts file:

    import type { RequestHandler } from "express";
    import { someservice } from "someserviceapis"; // imaginary service
    import { share, useMemory } from "mem-box";
    
    // ...
    export default configureAuth (): void {
    
        // get access to secret (explicit type hint)
        const { secretKey } = useMemory<Mem>();
    
        // obtain JSON Web Token from external provider
        const jwt = new someservice.auth.JWT({
            secretKey, /* scopes: [...], subject: ..., */
        });
    
        // build middleware for usage in other modules
        const authMw: RequestHandler = (req, res, next) => {
            // do something with `jwt` const
            // ...
            return next();
        };
    
        // share it
        share({ authMw });
    
    }
    
    // inform type system of a new member in `Mem` interface
    declare global {
    
        // shared memory type augmentation
        interface Mem {
            authMw: RequestHandler;
        }
    
    }

documentation

API Reference

namespace

shared memory

memory
{ useMemory: [Function: useMemory],
  share: [Function: share] }

notes

This library is suitable to use in server and browser environments and it is being used as such. Go ahead and file an issue if you found a bug 🐞.

support

You can support this project via stellar network:

license

mem-box is released under the Apache License, Version 2.0. See the LICENSE for more details.