Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2589633069 | |||
| bc17e2f376 | |||
| 20749d3381 | |||
| 6261b85413 | |||
| da9d590374 | |||
| 0af3ca8c79 | |||
| 561d5b60e8 | |||
| 878a5368af | |||
| 018b972aea | |||
| 4138cf9448 | |||
| 646176b43c | |||
| 506184a104 | |||
| 392f01d509 | |||
| 75b892e1c0 | |||
| c2d825eed0 |
@@ -21,3 +21,4 @@ wallaby.js
|
|||||||
.theia
|
.theia
|
||||||
type_definitions
|
type_definitions
|
||||||
tsconfig.tsbuildinfo
|
tsconfig.tsbuildinfo
|
||||||
|
*.tsbuildinfo
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"version": "0.8.2",
|
"version": "0.8.4",
|
||||||
"useWorkspaces": true,
|
"useWorkspaces": true,
|
||||||
"npmClient": "yarn",
|
"npmClient": "yarn",
|
||||||
"packages": [
|
"packages": [
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ccms/amqp",
|
"name": "@ccms/amqp",
|
||||||
"version": "0.8.2",
|
"version": "0.8.4",
|
||||||
"description": "MiaoScript amqp package",
|
"description": "MiaoScript amqp package",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"miaoscript",
|
"miaoscript",
|
||||||
@@ -19,17 +19,17 @@
|
|||||||
"test": "echo \"Error: run tests from root\" && exit 1"
|
"test": "echo \"Error: run tests from root\" && exit 1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ccms/api": "^0.8.2",
|
"@ccms/api": "^0.8.4",
|
||||||
"@ccms/common": "^0.8.2",
|
"@ccms/common": "^0.8.4",
|
||||||
"@ccms/container": "^0.8.2"
|
"@ccms/container": "^0.8.4"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@ccms/nashorn": "^0.8.2",
|
"@ccms/nashorn": "^0.8.4",
|
||||||
"@javatypes/amqp-client": "^0.0.2",
|
"@javatypes/amqp-client": "^0.0.2",
|
||||||
"@javatypes/spring-amqp": "^0.0.2",
|
"@javatypes/spring-amqp": "^0.0.2",
|
||||||
"@javatypes/spring-rabbit": "^0.0.2",
|
"@javatypes/spring-rabbit": "^0.0.2",
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"typescript": "^3.9.5"
|
"typescript": "^3.9.6"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ccms/api",
|
"name": "@ccms/api",
|
||||||
"version": "0.8.2",
|
"version": "0.8.4",
|
||||||
"description": "MiaoScript api package",
|
"description": "MiaoScript api package",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"miaoscript",
|
"miaoscript",
|
||||||
@@ -19,9 +19,9 @@
|
|||||||
"test": "echo \"Error: run tests from root\" && exit 1"
|
"test": "echo \"Error: run tests from root\" && exit 1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ccms/common": "^0.8.2",
|
"@ccms/common": "^0.8.4",
|
||||||
"@ccms/container": "^0.8.2",
|
"@ccms/container": "^0.8.4",
|
||||||
"@ccms/ployfill": "^0.8.2",
|
"@ccms/ployfill": "^0.8.4",
|
||||||
"base64-js": "^1.3.1",
|
"base64-js": "^1.3.1",
|
||||||
"source-map-builder": "^0.0.7"
|
"source-map-builder": "^0.0.7"
|
||||||
},
|
},
|
||||||
@@ -29,6 +29,6 @@
|
|||||||
"@types/base64-js": "^1.3.0",
|
"@types/base64-js": "^1.3.0",
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"typescript": "^3.9.5"
|
"typescript": "^3.9.6"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -152,21 +152,21 @@ export namespace plugin {
|
|||||||
}
|
}
|
||||||
export interface PluginMetadata extends BaseMetadata {
|
export interface PluginMetadata extends BaseMetadata {
|
||||||
/**
|
/**
|
||||||
* 插件名称
|
* 插件名称 不填默认为类名
|
||||||
*/
|
*/
|
||||||
name: string
|
name?: string
|
||||||
/**
|
/**
|
||||||
* 前缀
|
* 前缀
|
||||||
*/
|
*/
|
||||||
prefix?: string
|
prefix?: string
|
||||||
/**
|
/**
|
||||||
* 插件版本
|
* 插件版本 不填默认为 1.0.0
|
||||||
*/
|
*/
|
||||||
version: string
|
version?: string
|
||||||
/**
|
/**
|
||||||
* 插件版本
|
* 插件作者 不填默认为 Unknow
|
||||||
*/
|
*/
|
||||||
author: string | string[]
|
author?: string | string[]
|
||||||
/**
|
/**
|
||||||
* 插件源文件 必须指定为 __filename
|
* 插件源文件 必须指定为 __filename
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import * as reflect from '@ccms/common/dist/reflect'
|
import * as reflect from '@ccms/common/dist/reflect'
|
||||||
import { injectable } from '@ccms/container'
|
import { injectable, inject } from '@ccms/container'
|
||||||
|
|
||||||
import { NativePluginManager } from './native_plugin'
|
import { NativePluginManager } from './native_plugin'
|
||||||
import { constants } from '../../constants'
|
import { constants } from '../../constants'
|
||||||
@@ -41,6 +41,23 @@ export namespace server {
|
|||||||
tabComplete?(sender: string | any, input: string, index?: number): string[]
|
tabComplete?(sender: string | any, input: string, index?: number): string[]
|
||||||
}
|
}
|
||||||
@injectable()
|
@injectable()
|
||||||
|
export class ServerChecker {
|
||||||
|
@inject(ServerType)
|
||||||
|
private serverType: string
|
||||||
|
check(servers: string[]) {
|
||||||
|
// Not set servers -> allow
|
||||||
|
if (!servers || !servers.length) return true
|
||||||
|
// include !type -> deny
|
||||||
|
let denyServers = servers.filter(svr => svr.startsWith("!"))
|
||||||
|
if (denyServers.length !== 0) {
|
||||||
|
return !denyServers.includes(`!${this.serverType}`)
|
||||||
|
} else {
|
||||||
|
// only include -> allow
|
||||||
|
return servers.includes(this.serverType)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@injectable()
|
||||||
export abstract class ReflectServer implements server.Server {
|
export abstract class ReflectServer implements server.Server {
|
||||||
protected pipeline: any
|
protected pipeline: any
|
||||||
protected rootLogger: any
|
protected rootLogger: any
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ccms/bukkit",
|
"name": "@ccms/bukkit",
|
||||||
"version": "0.8.2",
|
"version": "0.8.4",
|
||||||
"description": "MiaoScript bukkit package",
|
"description": "MiaoScript bukkit package",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"miaoscript",
|
"miaoscript",
|
||||||
@@ -22,11 +22,11 @@
|
|||||||
"@javatypes/spigot-api": "^0.0.2",
|
"@javatypes/spigot-api": "^0.0.2",
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"typescript": "^3.9.5"
|
"typescript": "^3.9.6"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ccms/api": "^0.8.2",
|
"@ccms/api": "^0.8.4",
|
||||||
"@ccms/common": "^0.8.2",
|
"@ccms/common": "^0.8.4",
|
||||||
"@ccms/container": "^0.8.2"
|
"@ccms/container": "^0.8.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,18 +8,30 @@ const Messenger = Bukkit.getMessenger()
|
|||||||
@provideSingleton(channel.Channel)
|
@provideSingleton(channel.Channel)
|
||||||
export class BukkitChannel extends channel.Channel {
|
export class BukkitChannel extends channel.Channel {
|
||||||
@inject(plugin.PluginInstance)
|
@inject(plugin.PluginInstance)
|
||||||
private pluginInstance: any;
|
private pluginInstance: any
|
||||||
|
|
||||||
send(player: any, channel: string, data: any) {
|
/**
|
||||||
player.sendPluginMessage(this.pluginInstance, channel, data);
|
* 给玩家发送通道消息
|
||||||
|
* @param player 接受消息的玩家
|
||||||
|
* @param channel 通道
|
||||||
|
* @param data 数据
|
||||||
|
*/
|
||||||
|
send(player: any, channel: string, data: number[]) {
|
||||||
|
player.sendPluginMessage(this.pluginInstance, channel, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注册通道监听器
|
||||||
|
* @param channel 通道
|
||||||
|
* @param listener 监听器
|
||||||
|
*/
|
||||||
register(channel: string, listener: channel.ChannelListener) {
|
register(channel: string, listener: channel.ChannelListener) {
|
||||||
Messenger.registerIncomingPluginChannel(this.pluginInstance, channel, new PluginMessageListener({
|
Messenger.registerIncomingPluginChannel(this.pluginInstance, channel, new PluginMessageListener({
|
||||||
onPluginMessageReceived: (/**String */ channel, /**Player */ player, /**byte[] */data) => {
|
onPluginMessageReceived: (/**String */ channel, /**Player */ player, /**byte[] */data) => {
|
||||||
listener(data, { channel, player, data })
|
listener(data, { channel, player, data })
|
||||||
}
|
}
|
||||||
}));
|
}))
|
||||||
Messenger.registerOutgoingPluginChannel(this.pluginInstance, channel);
|
Messenger.registerOutgoingPluginChannel(this.pluginInstance, channel)
|
||||||
}
|
}
|
||||||
unregister(channel: string, listener: any) {
|
unregister(channel: string, listener: any) {
|
||||||
Messenger.unregisterIncomingPluginChannel(this.pluginInstance, channel)
|
Messenger.unregisterIncomingPluginChannel(this.pluginInstance, channel)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ccms/bungee",
|
"name": "@ccms/bungee",
|
||||||
"version": "0.8.2",
|
"version": "0.8.4",
|
||||||
"description": "MiaoScript bungee package",
|
"description": "MiaoScript bungee package",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"miaoscript",
|
"miaoscript",
|
||||||
@@ -22,11 +22,11 @@
|
|||||||
"@javatypes/bungee-api": "^0.0.2",
|
"@javatypes/bungee-api": "^0.0.2",
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"typescript": "^3.9.5"
|
"typescript": "^3.9.6"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ccms/api": "^0.8.2",
|
"@ccms/api": "^0.8.4",
|
||||||
"@ccms/common": "^0.8.2",
|
"@ccms/common": "^0.8.4",
|
||||||
"@ccms/container": "^0.8.2"
|
"@ccms/container": "^0.8.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"private": true,
|
"private": true,
|
||||||
"name": "@ccms/client",
|
"name": "@ccms/client",
|
||||||
"version": "0.8.2",
|
"version": "0.8.3",
|
||||||
"description": "MiaoScript client package",
|
"description": "MiaoScript client package",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"miaoscript",
|
"miaoscript",
|
||||||
@@ -26,6 +26,6 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"typescript": "^3.9.5"
|
"typescript": "^3.9.6"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ccms/common",
|
"name": "@ccms/common",
|
||||||
"version": "0.8.2",
|
"version": "0.8.4",
|
||||||
"description": "MiaoScript api package",
|
"description": "MiaoScript api package",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"miaoscript",
|
"miaoscript",
|
||||||
@@ -19,11 +19,11 @@
|
|||||||
"test": "echo \"Error: run tests from root\" && exit 1"
|
"test": "echo \"Error: run tests from root\" && exit 1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@ccms/nashorn": "^0.8.2",
|
"@ccms/nashorn": "^0.8.4",
|
||||||
"@javatypes/jdk": "^0.0.2",
|
"@javatypes/jdk": "^0.0.2",
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"typescript": "^3.9.5"
|
"typescript": "^3.9.6"
|
||||||
},
|
},
|
||||||
"gitHead": "562e2d00175c9d3a99c8b672aa07e6d92706a027"
|
"gitHead": "562e2d00175c9d3a99c8b672aa07e6d92706a027"
|
||||||
}
|
}
|
||||||
|
|||||||
1243
packages/common/src/qrcode.ts
Normal file
1243
packages/common/src/qrcode.ts
Normal file
File diff suppressed because it is too large
Load Diff
@@ -96,10 +96,7 @@ function types(values: any[], def?: any) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function accessible<T extends java.lang.reflect.AccessibleObject>(accessible: T): T {
|
function accessible<T extends java.lang.reflect.AccessibleObject>(accessible: T): T {
|
||||||
if (accessible === null) {
|
if (!accessible?.isAccessible()) {
|
||||||
return null
|
|
||||||
}
|
|
||||||
if (!accessible.isAccessible()) {
|
|
||||||
accessible.setAccessible(true)
|
accessible.setAccessible(true)
|
||||||
}
|
}
|
||||||
return accessible
|
return accessible
|
||||||
@@ -143,7 +140,8 @@ function declaredMethod(clazz: java.lang.Class<any>, name: string, ...clazzs: ja
|
|||||||
let key = clazz.getName() + '.' + name + ':' + (clazzs || []).join(':')
|
let key = clazz.getName() + '.' + name + ':' + (clazzs || []).join(':')
|
||||||
if (!methodCache[key]) {
|
if (!methodCache[key]) {
|
||||||
try {
|
try {
|
||||||
methodCache[key] = clazz.getMethod(name, ...clazzs)
|
// @ts-ignore
|
||||||
|
methodCache[key] = clazz.getMethod(name, clazzs)
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
try {
|
try {
|
||||||
methodCache[key] = clazz.getDeclaredMethod(name, clazzs as any)
|
methodCache[key] = clazz.getDeclaredMethod(name, clazzs as any)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ccms/compile",
|
"name": "@ccms/compile",
|
||||||
"version": "0.8.2",
|
"version": "0.8.3",
|
||||||
"description": "MiaoScript compile package",
|
"description": "MiaoScript compile package",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"miaoscript",
|
"miaoscript",
|
||||||
@@ -21,6 +21,6 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"typescript": "^3.9.5"
|
"typescript": "^3.9.6"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ccms/container",
|
"name": "@ccms/container",
|
||||||
"version": "0.8.2",
|
"version": "0.8.4",
|
||||||
"description": "MiaoScript container package",
|
"description": "MiaoScript container package",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"miaoscript",
|
"miaoscript",
|
||||||
@@ -19,10 +19,10 @@
|
|||||||
"test": "echo \"Error: run tests from root\" && exit 1"
|
"test": "echo \"Error: run tests from root\" && exit 1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@ccms/nashorn": "^0.8.2",
|
"@ccms/nashorn": "^0.8.4",
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"typescript": "^3.9.5"
|
"typescript": "^3.9.6"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"inversify": "^5.0.1",
|
"inversify": "^5.0.1",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ccms/core",
|
"name": "@ccms/core",
|
||||||
"version": "0.8.2",
|
"version": "0.8.4",
|
||||||
"description": "MiaoScript api package",
|
"description": "MiaoScript api package",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"miaoscript",
|
"miaoscript",
|
||||||
@@ -21,11 +21,11 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"typescript": "^3.9.5"
|
"typescript": "^3.9.6"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ccms/api": "^0.8.2",
|
"@ccms/api": "^0.8.4",
|
||||||
"@ccms/container": "^0.8.2"
|
"@ccms/container": "^0.8.4"
|
||||||
},
|
},
|
||||||
"gitHead": "781524f83e52cad26d7c480513e3c525df867121"
|
"gitHead": "781524f83e52cad26d7c480513e3c525df867121"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -97,6 +97,7 @@ function initialize() {
|
|||||||
let type = detectServer()
|
let type = detectServer()
|
||||||
console.i18n("ms.core.initialize.detect", { scope: global.scope, type })
|
console.i18n("ms.core.initialize.detect", { scope: global.scope, type })
|
||||||
container.bind(server.ServerType).toConstantValue(type)
|
container.bind(server.ServerType).toConstantValue(type)
|
||||||
|
container.bind(server.ServerChecker).toSelf().inSingletonScope()
|
||||||
console.i18n("ms.core.package.initialize", { scope: global.scope, type })
|
console.i18n("ms.core.package.initialize", { scope: global.scope, type })
|
||||||
require(`${global.scope}/${type}`).default(container)
|
require(`${global.scope}/${type}`).default(container)
|
||||||
require(`${global.scope}/plugin`)
|
require(`${global.scope}/plugin`)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ccms/database",
|
"name": "@ccms/database",
|
||||||
"version": "0.8.2",
|
"version": "0.8.4",
|
||||||
"description": "MiaoScript database package",
|
"description": "MiaoScript database package",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"miaoscript",
|
"miaoscript",
|
||||||
@@ -22,10 +22,10 @@
|
|||||||
"@javatypes/spring-jdbc": "^0.0.2",
|
"@javatypes/spring-jdbc": "^0.0.2",
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"typescript": "^3.9.5"
|
"typescript": "^3.9.6"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ccms/api": "^0.8.2",
|
"@ccms/api": "^0.8.4",
|
||||||
"@ccms/container": "^0.8.2"
|
"@ccms/container": "^0.8.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ccms/i18n",
|
"name": "@ccms/i18n",
|
||||||
"version": "0.8.2",
|
"version": "0.8.4",
|
||||||
"description": "MiaoScript i18n package",
|
"description": "MiaoScript i18n package",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"miaoscript",
|
"miaoscript",
|
||||||
@@ -19,11 +19,11 @@
|
|||||||
"test": "echo \"Error: run tests from root\" && exit 1"
|
"test": "echo \"Error: run tests from root\" && exit 1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@ccms/nashorn": "^0.8.2",
|
"@ccms/nashorn": "^0.8.4",
|
||||||
"@types/js-yaml": "^3.12.5",
|
"@types/js-yaml": "^3.12.5",
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"typescript": "^3.9.5"
|
"typescript": "^3.9.6"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"js-yaml": "^3.14.0"
|
"js-yaml": "^3.14.0"
|
||||||
|
|||||||
35
packages/keyvalue/package.json
Normal file
35
packages/keyvalue/package.json
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
{
|
||||||
|
"name": "@ccms/keyvalue",
|
||||||
|
"version": "0.8.4",
|
||||||
|
"description": "MiaoScript keyvalue package",
|
||||||
|
"keywords": [
|
||||||
|
"miaoscript",
|
||||||
|
"minecraft",
|
||||||
|
"bukkit",
|
||||||
|
"sponge"
|
||||||
|
],
|
||||||
|
"author": "MiaoWoo <admin@yumc.pw>",
|
||||||
|
"homepage": "https://github.com/circlecloud/ms.git",
|
||||||
|
"license": "ISC",
|
||||||
|
"main": "dist/index.js",
|
||||||
|
"scripts": {
|
||||||
|
"clean": "rimraf dist",
|
||||||
|
"watch": "tsc --watch",
|
||||||
|
"build": "yarn clean && tsc",
|
||||||
|
"test": "echo \"Error: run tests from root\" && exit 1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@ccms/api": "^0.8.4",
|
||||||
|
"@ccms/common": "^0.8.4",
|
||||||
|
"@ccms/container": "^0.8.4"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@ccms/nashorn": "^0.8.4",
|
||||||
|
"@javatypes/amqp-client": "^0.0.2",
|
||||||
|
"@javatypes/spring-amqp": "^0.0.2",
|
||||||
|
"@javatypes/spring-rabbit": "^0.0.2",
|
||||||
|
"reflect-metadata": "^0.1.13",
|
||||||
|
"rimraf": "^3.0.2",
|
||||||
|
"typescript": "^3.9.6"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ccms/nashorn",
|
"name": "@ccms/nashorn",
|
||||||
"version": "0.8.2",
|
"version": "0.8.4",
|
||||||
"description": "MiaoScript api package",
|
"description": "MiaoScript api package",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"miaoscript",
|
"miaoscript",
|
||||||
@@ -22,6 +22,6 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"typescript": "^3.9.5"
|
"typescript": "^3.9.6"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ declare global {
|
|||||||
interface Console {
|
interface Console {
|
||||||
ex(err: Error): void
|
ex(err: Error): void
|
||||||
stack(err: Error, color?: boolean): string[]
|
stack(err: Error, color?: boolean): string[]
|
||||||
|
sender(sender: any, ...args: any): void
|
||||||
sender(...args: any): void
|
sender(...args: any): void
|
||||||
console(...args: any): void
|
console(...args: any): void
|
||||||
i18n(name: string, ...params: any[]): void
|
i18n(name: string, ...params: any[]): void
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ccms/nodejs",
|
"name": "@ccms/nodejs",
|
||||||
"version": "0.8.2",
|
"version": "0.8.4",
|
||||||
"description": "MiaoScript nodejs package",
|
"description": "MiaoScript nodejs package",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"miaoscript",
|
"miaoscript",
|
||||||
@@ -19,10 +19,10 @@
|
|||||||
"test": "echo \"Error: run tests from root\" && exit 1"
|
"test": "echo \"Error: run tests from root\" && exit 1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@ccms/nashorn": "^0.8.2",
|
"@ccms/nashorn": "^0.8.4",
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"typescript": "^3.9.5"
|
"typescript": "^3.9.6"
|
||||||
},
|
},
|
||||||
"gitHead": "781524f83e52cad26d7c480513e3c525df867121"
|
"gitHead": "781524f83e52cad26d7c480513e3c525df867121"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ccms/nukkit",
|
"name": "@ccms/nukkit",
|
||||||
"version": "0.8.2",
|
"version": "0.8.4",
|
||||||
"description": "MiaoScript nukkit package",
|
"description": "MiaoScript nukkit package",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"miaoscript",
|
"miaoscript",
|
||||||
@@ -22,11 +22,11 @@
|
|||||||
"@javatypes/nukkit-api": "^0.0.2",
|
"@javatypes/nukkit-api": "^0.0.2",
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"typescript": "^3.9.5"
|
"typescript": "^3.9.6"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ccms/api": "^0.8.2",
|
"@ccms/api": "^0.8.4",
|
||||||
"@ccms/common": "^0.8.2",
|
"@ccms/common": "^0.8.4",
|
||||||
"@ccms/container": "^0.8.2"
|
"@ccms/container": "^0.8.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ccms/ployfill",
|
"name": "@ccms/ployfill",
|
||||||
"version": "0.8.2",
|
"version": "0.8.4",
|
||||||
"description": "MiaoScript ployfill package",
|
"description": "MiaoScript ployfill package",
|
||||||
"author": "MiaoWoo <admin@yumc.pw>",
|
"author": "MiaoWoo <admin@yumc.pw>",
|
||||||
"homepage": "https://github.com/circlecloud/ms.git",
|
"homepage": "https://github.com/circlecloud/ms.git",
|
||||||
@@ -14,14 +14,14 @@
|
|||||||
"test": "echo \"Error: run tests from root\" && exit 1"
|
"test": "echo \"Error: run tests from root\" && exit 1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ccms/i18n": "^0.8.2",
|
"@ccms/i18n": "^0.8.4",
|
||||||
"@ccms/nodejs": "^0.8.2",
|
"@ccms/nodejs": "^0.8.4",
|
||||||
"core-js": "^3.6.5"
|
"core-js": "^3.6.5"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@ccms/nashorn": "^0.8.2",
|
"@ccms/nashorn": "^0.8.4",
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"typescript": "^3.9.5"
|
"typescript": "^3.9.6"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ccms/plugin",
|
"name": "@ccms/plugin",
|
||||||
"version": "0.8.2",
|
"version": "0.8.4",
|
||||||
"description": "MiaoScript api package",
|
"description": "MiaoScript api package",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"miaoscript",
|
"miaoscript",
|
||||||
@@ -22,13 +22,13 @@
|
|||||||
"@types/js-yaml": "^3.12.5",
|
"@types/js-yaml": "^3.12.5",
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"typescript": "^3.9.5"
|
"typescript": "^3.9.6"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ccms/api": "^0.8.2",
|
"@ccms/api": "^0.8.4",
|
||||||
"@ccms/common": "^0.8.2",
|
"@ccms/common": "^0.8.4",
|
||||||
"@ccms/container": "^0.8.2",
|
"@ccms/container": "^0.8.4",
|
||||||
"@ccms/i18n": "^0.8.2",
|
"@ccms/i18n": "^0.8.4",
|
||||||
"js-yaml": "^3.14.0"
|
"js-yaml": "^3.14.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
36
packages/plugin/src/command.ts
Normal file
36
packages/plugin/src/command.ts
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
import { command, plugin, server } from '@ccms/api'
|
||||||
|
import { provideSingleton, postConstruct, inject } from '@ccms/container'
|
||||||
|
import { getPluginCommandMetadata, getPluginTabCompleterMetadata } from './utils'
|
||||||
|
|
||||||
|
@provideSingleton(PluginCommandManager)
|
||||||
|
export class PluginCommandManager {
|
||||||
|
@inject(server.ServerChecker)
|
||||||
|
private ServerChecker: server.ServerChecker
|
||||||
|
@inject(command.Command)
|
||||||
|
private CommandManager: command.Command
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
process.on('plugin.before.enable', (plugin: plugin.Plugin) => this.registryCommand(plugin))
|
||||||
|
process.on('plugin.after.disable', (plugin: plugin.Plugin) => this.unregistryCommand(plugin))
|
||||||
|
}
|
||||||
|
|
||||||
|
private registryCommand(pluginInstance: plugin.Plugin) {
|
||||||
|
let cmds = getPluginCommandMetadata(pluginInstance)
|
||||||
|
let tabs = getPluginTabCompleterMetadata(pluginInstance)
|
||||||
|
for (const [_, cmd] of cmds) {
|
||||||
|
let tab = tabs.get(cmd.name)
|
||||||
|
if (!this.ServerChecker.check(cmd.servers)) { continue }
|
||||||
|
this.CommandManager.on(pluginInstance, cmd.name, {
|
||||||
|
cmd: pluginInstance[cmd.executor].bind(pluginInstance),
|
||||||
|
tab: tab ? pluginInstance[tab.executor].bind(pluginInstance) : undefined
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private unregistryCommand(pluginInstance: plugin.Plugin) {
|
||||||
|
let cmds = getPluginCommandMetadata(pluginInstance)
|
||||||
|
cmds.forEach(cmd => {
|
||||||
|
this.CommandManager.off(pluginInstance, cmd.name)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,33 +1,75 @@
|
|||||||
import * as yaml from 'js-yaml'
|
import * as yaml from 'js-yaml'
|
||||||
|
import * as fs from '@ccms/common/dist/fs'
|
||||||
|
import { plugin } from '@ccms/api'
|
||||||
|
import { getPluginConfigMetadata } from './utils'
|
||||||
|
|
||||||
export interface PluginConfigLoader {
|
export interface PluginConfigLoader {
|
||||||
load(content: string): any;
|
load(content: string): any
|
||||||
dump(variable: any): string;
|
dump(variable: any): string
|
||||||
}
|
}
|
||||||
|
|
||||||
export class YamlPluginConfig implements PluginConfigLoader {
|
export class YamlPluginConfig implements PluginConfigLoader {
|
||||||
load(content: string) {
|
load(content: string) {
|
||||||
return yaml.safeLoad(content);
|
return yaml.safeLoad(content)
|
||||||
}
|
}
|
||||||
dump(variable: any): string {
|
dump(variable: any): string {
|
||||||
return yaml.safeDump(variable, { skipInvalid: true });
|
return yaml.safeDump(variable, { skipInvalid: true })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class JsonPluginConfig implements PluginConfigLoader {
|
export class JsonPluginConfig implements PluginConfigLoader {
|
||||||
load(content: string) {
|
load(content: string) {
|
||||||
return JSON.parse(content);
|
return JSON.parse(content)
|
||||||
}
|
}
|
||||||
dump(variable: any): string {
|
dump(variable: any): string {
|
||||||
return JSON.stringify(variable);
|
return JSON.stringify(variable)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const configLoaderMap = new Map<string, PluginConfigLoader>();
|
const configLoaderMap = new Map<string, PluginConfigLoader>()
|
||||||
|
|
||||||
export function getConfigLoader(format: string) {
|
export function getConfigLoader(format: string) {
|
||||||
if (!configLoaderMap.has(format)) { throw new Error(`Unsupport config format ${format} !`) }
|
if (!configLoaderMap.has(format)) { throw new Error(`Unsupport config format ${format} !`) }
|
||||||
return configLoaderMap.get(format);
|
return configLoaderMap.get(format)
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadConfig(plugin: plugin.Plugin) {
|
||||||
|
let configs = getPluginConfigMetadata(plugin)
|
||||||
|
for (let [_, config] of configs) {
|
||||||
|
try {
|
||||||
|
let configFile = fs.concat(fs.file(plugin.description.loadMetadata.file).parent, plugin.description.name, config.name + '.' + config.format)
|
||||||
|
let configFactory = getConfigLoader(config.format)
|
||||||
|
if (!fs.exists(configFile)) {
|
||||||
|
base.save(configFile, configFactory.dump(plugin[config.variable]))
|
||||||
|
console.i18n("ms.plugin.manager.config.save.default", { plugin: plugin.description.name, name: config.name, format: config.format })
|
||||||
|
} else {
|
||||||
|
plugin[config.variable] = configFactory.load(base.read(configFile))
|
||||||
|
plugin[config.variable].save = () => {
|
||||||
|
let result = configFactory.dump(plugin[config.variable])
|
||||||
|
base.save(configFile, result)
|
||||||
|
console.debug(`[${plugin.description.name}] Save Config ${config.variable} to file ${configFile} result ${result}`)
|
||||||
|
}
|
||||||
|
console.debug(`[${plugin.description.name}] Load Config ${config.variable} from file ${configFile} result ${JSON.stringify(plugin[config.variable])}`)
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.i18n("ms.plugin.manager.config.load.error", { plugin: plugin.description.name, name: config.name, format: config.format, error })
|
||||||
|
console.ex(error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function saveConfig(plugin: plugin.Plugin) {
|
||||||
|
let configs = getPluginConfigMetadata(plugin)
|
||||||
|
for (let [_, config] of configs) {
|
||||||
|
try {
|
||||||
|
let configFile = fs.concat(fs.file(plugin.description.loadMetadata.file).parent, plugin.description.name, config.name + '.' + config.format)
|
||||||
|
let configFactory = getConfigLoader(config.format)
|
||||||
|
if (!config.readonly) { base.save(configFile, configFactory.dump(plugin[config.variable])) }
|
||||||
|
} catch (error) {
|
||||||
|
console.i18n("ms.plugin.manager.config.save.error", { plugin: plugin.description.name, name: config.name, format: config.format, error })
|
||||||
|
console.ex(error)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
@@ -35,6 +77,8 @@ function init() {
|
|||||||
let yaml = new YamlPluginConfig()
|
let yaml = new YamlPluginConfig()
|
||||||
configLoaderMap.set("yml", yaml)
|
configLoaderMap.set("yml", yaml)
|
||||||
configLoaderMap.set("yaml", yaml)
|
configLoaderMap.set("yaml", yaml)
|
||||||
|
process.on('plugin.before.load', loadConfig)
|
||||||
|
process.on('plugin.after.load', saveConfig)
|
||||||
}
|
}
|
||||||
|
|
||||||
init()
|
init()
|
||||||
|
|||||||
@@ -8,10 +8,10 @@ import { getPluginMetadatas, getPluginCommandMetadata, getPluginListenerMetadata
|
|||||||
* MiaoScript plugin
|
* MiaoScript plugin
|
||||||
* @param metadata PluginMetadata
|
* @param metadata PluginMetadata
|
||||||
*/
|
*/
|
||||||
export function plugin(metadata: pluginApi.PluginMetadata) {
|
export function plugin(metadata: pluginApi.PluginMetadata | any) {
|
||||||
return function (target: any) {
|
return function (target: any) {
|
||||||
metadata.target = target
|
if (!metadata.source) metadata = { souece: metadata }
|
||||||
metadata.type = "ioc"
|
metadata = { name: target.name, version: '1.0.0', author: 'Unknow', target, type: 'ioc', ...metadata }
|
||||||
decorate(injectable(), target)
|
decorate(injectable(), target)
|
||||||
Reflect.defineMetadata(METADATA_KEY.plugin, metadata, target)
|
Reflect.defineMetadata(METADATA_KEY.plugin, metadata, target)
|
||||||
const previousMetadata: Map<string, pluginApi.PluginMetadata> = getPluginMetadatas()
|
const previousMetadata: Map<string, pluginApi.PluginMetadata> = getPluginMetadatas()
|
||||||
|
|||||||
30
packages/plugin/src/event.ts
Normal file
30
packages/plugin/src/event.ts
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
import { event, plugin, server } from '@ccms/api'
|
||||||
|
import { provideSingleton, postConstruct, inject } from '@ccms/container'
|
||||||
|
import { getPluginListenerMetadata } from './utils'
|
||||||
|
|
||||||
|
@provideSingleton(PluginEventManager)
|
||||||
|
export class PluginEventManager {
|
||||||
|
@inject(server.ServerChecker)
|
||||||
|
private ServerChecker: server.ServerChecker
|
||||||
|
@inject(event.Event)
|
||||||
|
private EventManager: event.Event
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
process.on('plugin.before.enable', (plugin: plugin.Plugin) => this.registryListener(plugin))
|
||||||
|
process.on('plugin.after.disable', (plugin: plugin.Plugin) => this.unregistryListener(plugin))
|
||||||
|
}
|
||||||
|
|
||||||
|
private registryListener(pluginInstance: plugin.Plugin) {
|
||||||
|
let events = getPluginListenerMetadata(pluginInstance)
|
||||||
|
for (const event of events) {
|
||||||
|
// ignore space listener
|
||||||
|
if (!this.ServerChecker.check(event.servers)) { continue }
|
||||||
|
// here must bind this to pluginInstance
|
||||||
|
this.EventManager.listen(pluginInstance, event.name, pluginInstance[event.executor].bind(pluginInstance))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private unregistryListener(pluginInstance: plugin.Plugin) {
|
||||||
|
this.EventManager.disable(pluginInstance)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
import i18n from '@ccms/i18n'
|
import i18n from '@ccms/i18n'
|
||||||
import { plugin, server, command, event } from '@ccms/api'
|
import { plugin, server, event } from '@ccms/api'
|
||||||
import { inject, provideSingleton, Container, ContainerInstance } from '@ccms/container'
|
import { inject, provideSingleton, Container, ContainerInstance } from '@ccms/container'
|
||||||
import * as fs from '@ccms/common/dist/fs'
|
|
||||||
|
|
||||||
|
import './config'
|
||||||
import { interfaces } from './interfaces'
|
import { interfaces } from './interfaces'
|
||||||
import { getConfigLoader } from './config'
|
import { PluginCommandManager } from './command'
|
||||||
import { getPluginCommandMetadata, getPluginListenerMetadata, getPluginTabCompleterMetadata, getPluginConfigMetadata } from './utils'
|
import { PluginEventManager } from './event'
|
||||||
|
|
||||||
const Thread = Java.type('java.lang.Thread')
|
const Thread = Java.type('java.lang.Thread')
|
||||||
|
|
||||||
@@ -15,15 +15,16 @@ export class PluginManagerImpl implements plugin.PluginManager {
|
|||||||
private container: Container
|
private container: Container
|
||||||
@inject(plugin.PluginInstance)
|
@inject(plugin.PluginInstance)
|
||||||
private pluginInstance: any
|
private pluginInstance: any
|
||||||
@inject(plugin.PluginFolder)
|
|
||||||
private pluginFolder: string
|
|
||||||
@inject(server.ServerType)
|
@inject(server.ServerType)
|
||||||
private serverType: string
|
private serverType: string
|
||||||
@inject(command.Command)
|
|
||||||
private CommandManager: command.Command
|
|
||||||
@inject(event.Event)
|
@inject(event.Event)
|
||||||
private EventManager: event.Event
|
private EventManager: event.Event
|
||||||
|
|
||||||
|
@inject(PluginCommandManager)
|
||||||
|
private commandManager: PluginCommandManager
|
||||||
|
@inject(PluginEventManager)
|
||||||
|
private eventManager: PluginEventManager
|
||||||
|
|
||||||
private initialized: boolean = false
|
private initialized: boolean = false
|
||||||
|
|
||||||
private sacnnerMap: Map<string, plugin.PluginScanner>
|
private sacnnerMap: Map<string, plugin.PluginScanner>
|
||||||
@@ -38,6 +39,10 @@ export class PluginManagerImpl implements plugin.PluginManager {
|
|||||||
|
|
||||||
this.instanceMap = new Map()
|
this.instanceMap = new Map()
|
||||||
this.metadataMap = new Map()
|
this.metadataMap = new Map()
|
||||||
|
|
||||||
|
// ignore unused
|
||||||
|
this.commandManager
|
||||||
|
this.eventManager
|
||||||
}
|
}
|
||||||
|
|
||||||
initialize() {
|
initialize() {
|
||||||
@@ -90,16 +95,18 @@ export class PluginManagerImpl implements plugin.PluginManager {
|
|||||||
console.i18n("ms.plugin.manager.stage", { stage, plugin: plugin.description.name, version: plugin.description.version, author: plugin.description.author })
|
console.i18n("ms.plugin.manager.stage", { stage, plugin: plugin.description.name, version: plugin.description.version, author: plugin.description.author })
|
||||||
}
|
}
|
||||||
|
|
||||||
private runPluginStage(plugin: plugin.Plugin, stage: string, ext: Function) {
|
private runPluginStage(plugin: plugin.Plugin, stage: string) {
|
||||||
if (!plugin) { throw new Error(`can't run runPluginStage ${stage} because plugin is ${plugin}`) }
|
if (!plugin) { throw new Error(`can't run runPluginStage ${stage} because plugin is ${plugin}`) }
|
||||||
try {
|
try {
|
||||||
this.logStage(plugin, i18n.translate(`ms.plugin.manager.stage.${stage}`))
|
this.logStage(plugin, i18n.translate(`ms.plugin.manager.stage.${stage}`))
|
||||||
ext()
|
process.emit(`plugin.before.${stage}`, plugin)
|
||||||
this.runCatch(plugin, stage)
|
this.runCatch(plugin, stage)
|
||||||
this.runCatch(plugin, `${this.serverType}${stage}`)
|
this.runCatch(plugin, `${this.serverType}${stage}`)
|
||||||
plugin.description.loadMetadata.loader[stage](plugin)
|
plugin.description.loadMetadata.loader[stage](plugin)
|
||||||
|
process.emit(`plugin.after.${stage}`, plugin)
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
console.i18n("ms.plugin.manager.stage.exec.error", { plugin: plugin.description.name, executor: stage, error: ex })
|
console.i18n("ms.plugin.manager.stage.exec.error", { plugin: plugin.description.name, executor: stage, error: ex })
|
||||||
|
if (global.debug) { console.ex(ex) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,22 +115,7 @@ export class PluginManagerImpl implements plugin.PluginManager {
|
|||||||
if (loadMetadata.loaded) { throw new Error(`Plugin ${loadMetadata.name} is already loaded by ${loadMetadata.loader?.type}!`) }
|
if (loadMetadata.loaded) { throw new Error(`Plugin ${loadMetadata.name} is already loaded by ${loadMetadata.loader?.type}!`) }
|
||||||
try {
|
try {
|
||||||
for (const [, loader] of this.loaderMap) {
|
for (const [, loader] of this.loaderMap) {
|
||||||
try {
|
if (this.loaderRequirePlugin(loadMetadata, loader)?.loaded) return loadMetadata.metadata
|
||||||
if (loader.require(loadMetadata).loaded) {
|
|
||||||
loadMetadata.loader = loader
|
|
||||||
let metadata = loadMetadata.metadata
|
|
||||||
this.metadataMap.set(metadata.name, metadata)
|
|
||||||
metadata.loadMetadata = loadMetadata
|
|
||||||
return metadata
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
if (global.debug) {
|
|
||||||
console.console(`§6Loader §b${loader.type} §6load §a${loadMetadata.file} §cerror. §4Err: §c${error}`)
|
|
||||||
console.ex(error)
|
|
||||||
} else {
|
|
||||||
console.warn(`Loader ${loader.type} load ${loadMetadata.file} error. Err: ${error}`)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.i18n("ms.plugin.manager.initialize.error", { name: loadMetadata.file, ex: error })
|
console.i18n("ms.plugin.manager.initialize.error", { name: loadMetadata.file, ex: error })
|
||||||
@@ -132,6 +124,29 @@ export class PluginManagerImpl implements plugin.PluginManager {
|
|||||||
console.console(`§6scanner: §b${loadMetadata.scanner.type} §ccan\'t load §6file §b${loadMetadata.file}. §eskip!`)
|
console.console(`§6scanner: §b${loadMetadata.scanner.type} §ccan\'t load §6file §b${loadMetadata.file}. §eskip!`)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private loaderRequirePlugin(loadMetadata: plugin.PluginLoadMetadata, loader: plugin.PluginLoader) {
|
||||||
|
try {
|
||||||
|
if (loader.require(loadMetadata).loaded) {
|
||||||
|
loadMetadata.loader = loader
|
||||||
|
let metadata = loadMetadata.metadata
|
||||||
|
if (this.metadataMap.has(metadata.name)) {
|
||||||
|
let oldMetadata = this.metadataMap.get(metadata.name)
|
||||||
|
throw new Error(`Plugin ${oldMetadata.name} is already load from ${oldMetadata.source}...`)
|
||||||
|
}
|
||||||
|
this.metadataMap.set(metadata.name, metadata)
|
||||||
|
metadata.loadMetadata = loadMetadata
|
||||||
|
}
|
||||||
|
return loadMetadata
|
||||||
|
} catch (error) {
|
||||||
|
if (global.debug) {
|
||||||
|
console.console(`§6Loader §b${loader.type} §6load §a${loadMetadata.file} §cerror. §4Err: §c${error}`)
|
||||||
|
console.ex(error)
|
||||||
|
} else {
|
||||||
|
console.warn(`Loader ${loader.type} load ${loadMetadata.file} error. Err: ${error}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 从文件加载插件
|
* 从文件加载插件
|
||||||
* @param file java.io.File
|
* @param file java.io.File
|
||||||
@@ -139,44 +154,33 @@ export class PluginManagerImpl implements plugin.PluginManager {
|
|||||||
loadFromFile(file: string, scanner = this.sacnnerMap.get('file')): plugin.Plugin {
|
loadFromFile(file: string, scanner = this.sacnnerMap.get('file')): plugin.Plugin {
|
||||||
if (!file) { throw new Error('plugin file can\'t be undefiend!') }
|
if (!file) { throw new Error('plugin file can\'t be undefiend!') }
|
||||||
if (!scanner) { throw new Error('plugin scanner can\'t be undefiend!') }
|
if (!scanner) { throw new Error('plugin scanner can\'t be undefiend!') }
|
||||||
let metadata = this.loadPlugin(scanner.read(file))
|
let metadata = this.loadPlugin(scanner.load(scanner.read(file)))
|
||||||
let plugin = metadata.loadMetadata.loader.build(metadata)
|
let plugin = this.buildPlugin(metadata)
|
||||||
this.load(plugin)
|
this.load(plugin)
|
||||||
this.enable(plugin)
|
this.enable(plugin)
|
||||||
return plugin
|
return plugin
|
||||||
}
|
}
|
||||||
|
|
||||||
load(...args: any[]): void {
|
load(...args: any[]): void {
|
||||||
this.checkAndGet(args[0]).forEach((plugin: plugin.Plugin) => {
|
this.checkAndGet(args[0]).forEach((plugin: plugin.Plugin) => this.runPluginStage(plugin, 'load'))
|
||||||
this.runPluginStage(plugin, 'load', () => {
|
|
||||||
this.loadConfig(plugin)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
enable(...args: any[]): void {
|
enable(...args: any[]): void {
|
||||||
this.checkAndGet(args[0]).forEach((plugin: plugin.Plugin) => {
|
this.checkAndGet(args[0]).forEach((plugin: plugin.Plugin) => this.runPluginStage(plugin, 'enable'))
|
||||||
this.runPluginStage(plugin, 'enable', () => {
|
|
||||||
this.registryCommand(plugin)
|
|
||||||
this.registryListener(plugin)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
disable(...args: any[]): void {
|
disable(...args: any[]): void {
|
||||||
this.checkAndGet(args[0]).forEach((plugin: plugin.Plugin) => {
|
this.checkAndGet(args[0]).forEach((plugin: plugin.Plugin) => {
|
||||||
this.runPluginStage(plugin, 'disable', () => {
|
this.runPluginStage(plugin, 'disable')
|
||||||
this.saveConfig(plugin)
|
this.metadataMap.delete(plugin.description.name)
|
||||||
this.unregistryCommand(plugin)
|
this.instanceMap.delete(plugin.description.name)
|
||||||
this.unregistryListener(plugin)
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
reload(...args: any[]): void {
|
reload(...args: any[]): void {
|
||||||
this.checkAndGet(args[0]).forEach((pl: plugin.Plugin) => {
|
this.checkAndGet(args[0]).forEach((pl: plugin.Plugin) => {
|
||||||
this.disable(pl)
|
this.disable(pl)
|
||||||
this.loadFromFile(pl.description.source.toString(), pl.description.loadMetadata.scanner)
|
this.loadFromFile(pl.description.loadMetadata.file, pl.description.loadMetadata.scanner)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -206,102 +210,22 @@ export class PluginManagerImpl implements plugin.PluginManager {
|
|||||||
throw new Error(`Plugin ${JSON.stringify(name)} not exist!`)
|
throw new Error(`Plugin ${JSON.stringify(name)} not exist!`)
|
||||||
}
|
}
|
||||||
|
|
||||||
private allowProcess(servers: string[]) {
|
|
||||||
// Not set servers -> allow
|
|
||||||
if (!servers || !servers.length) return true
|
|
||||||
// include !type -> deny
|
|
||||||
let denyServers = servers.filter(svr => svr.startsWith("!"))
|
|
||||||
if (denyServers.length !== 0) {
|
|
||||||
return !denyServers.includes(`!${this.serverType}`)
|
|
||||||
} else {
|
|
||||||
// only include -> allow
|
|
||||||
return servers.includes(this.serverType)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private buildPlugins() {
|
private buildPlugins() {
|
||||||
for (const [, metadata] of this.metadataMap) {
|
this.metadataMap.forEach((metadata) => {
|
||||||
let pluginInstance: plugin.Plugin
|
|
||||||
if (!this.loaderMap.has(metadata.type)) {
|
|
||||||
console.error(`§4无法加载插件 §c${metadata.name} §4请检查 §c${metadata.type} §4加载器是否正常启用!`)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
pluginInstance = this.loaderMap.get(metadata.type).build(metadata)
|
|
||||||
if (!pluginInstance) { console.error(`§4加载器 §c${metadata.type} §4加载插件 §c${metadata.name} §4失败!`); continue }
|
|
||||||
this.instanceMap.set(metadata.name, pluginInstance)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private loadConfig(plugin: plugin.Plugin) {
|
|
||||||
let configs = getPluginConfigMetadata(plugin)
|
|
||||||
for (let [_, config] of configs) {
|
|
||||||
try {
|
try {
|
||||||
let configFile = fs.concat(root, this.pluginFolder, plugin.description.name, config.name + '.' + config.format)
|
this.buildPlugin(metadata)
|
||||||
let configFactory = getConfigLoader(config.format)
|
|
||||||
if (!fs.exists(configFile)) {
|
|
||||||
base.save(configFile, configFactory.dump(plugin[config.variable]))
|
|
||||||
console.i18n("ms.plugin.manager.config.save.default", { plugin: plugin.description.name, name: config.name, format: config.format })
|
|
||||||
} else {
|
|
||||||
plugin[config.variable] = configFactory.load(base.read(configFile))
|
|
||||||
plugin[config.variable].save = () => {
|
|
||||||
let result = configFactory.dump(plugin[config.variable])
|
|
||||||
base.save(configFile, result)
|
|
||||||
console.debug(`[${plugin.description.name}] Save Config ${config.variable} to file ${configFile} result ${result}`)
|
|
||||||
}
|
|
||||||
console.debug(`[${plugin.description.name}] Load Config ${config.variable} from file ${configFile} result ${JSON.stringify(plugin[config.variable])}`)
|
|
||||||
}
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.i18n("ms.plugin.manager.config.load.error", { plugin: plugin.description.name, name: config.name, format: config.format, error })
|
console.error(error)
|
||||||
console.ex(error)
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private saveConfig(plugin: plugin.Plugin) {
|
|
||||||
let configs = getPluginConfigMetadata(plugin)
|
|
||||||
for (let [_, config] of configs) {
|
|
||||||
try {
|
|
||||||
let configFile = fs.concat(root, this.pluginFolder, plugin.description.name, config.name + '.' + config.format)
|
|
||||||
let configFactory = getConfigLoader(config.format)
|
|
||||||
if (!config.readonly) { base.save(configFile, configFactory.dump(plugin[config.variable])) }
|
|
||||||
} catch (error) {
|
|
||||||
console.i18n("ms.plugin.manager.config.save.error", { plugin: plugin.description.name, name: config.name, format: config.format, error })
|
|
||||||
console.ex(error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private registryCommand(pluginInstance: plugin.Plugin) {
|
|
||||||
let cmds = getPluginCommandMetadata(pluginInstance)
|
|
||||||
let tabs = getPluginTabCompleterMetadata(pluginInstance)
|
|
||||||
for (const [_, cmd] of cmds) {
|
|
||||||
let tab = tabs.get(cmd.name)
|
|
||||||
if (!this.allowProcess(cmd.servers)) { continue }
|
|
||||||
this.CommandManager.on(pluginInstance, cmd.name, {
|
|
||||||
cmd: pluginInstance[cmd.executor].bind(pluginInstance),
|
|
||||||
tab: tab ? pluginInstance[tab.executor].bind(pluginInstance) : undefined
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private registryListener(pluginInstance: plugin.Plugin) {
|
|
||||||
let events = getPluginListenerMetadata(pluginInstance)
|
|
||||||
for (const event of events) {
|
|
||||||
// ignore space listener
|
|
||||||
if (!this.allowProcess(event.servers)) { continue }
|
|
||||||
// here must bind this to pluginInstance
|
|
||||||
this.EventManager.listen(pluginInstance, event.name, pluginInstance[event.executor].bind(pluginInstance))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private unregistryCommand(pluginInstance: plugin.Plugin) {
|
|
||||||
let cmds = getPluginCommandMetadata(pluginInstance)
|
|
||||||
cmds.forEach(cmd => {
|
|
||||||
this.CommandManager.off(pluginInstance, cmd.name)
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
private unregistryListener(pluginInstance: plugin.Plugin) {
|
private buildPlugin(metadata: plugin.PluginMetadata) {
|
||||||
this.EventManager.disable(pluginInstance)
|
if (!this.loaderMap.has(metadata.type)) { throw new Error(`§4无法加载插件 §c${metadata.name} §4请检查 §c${metadata.type} §4加载器是否正常启用!`) }
|
||||||
|
let pluginInstance = this.loaderMap.get(metadata.type).build(metadata)
|
||||||
|
if (!pluginInstance) { throw new Error(`§4加载器 §c${metadata.type} §4加载插件 §c${metadata.name} §4失败!`) }
|
||||||
|
if (this.instanceMap.has(metadata.name)) { throw new Error(`Plugin ${metadata.name} is already load from ${metadata.source}...`) }
|
||||||
|
this.instanceMap.set(metadata.name, pluginInstance)
|
||||||
|
return pluginInstance
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ export class JSFileScanner implements plugin.PluginScanner {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private updatePlugin(file: any) {
|
private updatePlugin(file: any) {
|
||||||
var update = fs.file(fs.file(file.parentFile, 'update'), file.name)
|
var update = fs.file(fs.file(fs.file(file).parentFile, 'update'), file.name)
|
||||||
if (update.exists()) {
|
if (update.exists()) {
|
||||||
console.i18n("ms.plugin.manager.build.update", { name: file.name })
|
console.i18n("ms.plugin.manager.build.update", { name: file.name })
|
||||||
fs.move(update, file, true)
|
fs.move(update, file, true)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"private": true,
|
"private": true,
|
||||||
"name": "@ccms/plugins",
|
"name": "@ccms/plugins",
|
||||||
"version": "0.8.2",
|
"version": "0.8.4",
|
||||||
"description": "MiaoScript plugins package",
|
"description": "MiaoScript plugins package",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"miaoscript",
|
"miaoscript",
|
||||||
@@ -20,13 +20,16 @@
|
|||||||
"test": "echo \"Error: run tests from root\" && exit 1"
|
"test": "echo \"Error: run tests from root\" && exit 1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@javatypes/spring-data-redis": "^0.0.2",
|
||||||
|
"@javatypes/spring-web": "^0.0.2",
|
||||||
|
"@javatypes/tomcat": "^0.0.2",
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"typescript": "^3.9.5"
|
"typescript": "^3.9.6"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ccms/api": "^0.8.2",
|
"@ccms/api": "^0.8.4",
|
||||||
"@ccms/container": "^0.8.2",
|
"@ccms/container": "^0.8.4",
|
||||||
"@ccms/plugin": "^0.8.2"
|
"@ccms/plugin": "^0.8.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -137,14 +137,15 @@ export class MiaoScriptPackageManager extends interfaces.Plugin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cmdupgrade(sender: any, name: string) {
|
cmdupgrade(sender: any, name: string, confirm: boolean) {
|
||||||
if (!name) { return this.i18n(sender, 'upgrade.confirm') }
|
if (name == "system") {
|
||||||
if (name == "comfirm") {
|
if (!confirm) { return this.i18n(sender, 'upgrade.confirm') }
|
||||||
let enginePath = fs.path(fs.file(fs.concat(root, 'node_modules', '@ccms')))
|
let enginePath = fs.path(fs.file(root, 'node_modules'))
|
||||||
if (enginePath.startsWith(root)) {
|
if (enginePath.startsWith(root)) {
|
||||||
base.delete(enginePath)
|
base.delete(enginePath)
|
||||||
this.cmdrestart(sender)
|
this.cmdrestart(sender)
|
||||||
}
|
}
|
||||||
|
return
|
||||||
}
|
}
|
||||||
if (this.checkPlugin(sender, name)) {
|
if (this.checkPlugin(sender, name)) {
|
||||||
this.update(sender, name)
|
this.update(sender, name)
|
||||||
@@ -241,7 +242,7 @@ return '§a返回结果: §r'+ eval(${JSON.stringify(code)});`)
|
|||||||
name,
|
name,
|
||||||
author: plugin.description.author,
|
author: plugin.description.author,
|
||||||
version: plugin.description.version,
|
version: plugin.description.version,
|
||||||
source: base.read(plugin.description.source.toString())
|
source: base.read((plugin.description.source || plugin.description.loadMetadata.file).toString())
|
||||||
})
|
})
|
||||||
this.i18n(sender, result.code == 200 ? 'deploy.success' : 'deploy.fail', { name, msg: result.msg })
|
this.i18n(sender, result.code == 200 ? 'deploy.success' : 'deploy.fail', { name, msg: result.msg })
|
||||||
}
|
}
|
||||||
@@ -263,8 +264,11 @@ return '§a返回结果: §r'+ eval(${JSON.stringify(code)});`)
|
|||||||
return ["install", "cloud"]
|
return ["install", "cloud"]
|
||||||
case "install":
|
case "install":
|
||||||
return this.packageNameCache
|
return this.packageNameCache
|
||||||
case "update":
|
|
||||||
case "upgrade":
|
case "upgrade":
|
||||||
|
if (args.length == 2) return ["system", ...this.pluginManager.getPlugins().keys()]
|
||||||
|
if (args.length == 3 && args[1] == "system") return ["confirm"]
|
||||||
|
return []
|
||||||
|
case "update":
|
||||||
case "load":
|
case "load":
|
||||||
case "unload":
|
case "unload":
|
||||||
case "reload":
|
case "reload":
|
||||||
|
|||||||
@@ -5,12 +5,47 @@ import { constants, database, plugin, web } from "@ccms/api"
|
|||||||
import { inject, ContainerInstance, Container, JSClass, postConstruct } from "@ccms/container"
|
import { inject, ContainerInstance, Container, JSClass, postConstruct } from "@ccms/container"
|
||||||
import { JSPlugin, interfaces, cmd } from "@ccms/plugin"
|
import { JSPlugin, interfaces, cmd } from "@ccms/plugin"
|
||||||
import { DataBase, DataBaseManager } from '@ccms/database'
|
import { DataBase, DataBaseManager } from '@ccms/database'
|
||||||
import { Server, Context, RequestHandler, Controller, Get, Post, Param, Body } from '@ccms/web'
|
import { Server, Context, RequestHandler, Controllers, Controller, Get, Post, Param, Body } from '@ccms/web'
|
||||||
|
|
||||||
import * as fs from '@ccms/common/dist/fs'
|
import * as fs from '@ccms/common/dist/fs'
|
||||||
import * as reflect from '@ccms/common/dist/reflect'
|
import * as reflect from '@ccms/common/dist/reflect'
|
||||||
|
|
||||||
@JSPlugin({ name: 'MiaoSpring', prefix: 'MSpring', version: '1.0.1', author: 'MiaoWoo', servers: [constants.ServerType.Spring], source: __filename })
|
@Controller()
|
||||||
|
class PluginController {
|
||||||
|
@inject(plugin.PluginManager)
|
||||||
|
private pluginManager: plugin.PluginManager
|
||||||
|
@inject(database.DataBaseManager)
|
||||||
|
private databaseManager: DataBaseManager
|
||||||
|
|
||||||
|
private mainDB: DataBase
|
||||||
|
|
||||||
|
@postConstruct()
|
||||||
|
initialize() {
|
||||||
|
this.mainDB = this.databaseManager.getMainDatabase()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Get()
|
||||||
|
list(@Param('install') install: boolean) {
|
||||||
|
if (install) {
|
||||||
|
return { status: 200, data: [...this.pluginManager.getPlugins().values()].map((plugin) => plugin.description), msg: '插件列表获取成功!' }
|
||||||
|
} else {
|
||||||
|
return { status: 200, data: this.mainDB.query<Plugin>("SELECT name FROM plugins WHERE deleted = 0") }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@Post()
|
||||||
|
deploy(@Body() info: Plugin) {
|
||||||
|
let plugin = this.mainDB.query<Plugin>("SELECT name FROM plugins WHERE name = ?", info.name)
|
||||||
|
if (plugin.length == 0) {
|
||||||
|
this.mainDB.update("INSERT INTO `plugins`(`name`, `source`) VALUES (?, ?)", info.name, info.source)
|
||||||
|
return { status: 200, msg: `插件 ${info.name} 新增成功!` }
|
||||||
|
} else {
|
||||||
|
this.mainDB.update("UPDATE `plugins` SET `source` = ? WHERE id = ?", info.source, plugin[0].id)
|
||||||
|
return { status: 200, msg: `插件 ${info.name} 更新成功!` }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@JSPlugin({ author: 'MiaoWoo', servers: [constants.ServerType.Spring], source: __filename })
|
||||||
export class MiaoSpring extends interfaces.Plugin {
|
export class MiaoSpring extends interfaces.Plugin {
|
||||||
@inject(ContainerInstance)
|
@inject(ContainerInstance)
|
||||||
private container: Container
|
private container: Container
|
||||||
@@ -40,6 +75,7 @@ export class MiaoSpring extends interfaces.Plugin {
|
|||||||
this.mappings = new Set()
|
this.mappings = new Set()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Controllers(PluginController)
|
||||||
enable() {
|
enable() {
|
||||||
this.registryDefault()
|
this.registryDefault()
|
||||||
this.registryPages()
|
this.registryPages()
|
||||||
@@ -173,6 +209,7 @@ export class MiaoSpring extends interfaces.Plugin {
|
|||||||
'pluginManager'
|
'pluginManager'
|
||||||
]
|
]
|
||||||
let params = [
|
let params = [
|
||||||
|
base.getInstance().getAutowireCapableBeanFactory(),
|
||||||
this.mainDatabase,
|
this.mainDatabase,
|
||||||
reflect,
|
reflect,
|
||||||
this.container,
|
this.container,
|
||||||
@@ -187,6 +224,8 @@ return eval(${JSON.stringify(code)});`)
|
|||||||
|
|
||||||
disable() {
|
disable() {
|
||||||
Object.keys(this.mappings).forEach((r) => this.webServer.unregistryMapping(r))
|
Object.keys(this.mappings).forEach((r) => this.webServer.unregistryMapping(r))
|
||||||
|
this.webServer.unregistryInterceptor({ name: 'RedirectHandle' })
|
||||||
|
this.webServer.unregistryInterceptor({ name: 'StaticHandle' })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -195,38 +234,3 @@ class Plugin {
|
|||||||
name: string
|
name: string
|
||||||
source: string
|
source: string
|
||||||
}
|
}
|
||||||
|
|
||||||
@Controller()
|
|
||||||
class PluginController {
|
|
||||||
@inject(plugin.PluginManager)
|
|
||||||
private pluginManager: plugin.PluginManager
|
|
||||||
@inject(database.DataBaseManager)
|
|
||||||
private databaseManager: DataBaseManager
|
|
||||||
|
|
||||||
private mainDB: DataBase
|
|
||||||
|
|
||||||
@postConstruct()
|
|
||||||
initialize() {
|
|
||||||
this.mainDB = this.databaseManager.getMainDatabase()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Get()
|
|
||||||
list(@Param('install') install: boolean) {
|
|
||||||
if (install) {
|
|
||||||
return { status: 200, data: [...this.pluginManager.getPlugins().values()].map((plugin) => plugin.description), msg: '插件列表获取成功!' }
|
|
||||||
} else {
|
|
||||||
return { status: 200, data: this.mainDB.query<Plugin>("SELECT name FROM plugins WHERE deleted = 0") }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@Post()
|
|
||||||
deploy(@Body() info: Plugin) {
|
|
||||||
let plugin = this.mainDB.query<Plugin>("SELECT name FROM plugins WHERE name = ?", info.name)
|
|
||||||
if (plugin.length == 0) {
|
|
||||||
this.mainDB.update("INSERT INTO `plugins`(`name`, `source`) VALUES (?, ?)", info.name, info.source)
|
|
||||||
return { status: 200, msg: `插件 ${info.name} 新增成功!` }
|
|
||||||
} else {
|
|
||||||
this.mainDB.update("UPDATE `plugins` SET `source` = ? WHERE id = ?", info.source, plugin[0].id)
|
|
||||||
return { status: 200, msg: `插件 ${info.name} 更新成功!` }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,21 +1,6 @@
|
|||||||
import { constants, web } from "@ccms/api"
|
import { constants } from "@ccms/api"
|
||||||
import { inject } from "@ccms/container"
|
|
||||||
import { plugin, interfaces } from "@ccms/plugin"
|
import { plugin, interfaces } from "@ccms/plugin"
|
||||||
import { Controller, Get, Server, Body, Post, Cookie, Header, Param } from "@ccms/web"
|
import { Controllers, Controller, Get, Body, Post, Cookie, Header, Param } from "@ccms/web"
|
||||||
|
|
||||||
@plugin({ name: 'MiaoWeb', version: '1.0.0', author: 'MiaoWoo', servers: [constants.ServerType.Spring], source: __filename })
|
|
||||||
export class MiaoWeb extends interfaces.Plugin {
|
|
||||||
@inject(web.Server)
|
|
||||||
private webServer: Server
|
|
||||||
|
|
||||||
enable() {
|
|
||||||
this.webServer.registryController(TestController)
|
|
||||||
}
|
|
||||||
|
|
||||||
disable() {
|
|
||||||
this.webServer.unregistryController(TestController)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Controller()
|
@Controller()
|
||||||
export class TestController {
|
export class TestController {
|
||||||
@@ -36,4 +21,11 @@ export class TestController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@plugin({ author: 'MiaoWoo', servers: [constants.ServerType.Spring], source: __filename })
|
||||||
|
export class MiaoWeb extends interfaces.Plugin {
|
||||||
|
@Controllers(TestController)
|
||||||
|
enable() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,7 +5,9 @@
|
|||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"skipLibCheck": true,
|
"skipLibCheck": true,
|
||||||
"sourceMap": false,
|
"sourceMap": false,
|
||||||
"inlineSourceMap": true
|
"inlineSourceMap": true,
|
||||||
|
"declaration": false,
|
||||||
|
"declarationMap": false
|
||||||
},
|
},
|
||||||
"exclude": [
|
"exclude": [
|
||||||
"dist",
|
"dist",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ccms/sponge",
|
"name": "@ccms/sponge",
|
||||||
"version": "0.8.2",
|
"version": "0.8.4",
|
||||||
"description": "MiaoScript api package",
|
"description": "MiaoScript api package",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"miaoscript",
|
"miaoscript",
|
||||||
@@ -22,11 +22,11 @@
|
|||||||
"@javatypes/sponge-api": "^0.0.2",
|
"@javatypes/sponge-api": "^0.0.2",
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"typescript": "^3.9.5"
|
"typescript": "^3.9.6"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ccms/api": "^0.8.2",
|
"@ccms/api": "^0.8.4",
|
||||||
"@ccms/common": "^0.8.2",
|
"@ccms/common": "^0.8.4",
|
||||||
"@ccms/container": "^0.8.2"
|
"@ccms/container": "^0.8.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ccms/spring",
|
"name": "@ccms/spring",
|
||||||
"version": "0.8.2",
|
"version": "0.8.4",
|
||||||
"description": "MiaoScript spring package",
|
"description": "MiaoScript spring package",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"miaoscript",
|
"miaoscript",
|
||||||
@@ -21,12 +21,12 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"typescript": "^3.9.5"
|
"typescript": "^3.9.6"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ccms/api": "^0.8.2",
|
"@ccms/api": "^0.8.4",
|
||||||
"@ccms/common": "^0.8.2",
|
"@ccms/common": "^0.8.4",
|
||||||
"@ccms/container": "^0.8.2",
|
"@ccms/container": "^0.8.4",
|
||||||
"@ccms/database": "^0.8.2"
|
"@ccms/database": "^0.8.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,10 +7,8 @@ import { CommandMap } from './internal/command'
|
|||||||
|
|
||||||
@provideSingleton(command.Command)
|
@provideSingleton(command.Command)
|
||||||
export class SpringCommand extends command.Command {
|
export class SpringCommand extends command.Command {
|
||||||
@inject(plugin.PluginInstance)
|
|
||||||
private pluginInstance: any
|
|
||||||
@inject(CommandMap)
|
@inject(CommandMap)
|
||||||
private commandMap: CommandMap = new CommandMap()
|
private commandMap: CommandMap
|
||||||
|
|
||||||
protected create(plugin: any, command: string) {
|
protected create(plugin: any, command: string) {
|
||||||
return this.commandMap.register(plugin, command)
|
return this.commandMap.register(plugin, command)
|
||||||
@@ -22,6 +20,6 @@ export class SpringCommand extends command.Command {
|
|||||||
command.setExecutor(super.setExecutor(plugin, command, executor))
|
command.setExecutor(super.setExecutor(plugin, command, executor))
|
||||||
}
|
}
|
||||||
protected onTabComplete(plugin: any, command: any, tabCompleter: Function) {
|
protected onTabComplete(plugin: any, command: any, tabCompleter: Function) {
|
||||||
command.setTabCompleter(super.setExecutor(plugin, command, tabCompleter))
|
command.setTabCompleter(super.setTabCompleter(plugin, command, tabCompleter))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ccms/web",
|
"name": "@ccms/web",
|
||||||
"version": "0.8.2",
|
"version": "0.8.4",
|
||||||
"description": "MiaoScript web package",
|
"description": "MiaoScript web package",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"miaoscript",
|
"miaoscript",
|
||||||
@@ -26,10 +26,10 @@
|
|||||||
"@javatypes/tomcat": "^0.0.2",
|
"@javatypes/tomcat": "^0.0.2",
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"typescript": "^3.9.5"
|
"typescript": "^3.9.6"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ccms/api": "^0.8.2",
|
"@ccms/api": "^0.8.4",
|
||||||
"@ccms/container": "^0.8.2"
|
"@ccms/container": "^0.8.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +1,29 @@
|
|||||||
import { decorate, injectable } from "@ccms/container"
|
import { plugin } from '@ccms/api'
|
||||||
|
import { decorate, injectable, getContainer } from "@ccms/container"
|
||||||
|
|
||||||
import { METADATA_KEY, PARAM_TYPE } from '../constants'
|
import { METADATA_KEY, PARAM_TYPE } from '../constants'
|
||||||
import { interfaces } from "../interfaces"
|
import { interfaces } from "../interfaces"
|
||||||
import { addControllerMetadata, addControllerAction, addActionParam } from "./utils"
|
import { addControllerMetadata, addControllerAction, addActionParam, getControllerMetadata } from "./utils"
|
||||||
|
|
||||||
|
export const Controllers = (...controllers: any[]) => {
|
||||||
|
return (target: any, propertyKey: string) => {
|
||||||
|
for (const controller of controllers) {
|
||||||
|
addControllerMetadata(getControllerMetadata(controller), target)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export const Controller = (metadata?: string | interfaces.ControllerMetadata) => {
|
export const Controller = (metadata?: string | interfaces.ControllerMetadata) => {
|
||||||
return (target: any) => {
|
return (target: any) => {
|
||||||
if (!metadata) { metadata = target.name.toLowerCase().replace('controller', '') }
|
if (!metadata) { metadata = target.name.toLowerCase().replace('controller', '') }
|
||||||
if (typeof metadata === "string") { metadata = { path: metadata } }
|
if (typeof metadata === "string") { metadata = { path: metadata } }
|
||||||
|
metadata.target = target
|
||||||
metadata.name = metadata.name || target.name
|
metadata.name = metadata.name || target.name
|
||||||
metadata.path = metadata.path ?? `/${metadata}`
|
metadata.path = metadata.path ?? `/${metadata}`
|
||||||
metadata.path = metadata.path.startsWith('/') ? metadata.path : `/${metadata.path}`
|
metadata.path = metadata.path.startsWith('/') ? metadata.path : `/${metadata.path}`
|
||||||
decorate(injectable(), target)
|
decorate(injectable(), target)
|
||||||
Reflect.defineMetadata(METADATA_KEY.Controller, metadata, target)
|
Reflect.defineMetadata(METADATA_KEY.Controller, metadata, target)
|
||||||
addControllerMetadata(metadata)
|
addControllerMetadata(metadata)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -29,7 +38,6 @@ function action(method: interfaces.Method) {
|
|||||||
metadata.executor = propertyKey
|
metadata.executor = propertyKey
|
||||||
Reflect.defineMetadata(METADATA_KEY.Action, metadata, target[propertyKey])
|
Reflect.defineMetadata(METADATA_KEY.Action, metadata, target[propertyKey])
|
||||||
addControllerAction(target, propertyKey)
|
addControllerAction(target, propertyKey)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -50,7 +58,6 @@ function param(type: PARAM_TYPE) {
|
|||||||
metadata.index = index
|
metadata.index = index
|
||||||
metadata.paramtype = Reflect.getMetadata("design:paramtypes", target, propertyKey)[index]
|
metadata.paramtype = Reflect.getMetadata("design:paramtypes", target, propertyKey)[index]
|
||||||
addActionParam(target, propertyKey, metadata)
|
addActionParam(target, propertyKey, metadata)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -72,7 +79,6 @@ function Middleware() {
|
|||||||
metadata.executor = propertyKey
|
metadata.executor = propertyKey
|
||||||
Reflect.defineMetadata(METADATA_KEY.Action, metadata, target[propertyKey])
|
Reflect.defineMetadata(METADATA_KEY.Action, metadata, target[propertyKey])
|
||||||
addControllerAction(target, propertyKey)
|
addControllerAction(target, propertyKey)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
import { interfaces } from '../interfaces'
|
import { interfaces } from '../interfaces'
|
||||||
import { METADATA_KEY } from '../constants'
|
import { METADATA_KEY } from '../constants'
|
||||||
|
|
||||||
export function getControllerMetadatas(): interfaces.ControllerMetadata[] {
|
export function getControllerMetadatas(target: any = Reflect): Map<string, interfaces.ControllerMetadata> {
|
||||||
return Reflect.getMetadata(METADATA_KEY.Controller, Reflect) || []
|
return Reflect.getMetadata(METADATA_KEY.Controller, target) || new Map<string, interfaces.ControllerMetadata>()
|
||||||
}
|
}
|
||||||
export function addControllerMetadata(metadata: interfaces.ControllerMetadata) {
|
export function addControllerMetadata(metadata: interfaces.ControllerMetadata, target: any = Reflect) {
|
||||||
Reflect.defineMetadata(METADATA_KEY.Controller, [metadata, ...getControllerMetadatas()], Reflect)
|
let metadatas = getControllerMetadatas(target)
|
||||||
|
metadatas.set(metadata.name, metadata)
|
||||||
|
Reflect.defineMetadata(METADATA_KEY.Controller, metadatas, target)
|
||||||
}
|
}
|
||||||
export function getControllerActions(target: any): string[] {
|
export function getControllerActions(target: any): string[] {
|
||||||
return Reflect.getMetadata(METADATA_KEY.Action, target.constructor) || []
|
return Reflect.getMetadata(METADATA_KEY.Action, target.constructor) || []
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export namespace interfaces {
|
|||||||
/**
|
/**
|
||||||
* 对象
|
* 对象
|
||||||
*/
|
*/
|
||||||
target?: string
|
target?: any
|
||||||
}
|
}
|
||||||
export interface ControllerMetadata extends WebMetadata {
|
export interface ControllerMetadata extends WebMetadata {
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import * as querystring from 'querystring'
|
import * as querystring from 'querystring'
|
||||||
|
|
||||||
import { web } from '@ccms/api'
|
import { web, plugin } from '@ccms/api'
|
||||||
import { provideSingleton, JSClass, postConstruct, Container, ContainerInstance, inject } from '@ccms/container'
|
import { provideSingleton, JSClass, postConstruct, Container, ContainerInstance, inject } from '@ccms/container'
|
||||||
|
|
||||||
import { WebProxyBeanName, FilterProxyBeanName, METADATA_KEY, PARAM_TYPE } from './constants'
|
import { WebProxyBeanName, FilterProxyBeanName, METADATA_KEY, PARAM_TYPE } from './constants'
|
||||||
import { Context, InterceptorAdapter, RequestHandler, interfaces } from './interfaces'
|
import { Context, InterceptorAdapter, RequestHandler, interfaces } from './interfaces'
|
||||||
import { getControllerActions, getActionMetadata, getControllerMetadata, getActionParams } from './decorators'
|
import { getControllerActions, getActionMetadata, getControllerMetadata, getActionParams, getControllerMetadatas } from './decorators'
|
||||||
|
|
||||||
const HttpServletRequestWrapper = Java.type('javax.servlet.http.HttpServletRequestWrapper')
|
const HttpServletRequestWrapper = Java.type('javax.servlet.http.HttpServletRequestWrapper')
|
||||||
const HttpServletResponseWrapper = Java.type('javax.servlet.http.HttpServletResponseWrapper')
|
const HttpServletResponseWrapper = Java.type('javax.servlet.http.HttpServletResponseWrapper')
|
||||||
@@ -25,6 +25,7 @@ export class Server {
|
|||||||
private StreamUtils = org.springframework.util.StreamUtils
|
private StreamUtils = org.springframework.util.StreamUtils
|
||||||
private ResponseEntity = org.springframework.http.ResponseEntity
|
private ResponseEntity = org.springframework.http.ResponseEntity
|
||||||
|
|
||||||
|
private controllerActions: Map<string, interfaces.ActionMetadata[]>
|
||||||
private interceptors: Map<string, InterceptorAdapter>
|
private interceptors: Map<string, InterceptorAdapter>
|
||||||
private methodMappings: Map<string, Map<string, RequestHandler>>
|
private methodMappings: Map<string, Map<string, RequestHandler>>
|
||||||
|
|
||||||
@@ -33,9 +34,12 @@ export class Server {
|
|||||||
@postConstruct()
|
@postConstruct()
|
||||||
initialization() {
|
initialization() {
|
||||||
this.beanFactory = base.getInstance().getAutowireCapableBeanFactory()
|
this.beanFactory = base.getInstance().getAutowireCapableBeanFactory()
|
||||||
|
this.controllerActions = new Map()
|
||||||
this.interceptors = new Map()
|
this.interceptors = new Map()
|
||||||
this.methodMappings = new Map()
|
this.methodMappings = new Map()
|
||||||
this.start()
|
this.start()
|
||||||
|
process.on('plugin.after.enable', (plugin: plugin.Plugin) => this.registryPlugin(plugin))
|
||||||
|
process.on('plugin.after.disable', (plugin: plugin.Plugin) => this.unregistryPlugin(plugin))
|
||||||
}
|
}
|
||||||
|
|
||||||
start() {
|
start() {
|
||||||
@@ -52,23 +56,36 @@ export class Server {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
registryPlugin(plugin: plugin.Plugin) {
|
||||||
|
let controllers = getControllerMetadatas(plugin).values()
|
||||||
|
for (const controller of controllers) {
|
||||||
|
console.debug(`Plugin ${plugin.description.name} Registry Controller ${controller.name}.`)
|
||||||
|
this.registryController(controller.target)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unregistryPlugin(plugin: plugin.Plugin) {
|
||||||
|
let controllers = getControllerMetadatas(plugin).values()
|
||||||
|
for (const controller of controllers) {
|
||||||
|
console.debug(`Plugin ${plugin.description.name} Unregistry Controller ${controller.name}.`)
|
||||||
|
this.unregistryController(controller.target)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
registryController(target: any) {
|
registryController(target: any) {
|
||||||
if (!target) { throw new Error('Controller can\'t be undefiend!') }
|
if (!target) { throw new Error('Controller can\'t be undefiend!') }
|
||||||
let controllerMetadata = getControllerMetadata(target)
|
let controllerMetadata = getControllerMetadata(target)
|
||||||
if (!controllerMetadata) { throw new Error(`Controller ${target.name} must have @Controller decorator!`) }
|
if (!controllerMetadata) { throw new Error(`Controller ${target.name} must have @Controller decorator!`) }
|
||||||
try {
|
target = this.bindController(target)
|
||||||
this.container.rebind(METADATA_KEY.Controller).to(target).inSingletonScope().whenTargetNamed(target.name)
|
|
||||||
} catch{
|
|
||||||
this.container.bind(METADATA_KEY.Controller).to(target).inSingletonScope().whenTargetNamed(target.name)
|
|
||||||
}
|
|
||||||
target = this.container.getNamed(METADATA_KEY.Controller, target.name)
|
|
||||||
let actions = getControllerActions(target)
|
let actions = getControllerActions(target)
|
||||||
|
this.controllerActions.set(controllerMetadata.name, [])
|
||||||
for (const action of actions) {
|
for (const action of actions) {
|
||||||
let actionMetadata = getActionMetadata(target, action)
|
let actionMetadata = getActionMetadata(target, action)
|
||||||
|
this.controllerActions.get(controllerMetadata.name).push(actionMetadata)
|
||||||
let path = `${controllerMetadata.path || ''}${actionMetadata.path || ''}`
|
let path = `${controllerMetadata.path || ''}${actionMetadata.path || ''}`
|
||||||
if (!path) throw new Error(`Controller ${controllerMetadata.name} Action ${actionMetadata.name} path is empty!`)
|
if (!path) throw new Error(`Controller ${controllerMetadata.name} Action ${actionMetadata.name} path is empty!`)
|
||||||
if (!this.methodMappings.has(path)) { this.methodMappings.set(path, new Map()) }
|
if (!this.methodMappings.has(path)) { this.methodMappings.set(path, new Map()) }
|
||||||
console.debug(`Controller ${controllerMetadata.name} Registry ${path} to ${actionMetadata.executor || '<anonymous>'} Action function.`)
|
console.debug(`Controller ${controllerMetadata.name} Registry ${path} Action to ${actionMetadata.executor || '<anonymous>'} function.`)
|
||||||
this.methodMappings.get(path).set(actionMetadata.method || 'ALL', (ctx: Context) => {
|
this.methodMappings.get(path).set(actionMetadata.method || 'ALL', (ctx: Context) => {
|
||||||
let args = []
|
let args = []
|
||||||
let params = getActionParams(target, action)
|
let params = getActionParams(target, action)
|
||||||
@@ -97,22 +114,28 @@ export class Server {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private bindController(target: any) {
|
||||||
|
try {
|
||||||
|
this.container.rebind(METADATA_KEY.Controller).to(target).inSingletonScope().whenTargetNamed(target.name)
|
||||||
|
} catch{
|
||||||
|
this.container.bind(METADATA_KEY.Controller).to(target).inSingletonScope().whenTargetNamed(target.name)
|
||||||
|
}
|
||||||
|
return this.container.getNamed(METADATA_KEY.Controller, target.name)
|
||||||
|
}
|
||||||
|
|
||||||
unregistryController(target: any) {
|
unregistryController(target: any) {
|
||||||
if (!target) { throw new Error('Controller can\'t be undefiend!') }
|
if (!target) { throw new Error('Controller can\'t be undefiend!') }
|
||||||
let controllerMetadata = getControllerMetadata(target)
|
let controllerMetadata = getControllerMetadata(target)
|
||||||
if (!controllerMetadata) { throw new Error(`Controller ${target.name} must have @Controller decorator!`) }
|
if (!controllerMetadata) { throw new Error(`Controller ${target.name} must have @Controller decorator!`) }
|
||||||
try {
|
if (!this.controllerActions.has(controllerMetadata.name)) { return console.warn(`Controller ${controllerMetadata.name} not registry!`) }
|
||||||
target = this.container.getNamed(METADATA_KEY.Controller, target.name)
|
let actions = this.controllerActions.get(controllerMetadata.name)
|
||||||
} catch (error) {
|
for (const actionMetadata of actions) {
|
||||||
throw new Error(`Controller ${target.name} not registry! err: ${error}`)
|
|
||||||
}
|
|
||||||
let actions = getControllerActions(target)
|
|
||||||
for (const action of actions) {
|
|
||||||
let actionMetadata = getActionMetadata(target, action)
|
|
||||||
let path = `${controllerMetadata.path || ''}${actionMetadata.path || ''}`
|
let path = `${controllerMetadata.path || ''}${actionMetadata.path || ''}`
|
||||||
if (!this.methodMappings.has(path)) { continue }
|
if (!this.methodMappings.has(path)) { continue }
|
||||||
this.methodMappings.get(path).delete(actionMetadata.method)
|
this.methodMappings.get(path).delete(actionMetadata.method)
|
||||||
|
console.debug(`Controller ${controllerMetadata.name} Unregistry ${path} Action.`)
|
||||||
}
|
}
|
||||||
|
this.controllerActions.delete(controllerMetadata.name)
|
||||||
}
|
}
|
||||||
|
|
||||||
registryMapping(path: string, handler: RequestHandler) {
|
registryMapping(path: string, handler: RequestHandler) {
|
||||||
@@ -130,7 +153,9 @@ export class Server {
|
|||||||
this.interceptors.set(interceptor.name, interceptor)
|
this.interceptors.set(interceptor.name, interceptor)
|
||||||
}
|
}
|
||||||
|
|
||||||
unregistryInterceptor(interceptor: InterceptorAdapter) {
|
unregistryInterceptor(interceptor: string | InterceptorAdapter) {
|
||||||
|
if (typeof interceptor === "string") { interceptor = { name: interceptor } }
|
||||||
|
console.debug(`Unregistry ${interceptor.name} Interceptor.`)
|
||||||
this.interceptors.delete(interceptor.name)
|
this.interceptors.delete(interceptor.name)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,12 +195,12 @@ export class Server {
|
|||||||
// return wrapper
|
// return wrapper
|
||||||
// }
|
// }
|
||||||
|
|
||||||
private notFound(method: string, path: string) {
|
private notFound(ctx: Context) {
|
||||||
return {
|
return {
|
||||||
status: 404,
|
status: 404,
|
||||||
msg: "handlerMapping Not Found!",
|
msg: "handlerMapping Not Found!",
|
||||||
method,
|
method: ctx.request.getMethod(),
|
||||||
path,
|
path: ctx.request.getRequestURI(),
|
||||||
timestamp: Date.now()
|
timestamp: Date.now()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -184,12 +209,7 @@ export class Server {
|
|||||||
try { this.beanFactory.destroySingleton(WebProxyBeanName) } catch (ex) { }
|
try { this.beanFactory.destroySingleton(WebProxyBeanName) } catch (ex) { }
|
||||||
var WebServerProxyNashorn = Java.extend(this.WebServerProxy, {
|
var WebServerProxyNashorn = Java.extend(this.WebServerProxy, {
|
||||||
process: (req: javax.servlet.http.HttpServletRequest, resp: javax.servlet.http.HttpServletResponse) => {
|
process: (req: javax.servlet.http.HttpServletRequest, resp: javax.servlet.http.HttpServletResponse) => {
|
||||||
let path = req.getRequestURI()
|
let ctx: Context = { request: req, response: resp, params: {}, body: {} }
|
||||||
if (!this.methodMappings.has(path)) return this.notFound(req.getMethod(), path)
|
|
||||||
let mappings = this.methodMappings.get(req.getRequestURI())
|
|
||||||
let handler = mappings.get(req.getMethod()) || mappings.get("ALL")
|
|
||||||
if (!handler) return this.notFound(req.getMethod(), path)
|
|
||||||
let ctx: Context = { request: req, response: resp, params: {}, body: {}, handler }
|
|
||||||
ctx.url = req.getRequestURI()
|
ctx.url = req.getRequestURI()
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
ctx.headers = { __noSuchProperty__: (name: string) => req.getHeader(name) }
|
ctx.headers = { __noSuchProperty__: (name: string) => req.getHeader(name) }
|
||||||
@@ -250,6 +270,10 @@ export class Server {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
let path = ctx.request.getRequestURI()
|
||||||
|
if (!this.methodMappings.has(path)) return this.notFound(ctx)
|
||||||
|
let mappings = this.methodMappings.get(ctx.request.getRequestURI())
|
||||||
|
ctx.handler = mappings.get(ctx.request.getMethod()) || mappings.get("ALL")
|
||||||
ctx.result = this.execRequestHandle(ctx)
|
ctx.result = this.execRequestHandle(ctx)
|
||||||
for (const [_, interceptor] of this.interceptors) {
|
for (const [_, interceptor] of this.interceptors) {
|
||||||
if (interceptor.postHandle) {
|
if (interceptor.postHandle) {
|
||||||
@@ -283,6 +307,7 @@ Handle Time : ${Date.now() - startTime}ms
|
|||||||
}
|
}
|
||||||
|
|
||||||
private execRequestHandle(ctx: Context) {
|
private execRequestHandle(ctx: Context) {
|
||||||
|
if (!ctx.handler) return this.notFound(ctx)
|
||||||
try {
|
try {
|
||||||
return ctx.handler(ctx)
|
return ctx.handler(ctx)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ccms/websocket",
|
"name": "@ccms/websocket",
|
||||||
"version": "0.8.2",
|
"version": "0.8.4",
|
||||||
"description": "MiaoScript websocket package",
|
"description": "MiaoScript websocket package",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"miaoscript",
|
"miaoscript",
|
||||||
@@ -19,10 +19,10 @@
|
|||||||
"test": "echo \"Error: run tests from root\" && exit 1"
|
"test": "echo \"Error: run tests from root\" && exit 1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@ccms/nashorn": "^0.8.2",
|
"@ccms/nashorn": "^0.8.4",
|
||||||
"@javatypes/tomcat-websocket-api": "^0.0.2",
|
"@javatypes/tomcat-websocket-api": "^0.0.2",
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"typescript": "^3.9.5"
|
"typescript": "^3.9.6"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
"module": "commonjs",
|
"module": "commonjs",
|
||||||
"strict": true,
|
"strict": true,
|
||||||
"strictNullChecks": false,
|
"strictNullChecks": false,
|
||||||
|
"importHelpers": true,
|
||||||
"sourceMap": true,
|
"sourceMap": true,
|
||||||
"declaration": true,
|
"declaration": true,
|
||||||
"declarationMap": true,
|
"declarationMap": true,
|
||||||
|
|||||||
Reference in New Issue
Block a user