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

@realtime-inspector/react-native-gzip

v0.10.0

Published

Native, **off-thread** gzip for the Reincraft React Native SDK.

Readme

@realtime-inspector/react-native-gzip

Native, off-thread gzip for the Reincraft React Native SDK.

An optional companion to @realtime-inspector/react-native. Install it and pass its gzipBody to the provider — the SDK then gzip-compresses every upload batch on a native thread (zlib), cutting wire bytes ~×9 without touching the JS thread. Don't install it and the SDK sends uncompressed bodies; the backend accepts both, so this is a pure, fully backward-compatible bandwidth optimization with no wire-contract change (the web SDK does the same via the platform CompressionStream).

A pure-JS gzip (pako/fflate) was rejected because DEFLATE on the JS thread competes with the app during a live experience (the observer-effect budget is a hard rule). This module moves the compression off-thread via a Nitro HybridObject; only a cheap TextEncoder runs on the JS thread.

Install & wire

bun add @realtime-inspector/react-native-gzip react-native-nitro-modules
cd ios && pod install   # iOS
# Android: gradle sync (autolinked)
import { ReincraftProvider } from '@realtime-inspector/react-native'
import { gzipBody } from '@realtime-inspector/react-native-gzip'

<ReincraftProvider config={{ compress: gzipBody }}>{children}</ReincraftProvider>

The app drives the import on purpose: Metro resolves require() calls statically at bundle time, so the always-bundled binding can't guard-require an optional native package (an uninstalled one would fail the bundle, and a runtime try/catch can't catch a build-time resolution error). Importing gzipBody here is how Metro learns to bundle this module — only when you've actually installed it.

Requires the React Native New Architecture (Nitro/JSI). With it absent, the native object won't register; gzipBody then resolves null per call and the SDK falls back to uncompressed sends (a flush never fails on compression).

Implementation

One shared C++ implementation for both platforms (zlib: libz on iOS, the NDK zlib on Android), because gzip is identical across platforms and Apple's Compression framework emits raw DEFLATE rather than the gzip wrapper the backend's gunzip expects.

  • Spec: src/specs/gzip.nitro.tsgzip(data: ArrayBuffer, level?: number): Promise<ArrayBuffer>.
  • Impl: cpp/HybridGzip.{hpp,cpp} — copies the input bytes on the JS thread (a borrowed JS ArrayBuffer is only valid there), then deflates on Nitro's thread pool with windowBits = 15 + 16 (the gzip wrapper) and resolves an owning ArrayBuffer.

Regenerate the Nitro glue after a spec change: bun run nitrogen (then pod install / gradle sync). If a linked-dependency native change doesn't take, bust the autolinking cache: rm -rf android/build/generated/autolinking.