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

@thebcms/sdk

v1.1.1

Published

Abstraction module for consuming BCMS Backend REST API

Downloads

382

Readme

BCMS SDK

BCMS SDK is used to abstract REST API calls and caching for the client-side applications. Without this module, UI developers would have to implement REST API calls for the Backend module and take care of caching and storing data. This is not an easy task; therefore, this module is developed to allow UI developers to focus on the interface and user experience without worrying about request payload size, streams, and sockets.

With this in mind, the BCMS SDK is an abstraction layer between UI and Backend of the BCMS. Some of the things that this module covers are:

  • Cache layer - caching is done in memory, which means that data is available only during the same session. If a browser tab is reloaded, the cache is lost.
  • Authentication - there is no need to worry about security tokens and lifecycles.
  • Communication with Backend API - there is no need to make manual HTTP requests; just use abstract methods to get data, for example, sdk.template.getAll() to get all available templates.
  • Sockets - data synchronization is also handled, and the cache will always be in sync with other sessions.
  • The cache can be connected with a Vue store and reactive variables which allow use of computed functions.

This module is written in such a way that it can be used in browser and on the server.

Getting started

const sdk = createSdk(
    Store, // Store used to cache data (in-memory)
    Storage, // Storage used for saving data (persistant)
    {
        metadata() {
            return {};
        },
    }
);
if (!(await sdk.isLoggedIn())) {
    // Redirect user to OAuth callback, for example, Google
    window.location.href = 'https://app.thebcms.com/api/v3/auth/oauth/redirect/google'
    return;
}
// Get all templates
const templates = await sdk.template.getAll();

Caching

In addition to improved developer experience, big reason by SDK exists is because of the cache handling. If client side caching is not used and all date is fetch from the backend, client application will be slow with a lot of loaders. This will impact application performance. By implementing client-side data caching layer, application speed can be highly improved.

Data caching can improve application speed and reduce a load to the backend but it introduces a big problem which is synchronization of the data between clients and the backend.

Cache storing

The best way to explain this is with an example. Once logged in, the client application wants to get all Widgets. This will be done by calling sdk.widget.getAll(). Since this is the first time this method is called, a network request will be sent to the backend and data will be received. This data will be stored in memory (Store) and returned to the method caller. Some time later, the client application will again request all widgets, but this time when sdk.widget.getAll() is called, cache check will occur, since data is present in the cache, cache data will be returned to the client, without making a network request. Therefore, the second request will be much faster, without a delay. At this point in time, the client application wants to make some changes to a widget, and it will call sdk.widget.update(updateData). A network request will be sent to the Backend, and it will respond with an updated widget. The SDK will get the response and update the specified widget in the cache. If the widget does not exist in the cache, it will be added to it.

This implementation is easy to understand and implement if there is only 1 client which is reading and mutating data on the backend. But this is not the case with the BCMS since more then 1 user can use the application and mutate data.

Synchronizing cache

To synchronize cache between multiple clients and the backend, SDK uses socket. When some mutation occurs on the backend, socket event with mutation metadata will be emitted to all connected clients. When a client receives a socket event, it will check if mutated data exists in cache, if it does not, event will be ignored, but if it does, cache item will be removed and updated version of the data will be requested from the backend.

To explain this in more detail, simple example will be used:

  • 2 clients C1 and C2 are using the BCMS.
  • C1 will get all widgets
  • C2 will get all widgets
  • At this point, both C1, C2 and the backend are in sync
  • C1 will update some widget by calling sdk.widget.update(updateData)
  • Mutation of the data will occur on the backend and socket event will be emitted to the C2
  • C2 will receive the event and check if specified widget exists in cache. This check will be true and widget will be removed from the cache. After that, C2 will call the backend and fetch new widget data and push it to the cache.