feat: add amqp & web interface

Signed-off-by: MiaoWoo <admin@yumc.pw>
This commit is contained in:
2020-06-20 16:38:14 +08:00
parent 46173ff549
commit 4c0a77ed23
11 changed files with 236 additions and 353 deletions

View File

@ -2,10 +2,10 @@ import i18m from '@ccms/i18n'
import { SourceMapBuilder } from 'source-map-builder'
import * as base64 from 'base64-js'
const Arrays = Java.type('java.util.Arrays');
const Level = Java.type('java.util.logging.Level');
const Paths = Java.type('java.nio.file.Paths');
const ignoreLogPrefix = ['java.', 'net.minecraft.', 'org.bukkit.', 'jdk.nashorn.', 'io.netty.', 'org.spongepowered.'];
const Arrays = Java.type('java.util.Arrays')
const Level = Java.type('java.util.logging.Level')
const Paths = Java.type('java.nio.file.Paths')
const ignoreLogPrefix = ['java.', 'javax.', 'sun.', 'net.minecraft.', 'org.bukkit.', 'jdk.nashorn.', 'io.netty.', 'org.spongepowered.', 'org.apache', 'org.springframework']
enum LogLevel {
ALL,
@ -19,19 +19,19 @@ enum LogLevel {
}
export class MiaoScriptConsole implements Console {
Console: NodeJS.ConsoleConstructor;
Console: NodeJS.ConsoleConstructor
private static sourceMaps: { [key: string]: SourceMapBuilder } = {};
private static sourceFileMaps: { [key: string]: string } = {};
private _name: string = '';
private _level: LogLevel = LogLevel.INFO;
private static sourceMaps: { [key: string]: SourceMapBuilder } = {}
private static sourceFileMaps: { [key: string]: string } = {}
private _name: string = ''
private _level: LogLevel = LogLevel.INFO
protected logger: any;
protected prefix: string = '§6[§bMiaoScript§6]§r ';
protected logger: any
protected prefix: string = '§6[§bMiaoScript§6]§r '
constructor(name?: string) {
this.name = name;
this.logger = global.logger;
this.name = name
this.logger = global.logger
if (global.debug) {
this._level = LogLevel.DEBUG
}
@ -41,36 +41,36 @@ export class MiaoScriptConsole implements Console {
}
get name() {
return this._name;
return this._name
}
set name(name: string) {
if (name) {
this._name = `[${name}] `;
this._name = `[${name}] `
// noinspection JSUnusedGlobalSymbols
this.prefix = `§6[§cMS§6][§b${name}§6]§r `;
this.prefix = `§6[§cMS§6][§b${name}§6]§r `
}
}
log(...args: any[]): void {
this.logger.info(this.name + args.join(' '));
this.logger.info(this.name + args.join(' '))
}
info(...args: any[]) {
this.logger.info(this.name + args.join(' '));
this.logger.info(this.name + args.join(' '))
}
warn(...args: any[]) {
this.logger.warning(this.name + args.join(' '));
this.logger.warning(this.name + args.join(' '))
}
error(...args: any[]) {
this.logger.log(Level.SEVERE, this.name + args.join(' '));
this.logger.log(Level.SEVERE, this.name + args.join(' '))
}
debug(...args: any[]) {
if (global.debug) {
this.logger.info(this.name + '[DEBUG] ' + args.join(' '));
this.logger.info(this.name + '[DEBUG] ' + args.join(' '))
}
}
trace(...args: any[]): void {
if (this._level <= LogLevel.TRACE) {
this.logger.info(this.name + '[TRACE] ' + args.join(' '));
this.logger.info(this.name + '[TRACE] ' + args.join(' '))
}
}
sender(...args) {
@ -95,29 +95,29 @@ export class MiaoScriptConsole implements Console {
if (fileName.endsWith('js')) {
if (MiaoScriptConsole.sourceMaps[fileName] === undefined) {
MiaoScriptConsole.sourceMaps[fileName] = null
let sourceLine = base.read(fileName).split('\n');
let sourceLine = base.read(fileName).split('\n')
let lastLine = sourceLine[sourceLine.length - 1]
if (lastLine.startsWith('//# sourceMappingURL=')) {
let sourceContent = null;
let sourceMappingURL = lastLine.split('sourceMappingURL=', 2)[1];
if (sourceMappingURL.startsWith('data:application/json;base64,')) {
let sourceContent = null
let sourceMappingURL = lastLine.split('sourceMappingURL=', 2)[1]
if (sourceMappingURL.startsWith('data:application/jsonbase64,')) {
sourceContent = String.fromCharCode(...Array.from(base64.toByteArray(sourceMappingURL.split(',', 2)[1])))
} else if (sourceMappingURL.startsWith('http')) {
// TODO
} else {
let file = Paths.get(Paths.get(fileName, '..', sourceMappingURL).toFile().getCanonicalPath()).toFile();
let file = Paths.get(Paths.get(fileName, '..', sourceMappingURL).toFile().getCanonicalPath()).toFile()
if (file.exists()) { sourceContent = base.read(file) }
}
if (sourceContent) {
MiaoScriptConsole.sourceMaps[fileName] = new SourceMapBuilder(JSON.parse(sourceContent))
MiaoScriptConsole.sourceFileMaps[fileName] = Paths.get(fileName, '..', MiaoScriptConsole.sourceMaps[fileName].sources[0]).toFile().getCanonicalPath();
MiaoScriptConsole.sourceFileMaps[fileName] = Paths.get(fileName, '..', MiaoScriptConsole.sourceMaps[fileName].sources[0]).toFile().getCanonicalPath()
}
}
}
if (MiaoScriptConsole.sourceMaps[fileName]) {
let sourceMapping = MiaoScriptConsole.sourceMaps[fileName].getSource(lineNumber, 25, true, true);
let sourceMapping = MiaoScriptConsole.sourceMaps[fileName].getSource(lineNumber, 25, true, true)
fileName = MiaoScriptConsole.sourceFileMaps[fileName]
if (sourceMapping && lineNumber != sourceMapping.mapping.sourceLine) { lineNumber = sourceMapping.mapping.sourceLine; }
if (sourceMapping && lineNumber != sourceMapping.mapping.sourceLine) { lineNumber = sourceMapping.mapping.sourceLine }
}
}
} catch (error) {
@ -129,8 +129,8 @@ export class MiaoScriptConsole implements Console {
}
}
stack(ex: Error, color: boolean = true): string[] {
let stack = ex.getStackTrace();
let cache = [(color ? '§c' : '') + ex];
let stack = ex.getStackTrace()
let cache = [(color ? '§c' : '') + ex]
//@ts-ignore
if (stack.class) {
stack = Arrays.asList(stack)
@ -146,8 +146,8 @@ export class MiaoScriptConsole implements Console {
cache.push(` -> ${fileName}:${lineNumber} => ${trace.methodName}`)
}
} else {
let className = trace.className;
var fileName = trace.fileName as string;
let className = trace.className
var fileName = trace.fileName as string
if (className.startsWith('jdk.nashorn.internal.scripts')) {
className = className.substr(className.lastIndexOf('$') + 1)
var { fileName, lineNumber } = this.readSourceMap(trace.fileName, trace.lineNumber)
@ -155,74 +155,74 @@ export class MiaoScriptConsole implements Console {
} else {
for (let prefix in ignoreLogPrefix) {
if (className.startsWith(ignoreLogPrefix[prefix])) {
return;
return
}
}
}
if (color) {
cache.push(` §e->§c ${className}.${trace.methodName}(§4${fileName}:${lineNumber}§c)`);
cache.push(` §e->§c ${className}.${trace.methodName}(§4${fileName}:${lineNumber}§c)`)
} else {
cache.push(` -> ${className}.${trace.methodName}(${fileName}:${lineNumber})`);
cache.push(` -> ${className}.${trace.methodName}(${fileName}:${lineNumber})`)
}
}
});
return cache;
})
return cache
}
assert(value: any, message?: string, ...optionalParams: any[]): void {
throw new Error("Method not implemented.");
throw new Error("Method not implemented.")
}
clear(): void {
throw new Error("Method not implemented.");
throw new Error("Method not implemented.")
}
count(label?: string): void {
throw new Error("Method not implemented.");
throw new Error("Method not implemented.")
}
countReset(label?: string): void {
throw new Error("Method not implemented.");
throw new Error("Method not implemented.")
}
dir(obj: any, options?: NodeJS.InspectOptions): void {
throw new Error("Method not implemented.");
throw new Error("Method not implemented.")
}
dirxml(...data: any[]): void {
throw new Error("Method not implemented.");
throw new Error("Method not implemented.")
}
group(...label: any[]): void {
throw new Error("Method not implemented.");
throw new Error("Method not implemented.")
}
groupCollapsed(...label: any[]): void {
throw new Error("Method not implemented.");
throw new Error("Method not implemented.")
}
groupEnd(): void {
throw new Error("Method not implemented.");
throw new Error("Method not implemented.")
}
table(tabularData: any, properties?: string[]): void {
throw new Error("Method not implemented.");
throw new Error("Method not implemented.")
}
time(label?: string): void {
throw new Error("Method not implemented.");
throw new Error("Method not implemented.")
}
timeEnd(label?: string): void {
throw new Error("Method not implemented.");
throw new Error("Method not implemented.")
}
timeLog(label?: string, ...data: any[]): void {
throw new Error("Method not implemented.");
throw new Error("Method not implemented.")
}
markTimeline(label?: string): void {
throw new Error("Method not implemented.");
throw new Error("Method not implemented.")
}
profile(label?: string): void {
throw new Error("Method not implemented.");
throw new Error("Method not implemented.")
}
profileEnd(label?: string): void {
throw new Error("Method not implemented.");
throw new Error("Method not implemented.")
}
timeStamp(label?: string): void {
throw new Error("Method not implemented.");
throw new Error("Method not implemented.")
}
timeline(label?: string): void {
throw new Error("Method not implemented.");
throw new Error("Method not implemented.")
}
timelineEnd(label?: string): void {
throw new Error("Method not implemented.");
throw new Error("Method not implemented.")
}
}

View File

@ -0,0 +1,7 @@
export namespace amqp {
export const Manager = Symbol('AmqpManager')
export namespace rabbit {
export const Admin = Symbol('RabbitAdmin')
export const Template = Symbol('RabbitTemplate')
}
}

View File

@ -1,3 +1,5 @@
export * from './web'
export * from './amqp'
export * from './plugin'
export * from './server'
export * from './database'
export * from './database'

View File

@ -2,74 +2,147 @@ export namespace plugin {
/**
* MiaoScript Plugin
*/
export const Plugin = Symbol("Plugin");
export const Plugin = Symbol("Plugin")
/**
* MiaoScript Plugin Folder
*/
export const PluginFolder = Symbol("PluginFolder");
export const PluginFolder = Symbol("PluginFolder")
/**
* Runtime Plugin Instance
*/
export const PluginInstance = Symbol("PluginInstance");
export const PluginInstance = Symbol("PluginInstance")
/**
* MiaoScript Plugin Manager Symbol
*/
export const PluginManager = Symbol("PluginManager");
export const PluginManager = Symbol("PluginManager")
/**
* MiaoScript Plugin Manager Interface
*/
export interface PluginManager {
scan(folder: string): void;
build(): void;
loadFromFile(file: string): Plugin;
load(...args: any[]): void;
enable(...args: any[]): void;
disable(...args: any[]): void;
reload(...args: any[]): void;
getPlugin(name: string): plugin.Plugin;
getPlugins(): Map<string, plugin.Plugin>;
scan(folder: string): void
build(): void
loadFromFile(file: string, scanner?: plugin.PluginScanner): Plugin
load(...args: any[]): void
enable(...args: any[]): void
disable(...args: any[]): void
reload(...args: any[]): void
getPlugin(name: string): plugin.Plugin
getPlugins(): Map<string, plugin.Plugin>
}
export const PluginScanner = Symbol("PluginScanner")
/**
* 插件扫描器
*/
export interface PluginScanner {
/**
* 扫描器类型
*/
type: string
/**
* 扫描插件 返回插件加载列表
* @param target 扫描目标
*/
scan(target: any): string[]
/**
* 加载扫描到的目标
* @param target 加载目标
*/
load(target: any): any
}
export const PluginLoader = Symbol("PluginLoader")
/**
* 插件加载器
*/
export interface PluginLoader {
/**
* 加载器类型
*/
type: string
/**
* 加载插件 获取元数据
* @param target 加载目标
* @param result 扫描器加载的结果
*/
require(target: any, result: any): PluginMetadata
/**
* 构建插件
* @param metadata 插件元信息
*/
build(metadata: any): Plugin
/**
* Load 阶段
* @param plugin 插件
*/
load(plugin: Plugin): void
/**
* Enable 阶段
* @param plugin 插件
*/
enable(plugin: Plugin): void
/**
* Disable 阶段
* @param plugin 插件
*/
disable(plugin: Plugin): void
/**
* Reload 阶段
* @param plugin 插件
*/
reload(plugin: Plugin): void
}
export interface Plugin {
description: PluginMetadata;
logger: Console;
load(): void;
enable(): void;
disable(): void;
description: PluginMetadata
logger: Console
load(): void
enable(): void
disable(): void
}
interface BaseMetadata {
export interface BaseMetadata {
/**
* 名称 为空则为对象名称
*/
name?: string;
name?: string
/**
* 支持的服务器列表 为空则代表所有
*/
servers?: string[];
servers?: string[]
}
export interface PluginMetadata extends BaseMetadata {
/**
* 插件名称
*/
name: string;
name: string
/**
* 前缀
*/
prefix?: string;
prefix?: string
/**
* 插件版本
*/
version: string;
version: string
/**
* 插件版本
*/
author: string | string[];
author: string | string[]
/**
* 插件源文件 必须指定为 __filename
*/
source: string;
source: string
/**
* 插件类型 默认为 ioc 执行 MiaoScript 加载逻辑
*/
type?: string
/**
* 插件扫描器
*/
scanner?: PluginScanner
/**
* 插件加载器
*/
loader?: PluginLoader
/**
* 插件本体
*/
target?: any;
target?: any
}
}

View File

@ -38,7 +38,7 @@ export namespace server {
getNettyPipeline(): any
getRootLogger(): any
sendJson(sender: string | any, json: object | string): void
tabComplete?(sender: string | any, input: string, index?: number)
tabComplete?(sender: string | any, input: string, index?: number): string[]
}
@injectable()
export abstract class ReflectServer implements server.Server {
@ -88,7 +88,7 @@ export namespace server {
sendJson(sender: any, json: string | object): void {
throw new Error("Method not implemented.")
}
tabComplete?(sender: any, input: string, index?: number) {
tabComplete?(sender: any, input: string, index?: number): string[] {
throw new Error("Method not implemented.")
}
protected reflect() {

View File

@ -0,0 +1,3 @@
export namespace web {
export const Server = Symbol('Server')
}