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

@atomly/dataloader-sdk

v1.0.7-alpha.0

Published

> TODO: description

Downloads

13

Readme

dataloader-sdk

TODO: description

Usage

const atomlyEntitiesSdk = require('dataloader-sdk');

// TODO: DEMONSTRATE API

Entity Loaders Factory Concerns

(excerpts taken from the DataLoader documentation)

  • [ ] Loading by alternative keys

    Occasionally, some kind of value can be accessed in multiple ways. For example, perhaps a "User" type can be loaded not only by an "id" but also by a "username" value. If the same user is loaded by both keys, then it may be useful to fill both caches when a user is loaded from either source:

      const userByIDLoader = new DataLoader(async ids => {
        const users = await genUsersByID(ids)
        for (let user of users) {
          usernameLoader.prime(user.username, user) // Priming in the other DataLoader.
        }
        return users
      });
    
      const usernameLoader = new DataLoader(async names => {
        const users = await genUsernames(names)
        for (let user of users) {
          userByIDLoader.prime(user.id, user) // Priming in the other DataLoader.
        }
        return users
      });
  • [ ] Clearing Cache

    In certain uncommon cases, clearing the request cache may be necessary.

    The most common example when clearing the loader's cache is necessary is after a mutation or update within the same request, when a cached value could be out of date and future loads should not use any possibly cached value.

    Here's a simple example using SQL UPDATE to illustrate.

      // Request begins...
      const userLoader = new DataLoader(...)
    
      // And a value happens to be loaded (and cached).
      const user = await userLoader.load(4)
    
      // A mutation occurs, invalidating what might be in cache.
      await sqlRun('UPDATE users WHERE id=4 SET username="zuck"')
      userLoader.clear(4)
    
      // Later the value load is loaded again so the mutated data appears.
      const user = await userLoader.load(4)
    
      // Request completes.
  • [ ] Memory consumption for long-lived DataLoaders

    Custom Cache. As mentioned above, DataLoader is intended to be used as a per-request cache. Since requests are short-lived, DataLoader uses an infinitely growing Map as a memoization cache. This should not pose a problem as most requests are short-lived and the entire cache can be discarded after the request completes.

    However this memoization caching strategy isn't safe when using a long-lived DataLoader, since it could consume too much memory. If using DataLoader in this way, you can provide a custom Cache instance with whatever behavior you prefer, as long as it follows the same API as Map.

    The example below uses an LRU (least recently used) cache to limit total memory to hold at most 100 cached values via the lru_map npm package.

    import { LRUMap } from 'lru_map'
    
    const myLoader = new DataLoader(someBatchLoadFn, {
      cacheMap: new LRUMap(100)
    })

    More specifically, any object that implements the methods get(), set(), delete() and clear() methods can be provided. This allows for custom Maps which implement various cache algorithms to be provided.