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

@unityevolv/ofiskit-realtime-client

v0.3.0

Published

The office state on the client: snapshot, diffs, resync, and the RTC client adapter interface with the built-in peer-to-peer implementation. No DOM, so React Native can use it too.

Readme

@unityevolv/ofiskit-realtime-client

The office as a client sees it: connect, walk in, move between rooms, and take part in the call.

It holds the office state, applies diffs, notices a gap in the sequence and resyncs, and reconnects without the person having to do anything. It carries no DOM, so React Native can use it as it is.

import { createOfisClient } from '@unityevolv/ofiskit-realtime-client'

const client = createOfisClient({ url, deviceId })
client.subscribe((office) => render(office))

await client.enter({ email, name })
await client.joinRoom(roomId)
await client.joinCall({ audio: true, video: false })

The RTC half is an adapter too. The built-in one is a peer-to-peer mesh with audio, video and screen share; another provider's SDK goes behind the same interface, and the UI never learns which is in use.

An adapter may also carry small messages between the legs of a call. It is optional, so check for it:

const channel = client.rtc.openDataChannel?.('input', { ordered: false, maxRetransmits: 0 })
if (channel) {
  const stop = channel.onMessage((data, fromDeviceId) => handle(data, fromDeviceId))
  channel.send(JSON.stringify(event)) // everyone in the call
  channel.send(JSON.stringify(event), deviceId) // one leg
}

Both ends open the same label. Strings only, at most DATA_CHANNEL_MAX_BYTES (16 KiB) each; a leg not connected yet is skipped, and the channel closes when the call ends. The built-in mesh carries it on a negotiated data channel per connection, with an id both ends derive from the label.

connect takes any socket-like object, so the client can run over something other than Socket.IO — which is how the browser-only demo puts the whole office in a tab.

Licence

AGPL-3.0-only. The interface packages (ofiskit-template, ofiskit-presence-store and ofiskit-adapters) are Apache-2.0, so building against the interfaces is not a licensing decision even though extending this is.

Part of ofiskit: a virtual office you can run yourself. Try the demo.