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

@beeworks/imsdk-jitsi-adapter

v0.1.1

Published

Jitsi Meet Web adapter for @beeworks/imsdk meeting APIs.

Downloads

76

Readme

@beeworks/imsdk-jitsi-adapter

浏览器端 Jitsi Meet External API 适配器。它把 @beeworks/imsdk 的会议接口与 Jitsi Web 会议连接起来,但不会把 Jitsi、DOM 或 iframe 依赖带入核心 SDK。

import * as imsdk from '@beeworks/imsdk';
import { createJitsiAdapter } from '@beeworks/imsdk-jitsi-adapter';

const adapter = createJitsiAdapter({ meetingApi: imsdk });
const session = await adapter.join({
  meetingNo: 123456789, // 也可传入 '123456789'
  parentNode: document.querySelector('#meeting')!,
  enableInviteRequest: true,
  customeInviteDomain: 'https://workplus-meet.workplus.io/web/#/meetLink?no=%s',
});

session.on('joined', () => console.log('joined'));
session.on('inviteRequested', ({ meetingNo }) => {
  // 1. 宿主应用打开联系人选择器
  // 2. 通过 IM 向选中的用户发送会议邀请消息
  // 3. 被邀请用户收到消息后调用 joinMeet(meetingNo),再进入 Jitsi
  console.log('invite requested', meetingNo);
});
await session.leave();

start() 会先调用 startMeet,join() 会先调用 joinMeet,mount() 只获取新鲜的 Jitsi 参数并挂载会议。Jitsi External API 从服务端返回的 serverUrl 动态加载,JWT 不会被记录或持久化。

会话事件中,left 表示当前用户离开 Jitsi,会话最多触发一次;显式调用 session.leave() 会在发出 hangup 后立即派发一次 left,随后销毁会话。 readyToClose 只用于适配器内部完成销毁,不代表服务端会议状态结束。服务端会议 结束仍应监听核心 SDK 的 MEETING_STATE_CHANGED(操作为 END 或 CANCEL)。

会话提供 role(moderator、participant、unknown)和 isModerator,由 Jitsi 的 participantRoleChanged 更新。leave() 只让当前用户离开;end() 请求 结束整场会议,已确认是普通参与者时会返回 NOT_MODERATOR,角色未知时交由 Jitsi 服务端做最终权限校验。

Jitsi 的 micError 和 cameraError 会分别映射为 microphoneError 和 cameraError,同时保留通用 error 事件。错误消息不会包含 JWT 或完整 URL; 错误码会尽力归类为 *_PERMISSION_DENIED、*_UNAVAILABLE 或 *_ERROR;具体的 浏览器权限、设备占用和服务端策略原因以事件中的 error.cause 为诊断依据,业务层 不应直接向用户展示其中的原始内容。

enableInviteRequest 默认为 true,Adapter 会在 Jitsi 配置中开启定制的 externalInvitation 模式,并把每次邀请按钮点击转换为当前会话的 inviteRequested 事件。事件只表示“请求打开邀请流程”,载荷仅包含规范化后的 meetingNo;Adapter 不会弹出联系人选择器、查询成员、发送会议邀请 IM 或调用 会议邀请 HTTP API,这些逻辑由宿主应用负责。宿主应用发送 IM 后,被邀请端应先调用 joinMeet(meetingNo) 完成会议业务加入,再使用 Adapter 进入 Jitsi。该选项默认为 true,与 pc-xx 的定制 Jitsi 行为一致;如需保留 Jitsi 自带的邀请弹窗,可显式传入 enableInviteRequest: false。仍可通过 configOverwrite 配置其他 Jitsi 定制项。

customeInviteDomain 与 externalInvitation 是两个独立的 Jitsi 定制配置:前者是 Jitsi 默认分享内容使用的邀请链接模板(字段名沿用 pc-xx 的历史拼写,%s 代表会议号), 后者才是将“分享会议”和“邀请其他人”按钮点击转成 inviteRequested 事件的开关。 如果 /meetings/{meetingNo}/sdk 已返回该字段,Adapter 会自动透传;调用方也可在 挂载选项中覆盖它,或继续使用 configOverwrite.customeInviteDomain。