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

window-reduce

v1.0.0

Published

apply a reduce function to a circular buffer.

Downloads

3

Readme

circular-buffer-reduce

apply a reduce function to a circular buffer.

I created this for performance monitoring, I need to make performance measurements, but do not require high precision measurements to be stored forever. For example, I want to keep a measure of bandwidth used per second, but I don't really need to track the bandwidth per second for the entire time the app has been running - the last 60 seconds is enough! It is useful to know the history of performance, but instead we could track the averages over the last hour at the precision of minutes, not seconds, and then the past few days at the precision of hours!

This means we can measure performance characteristics over a wide range of time spans without using much resources at all. This means we can add performance monitoring to our app without adversely effecting performance.

Example

var stats = require('stats/mutable')
function id (item) { return item.ts }
function reduce (acc, item) {
  return stats(acc, item.value)
}
var circular_reduce = require('circular-buffer-reduce')(id, reduce, 1000, 60)


var acc
//whenever something happens, apply the reduce function.
acc = circular_reduce(acc, {ts: Date.now(), value: Math.random()})

api - createCircularReduce(getTs, reduce, width, max) => circular_reduce

createCircularReduce returns a reduce function that aggregates incoming items into max aggregations that are each width units wide. If you want to track the last minute worth of seconds, and each item has a javascript timestamp (in milliseconds) then width should be 1000, and max should be 60.

getTs is a function that returns the timestamp for the current item passed to circular_reduce. reduce is a standard reduce function that takes the current accumulator and the data item. since there is no option for a initial item, reduce must accept reduce(null, item) as the first item in a new accumulation.