/************************************************************************ * Copyright (c) 2023 sunking framework * Author : Shao * Mail : yi-shaoye@163.com * Date : 2021-10-28 * Use : 网络模块 ************************************************************************/ import myLogger from '@wingyi8/sk-logger'; const logger = myLogger.getLogger('sunking'); import fs from 'fs'; import * as util from 'util'; import { BaseClient } from './base/BaseClient'; import { BaseConnector } from './base/BaseConnector'; import { WsClient } from './client/WsClient'; import { HttpConnector } from './http/HttpConnector'; import { WsConnector } from './ws/WsConnector'; import { ConnectorOptions } from './util/define'; /** * 服务器配置 */ var appConfig: ConnectorOptions[] = []; /** * 扩展配置回调 */ var cfgExtend: Function[] = []; /** * 服务器扩展配置 */ var appExtend: Map = new Map(); /** * 网络模块对象 */ var serverAry = new Map(); /** * 配置各个功能模块 * @param {String} name 功能模块名字 * @param {String|Function} opts 配置文件路径 或 配置回调函数 */ export function configure(config: string | ConnectorOptions[]) { if (typeof config === 'string') { appConfig = JSON.parse(fs.readFileSync(config, "utf8")); } else { appConfig = config; } } /** * 扩展配置 * @param name 模块名字 * @param opts 配置文件路径 或 配置回调函数 */ export function extendConfigure(opts: Function) { // 扩展配置 if (typeof opts === 'function') { cfgExtend.push(opts); } }; /** * 服务器扩展配置 * @param name 模块名字 * @param opts 配置文件路径 或 配置回调函数 */ export function serverConfigure(name: string, opts: Function) { if (!appExtend.has(name)) { appExtend.set(name, []); }; appExtend.get(name).push(opts); }; /** * 开启服务器 */ export async function start() { try { // 配置扩展接口 for (let extend of cfgExtend) { await extend(); } // 创建网络连接 for (let serCfg of appConfig) { let name = serCfg.name; let type = serCfg.type; // 初始化网络模块 let server = createConnector(name, type); if (!server) { logger.error(`创建网络模块为空! ${name} ${type}`); return Promise.reject(`创建网络模块为空! ${name} ${type}`); } await server.configure(serCfg); await server.start(); serverAry.set(name, server); // 配置扩展接口 let extend: Function[] = []; if (appExtend.has(name)) { extend = appExtend.get(name); }; if (extend.length > 0) { for (let cb of extend) { await cb(); } } server.show(); } } catch (error) { logger.error(error); } }; /** * 创建服务器 * @param type 服务器类型 */ function createConnector(name: string, type: string): BaseConnector | BaseClient { switch (type) { case 'ws': case 'wss': return new WsConnector(); case 'http': case 'https': return new HttpConnector(); case 'wsClient': case 'wssClient': return new WsClient(); default: logger.error(`创建服务器失败 [${name}] type [${type}]`); return null; } } /** * 获取服务器实例 */ export function server(name: string): BaseConnector | BaseClient { return serverAry.get(name); }; /** * 关闭服务器 */ export function stop() { serverAry.forEach((server: BaseConnector) => { server.stop(); }); serverAry.clear(); }; /** * 捕获异常 */ process.on('uncaughtException', function (err) { if (logger) { logger.error('未知异常: %s', err.stack); } else { console.error('未知异常: ' + err.stack); } let d = new Date(); let time = util.format('%d-%d-%d-%d-%d-%d', d.getFullYear(), d.getMonth() + 1, d.getDate(), d.getHours(), d.getMinutes(), d.getSeconds()); let str = util.format('%s 未知异常: %s\n', time, err.stack); if (!fs.existsSync('./logs')) { //不存在就创建一个 fs.mkdirSync('./logs', '0755') } fs.appendFile("logs/uncaughtException.log", str, () => { }); });