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

@carney520/itc

v0.2.6

Published

inter-tabs-communication

Downloads

14

Readme

ITC

Inter-Tabs-Communication 跨浏览器 Tab/iframe 通信. 基于SharedWorker, 对于不支持SharedWorker的浏览器 将回退为StorageEvent方案.

EXAMPLE

安装

yarn add @carney520/itc

基本使用

import itc from '@carney520/itc'

const worker = itc('name')
const currentMaster
const currentPeers = []

itc.on('master', () => {
  // become master
})

itc.on('masterlose', () => {
  // master lose. 如果页面被阻塞, 例如debug, 将导致页面无法回复心跳, 从而导致其他页面认为页面已经销毁.
  // 这时候页面恢复执行后, 其他页面可能已经抢占了master的地位
})

itc.on('masterupdate', master => {
  // 监听master的变化, 类型为{id: string, name}
  currentMaster = master
})

itc.on('peerupdate', peers => {
  // 监听其他页面的变化, peers是一个包含其他页面的列表, 类型为Array<{id: string, name: string}>
  currentPeers = peers
})

// broadcast
itc.send('121')

itc.on('message', message => {
  const { data, source } = message
  // 发送给指定peer
  itc.send('response', source)
})

API

export type Disposer = () => void

export interface Peer {
  id: string | number
  name: string
}

export interface Message<T = any> {
  data: T
  source: Peer
}

interface Transport {
  // meta datas
  readonly name?: string
  readonly destroyed: boolean
  readonly current: Peer
  setCallTimeout(time: number): void

  /**
   * listen message | master event
   */
  on(event: 'ready', handler: () => void): Disposer
  on(event: 'master', handler: () => void): Disposer
  on(event: 'masterlose', handler: () => void): Disposer
  on(event: 'message', handler: (data: Message) => void): Disposer
  on(event: 'peerupdate', handler: (data: Peer[]) => void): Disposer
  on(event: 'masterupdate', handler: (data: Peer) => void): Disposer

  /**
   * remove listener
   */
  off(event: string, handler: (data: any) => void): void

  /**
   * send message to other tabs
   */
  send(data: any, peer?: Peer): void

  /**
   * call function on other tab
   */
  call(peer: Peer, name: string, ...args: any[]): Promise<any>

  /**
   * response call
   */
  response(
    name: string,
    handler: (peer: Peer, ...args: any[]) => Promise<any>,
  ): void

  /**
   * get current Master
   */
  getMaster(): Promise<Peer | undefined>

  isMaster(): Promise<boolean>

  /**
   * get all other tabs(peers)
   */
  getPeers(): Promise<Peer[]>

  /**
   * destroy
   */
  destroy(): void
}