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 🙏

© 2026 – Pkg Stats / Ryan Hefner

node-red-contrib-simple-bu

v1.5.0

Published

A Node-RED node that buffers and transmits data reliably with local file-based ring buffer storage.

Readme

Node-RED Contrib SimpleBU

SimpleBU converts measurements to CSV (id,value,timestamp) and POSTs them to a SimpleBU endpoint. Version 1.5.0 adds individual measurement timestamps and repairs large-array delivery, offline recovery and concurrent-input data loss.

Install through Node-RED's Manage Palette, or from your Node-RED user directory:

npm install node-red-contrib-simple-bu

Restart Node-RED after upgrading. See CHANGELOG.md for changes and upgrade notes. Existing [id,value] input and ring.dat files remain supported.

Input

One measurement:

{"topic":"temp1","payload":22.5,"timestamp":1790000000}

One message containing many measurements:

const start = Math.floor(Date.now() / 1000) - 15000;
msg.payload = Array.from({ length: 15000 }, (_, i) => ["sensor." + i, i, start + i]);
return msg;

The entire array is accepted as a single input message. Each item is either [id, value, timestamp] or the legacy [id, value]. SimpleBU performs CSV conversion and HTTP chunking itself. Array items are measurements, not files. A triple's timestamp takes priority; a pair uses msg.timestamp, or input arrival time when omitted. Both forms may be mixed. An unused message timestamp is ignored when all rows supply their own time. Explicit null/undefined row timestamps are rejected.

  • IDs: nonempty ASCII letters, digits, dot or underscore; finite numeric IDs also work.
  • Values: finite JavaScript numbers, including zero and negatives. Decimal serialization preserves the provided number without rounding tiny values or using exponent notation.
  • Time: UNIX seconds, modern UNIX milliseconds (abs(value) >= 1e12), a date string accepted by JavaScript Date.parse, or a valid Date. Seconds are floored. Numeric units below that threshold are seconds; for older millisecond dates, use ISO or Date.
  • An omitted/null msg.timestamp uses input arrival time. Invalid timestamps are rejected; a triple must always contain an explicit valid timestamp.
  • Empty, malformed or invalid arrays are rejected as a whole, before any rows are stored.
  • A single CSV row larger than 102,400 bytes is rejected. The array itself can be much larger.

Sending and buffering

Validated input is appended to ring.dat before sending. Appends, POSTs and file compaction are serialized per node, preserving FIFO input order. Large queues (at least 100 KiB) start sending immediately; small batches wait for the flush timer. A drain sends consecutive chunks until the queue is empty or a request fails; there is no flush-interval delay between chunks. Individual CSV rows are never split.

The node reads at most 100 KiB per HTTP request and compacts the remaining file once per drain attempt. It does not rebuild or rewrite the entire remaining queue per POST. On startup, existing disk data is retried without waiting for a new input message. On graceful close/redeploy, in-flight HTTP is cancelled and already queued input is written to disk; unsent data stays there for the next instance.

The server must return HTTP 2xx and either an empty/whitespace body or OK on its first line. Additional lines may contain diagnostics (the deZem test endpoint returns a hex echo). A blank first line followed by an error is not an acknowledgement. Other bodies/statuses, timeouts and connection errors retain data for retry. Redirects are not followed: configure the final upload URL directly. Headers:

Content-Type: text/csv; charset=utf-8; header=absent
User-Agent: IF:Simple TYPE:<SimpleType> SN:<SimpleSn>

Configuration

| Field | Meaning | | --- | --- | | Endpoint-URL | Final HTTP/HTTPS upload URL, required | | Simple Type / Simple SN | Values used in the User-Agent header | | Ring Buffer Size (MB) | Disk cap, default 100 MiB, range 1–4096 | | Storage Path | Writable directory dedicated to this node | | Flush Interval (s) | Small-batch/retry interval, default 60, range 1–600 | | HTTP Timeout (s) | Per-request timeout, default 10, range 1–600 | | Debug Enabled | Additional per-chunk delivery logs; errors are always reported |

Each active node needs its own storage path. Sharing a directory within one process is rejected. Do not share a path across separate Node-RED processes either; the ownership guard is process-local. Existing ring.dat files remain compatible. An incomplete trailing row is retained with an error; back up and repair that file before accepting more input, rather than silently merging new rows into corrupt data.

Input validation/storage errors use Node-RED done(error) / Catch nodes. A successful input completion means local processing finished; server failure can still leave data buffered. Runtime delivery failures are also reported independently of Debug Enabled.

Delivery limits

  • When the disk cap is exceeded, the oldest complete rows are dropped with a warning. Choose enough capacity for the largest input plus the expected offline backlog.
  • Delivery is at least once under successful persistence and eventual recovery, subject to the cap. A lost HTTP acknowledgement, disk error during compaction or crash before compaction can replay already accepted chunks. Server-side deduplication is required if duplicates are unacceptable.
  • Persistence uses ordinary filesystem writes, not an fsync transaction. Hardware/power failures are not covered. Input waiting behind an active send remains in process memory until its disk write; a forced process kill can lose that pending input.
  • Graceful shutdown preserves pending input, but a forced kill or Node-RED shutdown deadline can interrupt work. Unbounded producer traffic still needs upstream backpressure.
  • Large arrays are formatted once in memory; the 100 KiB HTTP cap is not a maximum JavaScript heap limit. A single 10,000/15,000-row message is covered by tests.

Development and tests

Runtime requires Node.js >=14. Tests use Node.js >=18 and real local HTTP and filesystem operations; only the Node-RED node-registration/lifecycle interface is substituted.

npm install
npm test

Tests cover single 10,000/15,000-row arrays, exact CSV/order, retry and partial recovery, overlapping inputs, startup, shutdown, timestamps/values, cap boundaries, errors and redirects. Version 1.5.0 passed 37 automated tests, Node-RED 3.0.2 integration tests, and 10,000/15,000-record tests against deZem's test endpoint with exact CSV echo checks. Echo verification confirms receipt by the test endpoint, not persistent database storage.

License

MIT License. © 2025 deZem GmbH / Emir Dovletyarov.