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 🙏

© 2025 – Pkg Stats / Ryan Hefner

js-common

v0.0.1

Published

edp project

Readme

教室基础环境

初始化教室的步骤如下:

  1. 加载 path/classroom.js
  2. BJY.init(data)

数据

BJY.init({
    env: '环境,可选值 test/beta/production',
    token: '验证 token',
    class: {
        id: 'room id',
        name: '课程名称',
        startTime: '开始时间,精确到毫秒的时间戳',
        endTime: '结束时间,精确到毫秒的时间戳'
    },
    user: {
        number: '用户 number',
        avatar: '头像地址',
        name: '用户昵称',
        type: '用户类型 0-学生 1-老师 2-助教'
    },
    teacher: {
        number: '老师 number',
        avatar: '头像地址',
        name: '老师昵称',
        type: 1
    }
});

mock

满足以下要求即可上课:

  1. env 相同
  2. room id 相同
  3. teacher 只能有一个

登录进度

调用 init 之后,会尝试去连接主服务器、信令服务器。

在连接的过程中,教室不可用,为了保证良好的用户体验,通常会设计一个全屏的进度条界面。

var eventEmitter = BJY.eventEmitter;
eventEmitter
.one(
    eventEmitter.MASTER_SERVER_CONNECT_SUCCESS,
    function () {
        // 主服务器连接成功
    }
)
.one(
    eventEmitter.SERVER_INFO_FETCH_SUCCESS,
    function () {
        // 从主服务器获取服务器信息成功
    }
)
.one(
    eventEmitter.ROOM_SERVER_CONNECT_SUCCESS,
    function () {
        // 信令服务器连接成功
    }
)
.one(
    eventEmitter.ROOM_SERVER_LOGIN_SUCCESS,
    function () {
        // 信令服务器登录成功
        // 到此表示成功进入教室
    }
)
.one(
    eventEmitter.ROOM_SERVER_LOGIN_FAIL,
    function (event, data) {
        // 信令服务器登录失败
    }
)
.one(
    eventEmitter.ROOM_SERVER_LOGIN_OVERFLOW,
    function(event,data) {
        // 信令服务器已满,无法登录
    }
)
.one(
    eventEmitter.CLASSROOM_CONNECT_FAIL,
    function () {
        // 超时、或其他原因导致的失败
    }
);

初始化界面

var eventEmitter = BJY.eventEmitter;
eventEmitter
.one(
    eventEmitter.VIEW_RENDER_TRIGGER,
    function (event, data) {
        // 成功进入教室后,会触发此事件告知调用方初始化界面
    }
);

重连

因为网络环境的问题,教室可能中途掉线,因此当发生重连时,需提示用户。

var eventEmitter = BJY.eventEmitter;
eventEmitter
.on(
    eventEmitter.CLASSROOM_CONNECT_SUCCESS,
    function (event, data) {
        // 可能发生多次 CLASSROOM_CONNECT_SUCCESS 事件
        // data.reconnect 为 true 表示重连后的再次进入
    }
)
.on(
    eventEmitter.CLASSROOM_CONNECT_START,
    function (event, data) {
        if (data.reconnect) {
            // 可提示用户正在重连
        }
    }
)
.on(
    eventEmitter.CLASSROOM_CONNECT_END,
    function (event, data) {
        if (data.reconnect) {
            // 可提示用户重连结束
        }
    }
);

人数

进教室总人数(包括退出教室的)

var eventEmitter = BJY.eventEmitter;
eventEmitter
.on(
    eventEmitter.TOTAL_USER_COUNT_CHANGE,
    function (event, data) {
        // data.totalUserCount
    }
);

当前教室人数

var eventEmitter = BJY.eventEmitter;
eventEmitter
.on(
    eventEmitter.USER_COUNT_CHANGE,
    function (event, data) {
        // data.userCount
    }
);

名单

在一个教室中,有人进,也会有人出,因此 SDK 提供了以下三个事件:

var eventEmitter = BJY.eventEmitter;
eventEmitter
.on(
    eventEmitter.USER_ADD
    function (event, data) {
        // data.userList 为了批量添加考虑设计成数组
    }
)
.on(
    eventEmitter.USER_UPDATE
    function (event, data) {
        // data.user
        // data.update 更新的部分
    }
)
.on(
    eventEmitter.USER_REMOVE
    function (event, data) {
        // data.user
    }
);

消息

消息抽象为收发两个动作,通过频道参数,可自由实现为不同的功能,如聊天、问答。

发消息

var eventEmitter = BJY.eventEmitter;
eventEmitter.trigger(
    eventEmitter.MESSAGE_SEND,
    {
        content: '',
        channel: '频道'
    }
);

收消息

var eventEmitter = BJY.eventEmitter;
eventEmitter.on(
    eventEmitter.MESSAGE_RECEIVE,
    function (event, data) {
        // data 里包含频道、消息内容、发送者信息
    }
);

公告

请求现有的公告

var eventEmitter = BJY.eventEmitter;
eventEmitter.trigger(
    eventEmitter.NOTICE_REQ,
);

收到现有的公告

var eventEmitter = BJY.eventEmitter;
eventEmitter.on(
    eventEmitter.NOTICE_RES,
    function (event, data) {
        // data 里有公告内容
    }
);

修改公告

var eventEmitter = BJY.eventEmitter;
eventEmitter.trigger(
    eventEmitter.NOTICE_CHANGE_TRIGGER,
    {
        content: ''
    }
);

收到最新修改的公告

var eventEmitter = BJY.eventEmitter;
eventEmitter.on(
    eventEmitter.NOTICE_CHANGE,
    function (event, data) {
        // data 里有消息内容和发送者信息
    }
);