File size: 1,056 Bytes
ba2906a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import url from 'node:url'
import { modifyUrl } from '../service/util.js'

export default new class WebSocketMethod {
  handle ({ app, handler }) {
    app.ws = (route, ...middlewares) => {
      let path = route
      if (typeof route == 'function') {
        path = '/'
        middlewares = [route, ...middlewares]
      }
      if (middlewares.length == 1 && Array.isArray(middlewares[0])) {
        middlewares = middlewares[0]
      }
      middlewares.forEach(this.middlewareEach.bind({ handler, path }))
      return app
    }
  }

  middlewareEach (middleware, idx) {
    let fn = (socket, request, next) => {
      if (request.ws) {
        /* eslint-disable n/no-deprecated-api */
        let urlObj = url.parse(request.url, true)
        request.query = urlObj.query
        request.wsHandled = true
        try {
          middleware(socket, request, next)
        } catch (err) {
          next(err)
        }
      } else {
        next()
      }
    }
    /** 不走app.handle */
    this.handler.add(modifyUrl(this.path), fn, idx)
  }
}()