frontend/src/utils/socket.js

(开头部分) 4KB

这里只显示每个文件的开头 60 行。登录后可以解锁完整代码。

import * as SignalR from '@microsoft/signalr'
import store from '../store/index'

const EventEmitter = require('events')

const defaultOptions = {
  log: false
}

class SocketConnection extends EventEmitter {
  constructor(connection, options = {}) {
    super()
    this.connection = connection
    this.options = Object.assign(defaultOptions, options)
    this.listened = []
    this.toSend = []
    this.offline = false
    this.socket = undefined
  }

  /**
   * 同一种消息只定义一次
   *
   * @param {string| symbol} event
   * @param {(...args: any[]) => void} listener
   * @memberof SocketConnection
   */
  one(event, listener) {
    if (this.listeners(event).length === 0) {
      this.on(event, listener)
    }
  }

  async _initialize() {
    try {
      await this.socket.start()
      this.emit('onstart')
      if (this.offline) {
        this.emit('onrestart')
      }
      this.offline = false
    } catch (error) {
      setTimeout(async () => {
        await this._initialize()
      }, 5000)
    }
  }

  async start(token) {
    // 组件重新加载时, 如果 socket 存在, 不需要新建
    if (!this.socket) {
      this.socket = new SignalR.HubConnectionBuilder()
        .configureLogging(SignalR.LogLevel.Information)
        .withUrl(
          `/hubs/chathub`, {
            accessTokenFactory: () => token,
            skipNegotiation: true,
            transport: SignalR.HttpTransportType.WebSockets
          }
        )
后面还有 134 行代码,解锁后查看完整代码

24 小时内免费解锁 3 个项目,之后 1 积分/个。 规则说明

AI 解读

登录后可用,每次 10 积分,解读结果公开显示在下面。

还没有人解读过这个文件。