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

streamator-react

v0.1.3

Published

Frontend primitives for displaying live log streams

Readme

streamator-react

Frontend primitives for displaying live log streams in React. Handles SSE connection, entry formatting, auto-scroll, and rendering.

Pairs with streamator on the backend.

Install

npm install streamator-react

Usage

import { useLogStream, LogPanel } from "streamator-react"
import "streamator-react/log.css"

const { logs, active } = useLogStream(`/api/log/${jobId}/stream`)

<LogPanel logs={logs} active={active} />

useLogStream(url, options)

const { logs, active } = useLogStream(url, {
  mode: "sse",          // "sse" (default) | "poll"
  interval: 3000,       // poll interval ms — poll mode only
  formatEvent: fn,      // (rawEvent) => string | null
})
  • logsArray<{ text, t, level }> — ready to render
  • activetrue while stream is open / polling
  • Passing null or undefined as url is a no-op

useJobStream(url)

Low-level hook for JobEmitter streams. Returns raw events without formatting.

const { events, active } = useJobStream(url)
// events: Array<{ event: string, t: number, ...payload }>
  • events — raw event objects as emitted by JobEmitter.emit() / .log()
  • activefalse once the done sentinel is received
  • done events are consumed internally and never appear in events
  • Passing null or undefined as url is a no-op

Use this instead of useLogStream when you need to handle arbitrary event shapes:

const { events, active } = useJobStream(`/job/${jobId}/stream`)
const progress = events.findLast(e => e.event === "progress")

LogPanel props

<LogPanel
  logs={logs}
  active={active}
  waitingText="⏳ Starting…"           // shown while active but no logs yet
  maxHeight="200px"                    // default: 160px
  className="my-log"                   // appended to root class
  style={{}}
  renderEntry={(entry, i) => <div />}  // fully custom row renderer
  autoScroll={true}                    // set false to disable auto-scroll
/>

Returns null when not active and no logs. Auto-scrolls to latest entry.

makeFormatEvent(overrides)

Map structured backend events to display strings:

import { makeFormatEvent } from "streamator-react"

const formatEvent = makeFormatEvent({
  scraping: e => `🔍 Scraping ${e.url}`,
  done:     () => `✅ Finished`,
})

const { logs } = useLogStream(url, { formatEvent })

Return null from a handler to suppress that entry entirely.

Styling

Default styles via CSS custom properties — override any of them:

--streamator-bg:            #f8f8f8;
--streamator-border:        #e0e0e0;
--streamator-color:         #444;
--streamator-time-color:    #aaa;
--streamator-radius:        6px;
--streamator-font-size:     0.8rem;
--streamator-max-height:    160px;
--streamator-success-color: #2e7d32;
--streamator-warning-color: #f59e0b;
--streamator-error-color:   #c62828;

Migrating from old .log / .log-time / .log-waiting class names?

import "streamator-react/log-compat.css"