| import template from 'express-art-template' |
| import { resolve } from 'node:path' |
| import util from 'node:util' |
| import url from 'node:url' |
| import lodash from 'lodash' |
|
|
| class applicationHandle { |
| constructor () { |
| this._events = {} |
| this.handlers = ['WebSocketMethod', 'setViewEngine'] |
| } |
|
|
| Handle (app) { |
| this.handlers.forEach(handler => this[handler](app)) |
| return this |
| } |
|
|
| WebSocketMethod (app) { |
| app.ws = (route, ...middlewares) => { |
| let path = route |
| if (typeof route == 'function') { |
| path = '/' |
| middlewares = [route, ...middlewares] |
| } |
| if (middlewares.length == 1 && util.isArray(middlewares[0])) { |
| middlewares = middlewares[0] |
| } |
| middlewares.forEach((middleware, idx) => { |
| let fn = (socket, request, next) => { |
| if (request.ws) { |
| 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() |
| } |
| } |
| |
| this.add(this.WebSocketUrl(path), fn, idx) |
| }) |
| return app |
| } |
| } |
|
|
| setViewEngine (app) { |
| app.engine('html', template) |
| app.set('views', resolve('public')) |
| app.set('view engine', 'html') |
| app.set('x-powered-by', false) |
| } |
|
|
| WebSocketUrl (url) { |
| if (url?.includes('?')) { |
| let [baseUrl, query] = url.split('?') |
| return `${baseUrl.replace(/\/$/, '')}.websocket?${query}` |
| } |
| return `${url.replace(/\/$/, '')}.websocket` |
| } |
|
|
| add (event, fn, id = 0) { |
| if (!event || !fn) { |
| return false |
| } |
| this.del(event, id) |
| this._events[event] = this._events[event] || [] |
| this._events[event].push({ fn, id }) |
| return true |
| } |
|
|
| del (event, id = 0) { |
| if (!this._events[event]) { |
| return false |
| } else if (id == 'all') { |
| delete this._events[event] |
| return true |
| } else { |
| let idx = this._events[event].findIndex(v => v.id == id) |
| if (idx) { |
| this._events[event].splice(idx, 1) |
| return true |
| } |
| } |
| } |
|
|
| async call (key, args, callback) { |
| if (!this._events[key]) { |
| callback(false) |
| return false |
| } |
| let ret |
| for (let event of this._events[key]) { |
| let fn = event.fn |
| let done = true |
| let reject = (msg = '') => { |
| if (msg) { |
| logger.error(new Error(msg)) |
| return |
| } |
| done = false |
| } |
| ret = fn(...args, reject) |
| if (util.types.isPromise(ret)) { |
| ret = await ret |
| } |
| if (done) { |
| callback(ret) |
| return ret |
| } |
| } |
| callback(ret) |
| return ret |
| } |
|
|
| has (key) { |
| return !!this._events[key] |
| } |
| } |
|
|
| export default new applicationHandle() |