# Hummingbird
**Repository Path**: lineCodeJm/hummingbird
## Basic Information
- **Project Name**: Hummingbird
- **Description**: Hummingbird 是一套开源的 JavaScript 运行引擎。设计的初衷是为了敏捷开发,尽量做到省时省力。
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-09-21
- **Last Updated**: 2022-09-21
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Hummingbird
---
- 介绍:
Hummingbird 是一套开源 的JavaScript 运行引擎。设计的初衷是为了敏捷开发,尽量做到省时省力。
- Hummingbird 可以做什么?
1. 搭建你所需的网络测试平台,集成tcp,http,udp客户端与服务端
2. 监控本地资源,分析程序内存大小,可对其重启操作。
3. 内置mysql驱动模块,通过内置api可以轻松调用。
- 为什么用Hummingbird ?
1. 一旦保存编辑的代码,即可快速编译运行,无需手动编译。
2. 无需记住过多API,采用xml配置方式快速完成初始化。
3. 避免回调地狱,改造Node.js的原有api,将异步函数改为同步。
Hummingbird只遵循一种原则:**简单易用**。
> 欢迎大家 Star或Fork :[https://gitee.com/QdbcShen/hummingbird](https://gitee.com/QdbcShen/hummingbird)
## 快速开始
**目标:** 向控制台输出hello world
1. 下载红色边框内的执行程序:
[https://gitee.com/QdbcShen/hummingbird/releases/](https://gitee.com/QdbcShen/hummingbird/releases/)

2. 在Hummingbird程序路径下创建Hconfig.xml,内容如下:
```xml
```
3. 启动Hummingbird,在控制台你会看到打印字符串

## Hconfig.xml说明
### Hconfig.xml的基础框架
在上面的标题下,贴的Hummingbird依赖的基础xml文件。下面介绍Hconfig.xm里面的内容:
第一行为程序xml版本号,编码默认utf-8
```xml
```
标签Hummingbird为根节点,vesion为版本号。
```xml
```
Hummingbird标签有三个标签:分别为jsparams,jscode,jsinit。这三个标签建议不要缺少,因为他们是保证Hummingbird运行基础标签。
### jsinit标签
用以配置js代码初始化工作,不需要写相关的js的代码。配置相关标签即可完成初始化。以下包含与初始化有关的子标签。
#### Interval定时器标签
- 示例:配置定时器的时间:1秒在标签写上1s。
```xml
1s
```
- 说明:标签内可写内容为数字加上时间单位,单位需要小写,仅支持以下单位:秒(s),分(m),时(h)。配置完成后,会触发回调Interval函数。
#### log日志标签
- 示例:设置日志保存时间为48小时,分割时间为24小时
```xml
```
- 说明:属性maxage为日志分割时间,单位48小时。属性RotationTime 若此项不配置,日志为24小时保存一次,永久保存。
#### Database连接数据库标签
- 示例:连接本地mysql下的test库
```xml
root:@(127.0.0.1:3306)/test
```
- 说明:子级标签conname中写入数据库连接url,即可连接成功mysql。后续调用js函数访问数据库。
#### http标签
- 示例:绑定http服务器端口8080
```xml
```
- 说明:属性bindaddress表示绑定服务器的地址,用ip加端口号表示。这里开启http服务,会触发回调httprecv函数。
#### tcp标签
- 示例:绑定tcp服务60000端口
```xml
```
- 说明:属性bindaddress表示绑定服务器的地址,用ip加端口号表示。这里开启tdp服务,会触发回调tdprecv函数。
----
- 示例: 连接端口为60000的tcp服务
```xml
```
- 说明:属性connect表示连接哪台服务,用ip加端口号表示。后续可通过内置tcp对象读取或发送网络数据。
#### udp标签
- 示例:绑定udp服务60000端口
```xml
```
- 说明:属性bindaddress表示绑定服务器的地址,用ip加端口号表示。这里开启udp服务,会触发回调udprecv函数。
----
- 示例: 连接端口为60000的udp服务
```xml
```
- 说明:属性connect表示连接哪台服务,用ip加端口号表示。后续可通过内置ucp对象读取或发送网络数据。
### jscode标签
用以放置执行的JavaScript(简称js)代码和相关js引用。属性loadfromfile用于加载外部js文件。以下为子标签。
#### script标签
- script标签无属性,标签内部编写js代码。**若同时使用jscode的loadfromfile属性,loadfromfile中加载的js代码将失效。**
- 属性src可以引用外部的js代码,有http访问或者本地文件加载两者方式。
下面代码为通过http访问的方式引用moment.js模块
```xml
```
### jsparams标签
用以使用Hconfig.xml内部的参数数据。以下为子标签。
#### params标签
- 示例:设置id为学生,姓名lixiang(理想),年龄20的参数数据。
```xml
lixiang
20
```
- 说明:属性id数参数的唯一标识,可定义多个params,不能重复。子级标签arg写入参数值。通过Getjsparamsbyid函数传入属性id,返回对象属性获取arg数值。
## API接口
### 初始化及网络回调函数
#### init 初始化
```javascript
function init() {}
```
参数:无
---
说明:子标签script下的init函数在jsinit配置项下的所有配置完成后触发调用。
示例:引用moment.js模块,并在init函数中输出格式化时间。仅展示代码 部分。
```xml
```
#### httprecv 服务端接受http数据
```javascript
function httprecv(req,res){}
```
参数req:接受客户端的请求数据
类型:Object
包含的属性:
|属性名| 类型 |备注|
|--|--|--|
| Body | string |http请求体的body数据|
| Method| string |http请求方式:post,get等|
| Path| string |url的路由路径|
| Querys| object| 请求的查询参数|
| RemoteAddr| string | 请求地址,这里地址包含端口号。|
---
参数res:返回客户端的数据
包含的属性:
|属性名| 类型 |备注|
|--|--|--|
| write(string)| function |向客户端发送数据,数据类型为字符串|
---
说明:在使用tcprecv函数前,需设置tcp标签绑定端口。子标签script下的tcprecv函数在接受客户端数据时触发调用。
示例:服务端绑定60000端口,接受客户端数据并向客户端发送数据。仅展示代码部分和配置项。
```xml
```
```xml
```
#### tcprecv 服务端接受tcp数据
```javascript
function tcprecv(req,res){}
```
参数req:接受客户端的请求数据
类型:Object
包含的属性:
|属性名| 类型 |备注|
|--|--|--|
| Address| string |服务器地址,包括端口|
| Data| string |接受到客户端的数据|
---
参数res:返回客户端的数据
类型:Object
包含的属性:
|属性名| 类型 |备注|
|--|--|--|
| write(string)| function |向客户端发送数据,数据类型为字符串|
---
说明:在使用tcprecv函数前,需设置tcp标签绑定端口。子标签script下的tcprecv函数在接受客户端数据时触发调用。
示例:服务端绑定60000端口,接受客户端数据并向客户端发送数据。仅展示代码部分和配置项。
```xml
```
```xml
```
#### udprecv 服务端接受udp数据
```javascript
function udprecv(req,res){}
```
参数req:接受客户端的请求数据
类型:Object
包含的属性:
|属性名| 类型 |备注|
|--|--|--|
| Address| string |服务器地址|
| Port|int|客户端端口号|
| Data| string |接受到客户端的数据|
---
参数res:返回客户端的数据
类型:Object
Object属性:
|属性名| 类型 |备注|
|--|--|--|
| write(string)| function |向客户端发送数据,数据类型为字符串|
---
说明:在使用udprecv函数前,需设置udp标签绑定端口。子标签script下的udprecv函数在接受客户端数据时触发调用。
示例:服务端绑定60000端口,接受客户端数据并向客户端发送数据。仅展示代码部分和配置项。
```xml
```
```xml
```
### 系统相关与资源监控
#### tcp对象
用于发送tcp数据的对象。其属性如下:
|属性名| 类型 |备注|
|--|--|--|
| write(string)| function |向服务端发送数据,数据类型为字符串|
| read()| function |接受服务端数据,如果接收不到数据,为阻塞状态|
---
说明:在使用tcp对象前,需设置tcp标签的连接端口。
示例:向务端60000端口发送和读取数据。仅展示代码部分和配置项。
```xml
```
```xml
```
#### upd对象
用于发送udp数据的对象。其属性如下:
|属性名| 类型 |备注|
|--|--|--|
| write(string)| function |向服务端发送数据,数据类型为字符串|
| read()| function |接受服务端数据,如果接收不到数据,为阻塞状态|
---
说明:在使用udp对象前,需设置udp标签的连接端口。
示例:向务端60000端口发送和读取数据。仅展示代码部分和配置项。
```xml
```
```xml
```
#### HttpSend 向服务发起请求
```javascript
HttpSend(method,url,msg)
```
参数method:http请求方式,填post,get等小写字符串
类型:String
---
参数url:http请求地址,可在后面拼接查询参数
类型:String
---
参数msg:在http的body中写入数据,一般填json
类型:String
---
返回值:无
---
应用:模拟向http服务器发起请求数据。
示例:用get方式向服务器发送姓名为张三(zhangsan)的查询参数
```xml
```
#### Getmemory 获取内存大小
```javascript
Getmemory(programname)
```
参数programname:程序名
类型:String
---
返回值:返回某进程内存大小,如果此进程不存在,返回值为-1。
类型:int
---
限制:无法获取多个重名进程的内存大小。
示例:获取Notepad++内存大小
```javascript
function init() {
var memsize = Getmemory("Notepad++.exe")
console.log(memsize + "KB");
}
```
#### Restartprocess 重启进程
```javascript
Restartprocess(fullname)
```
参数fullname:程序的完整路径名,路径斜杠使用正斜杠
类型:String
---
返回值:无
---
示例:重启Notepad++进程
```javascript
function init() {
Restartprocess("C:/Program Files/Notepad++.exe")
}
```
#### Restartservice 重启服务
```javascript
Restartservice(servicename)
```
参数servicename:服务名
类型:String
---
返回值:无
---
限制:使用此函数重启服务需要管理员权限。若服务不存在则无法启动,服务未运行则会启动,服务运行则重启启动。
---
示例:重启MySQL服务
```javascript
function init() {
Restartservice("MySQL")
}
```
#### filemove 移动文件
```javascript
filemove(src,dst)
```
参数src:原先文件的完整路径名,路径斜杠使用正斜杠
类型:String
参数dst:目的文件的完整路径名,路径斜杠使用正斜杠
类型:String
---
返回值:无
---
示例:将Hummingbird图片从D盘1目录移动到2目录
```javascript
function init() {
filemove("D:/1/Hummingbird.jpg","D:/2/NewHummingbird.jpg")
}
```
#### findfiles 查找文件名
```javascript
findfiles(filename)
```
参数filename:文件完整路径名,路径斜杠使用正斜杠。文件名支持通配符匹配规则
类型:String
---
返回值:返回匹配的文件名字符串数组
类型:Array
---
示例:查询以1开头的所有图片
```xml
```
#### copyfile 复制文件
```javascript
copyfile(src,dst)
```
参数src:原先文件名,路径斜杠使用正斜杠
类型:String
参数dst:复制的目的文件名,路径斜杠使用正斜杠
类型:String
---
返回值:无
---
示例:将Hummingbird图片从D盘1目录复制到2目录
```javascript
function init() {
filemove("D:/1/Hummingbird.jpg","D:/2/NewHummingbird.jpg")
}
```
#### writefile 写入文件
```javascript
writefile(filename,data)
```
参数filename:文件的完整路径名,路径斜杠使用正斜杠
类型:String
参数data:写入文件的内容,编码为utf-8格式
类型:String
---
返回值:无
---
限制:写入的文件名所在的路径必须存在。如果文件的内容已经存在,则会覆盖写入
---
示例:在D盘下写入一段内容
```javascript
function init() {
writefile("D:/1/1.txt","hello Hummingbird")
}
```
#### readfile 读取文件
```javascript
readfile(filename)
```
参数filename:文件的完整路径名,路径斜杠使用正斜杠
类型:String
---
返回值:文件内容,编码为utf-8格式
类型:String
---
示例:读取D盘下的文件内容
```javascript
function init() {
console.log(readfile("D:/1.txt"));
}
```
#### filestate 获取文件信息
```javascript
filestate(filename)
```
参数filename:文件的相对或者绝对路径,路径斜杠为正斜杠
类型:String
---
返回值:文件信息对象
类型:Object
Object属性:
|属性名| 类型 |备注|
|--|--|--|
| IsDir| Boolean|是否是目录,真(ture)是目录,假(false)为文件|
| ModTime| String|文件修改的时间,时间格式:YYYY-MM-DD HH:mm:ss.SSS|
| Name| String|文件名|
|Size|Int|文件大小,单位是字节|
---
应用:读取存在的文件中的内容,以字符串返回
---
示例:输出D盘下的图片文件信息
```javascript
function init(){
var info = filestate("D:/1.jpg")
console.log(JSON.stringify(info));
}
```
#### dirstate 获取目录下所有文件信息
```javascript
dirstate (filename)
```
参数filename:目录相对或者绝对路径,路径斜杠为正斜杠
类型:String
---
返回值:目录信息对象**数组**
类型:Object
数组中Object属性:
|属性名| 类型 |备注|
|--|--|--|
| IsDir| Boolean|是否是目录,真(ture)是目录,假(false)为文件|
| ModTime| String|目录修改的时间,时间格式:YYYY-MM-DD HH:mm:ss.SSS|
| Name| String|目录或文件名|
|Size|Int|文件或目录大小,单位是字节|
---
示例:遍历输出D盘下的文件以及目录信息
```xml
```
#### mkdir 创建目录
```javascript
mkdir(filename)
```
参数filename:目录相对或者绝对路径,路径斜杠为正斜杠
类型:String
---
返回值:无
---
示例:遍历输出D盘下创建目录1及子级目录2
```javascript
function init(){
mkdir("D:/1/2")
}
```
#### filerename 重命名文件或目录
```javascript
filerename (src,dst)
```
参数src:要修改的文件/目录名,需拼接所在路径的相对或者绝对路径,路径斜杠为正斜杠。
类型:String
---
参数dst:修改后的文件/目录名,需拼接所在路径的相对或者绝对路径,路径斜杠为正斜杠。
类型:String
---
返回值:无
---
示例:将D盘下创建目录1改为目录2
```javascript
function init(){
filerename("D:/1","D:/22")
}
```
#### fileremove 删除文件或者目录
```javascript
filerename (filename)
```
参数filename:文件/目录名,需拼接所在路径的相对或者绝对路径,路径斜杠为正斜杠。
类型:String
---
返回值:无
---
示例:删除D盘下的目录1
```javascript
function init(){
fileremove("D:/1")
}
```
#### RemoveBeforeHour 删除几小时之前的文件
```javascript
RemoveBeforeHour(filename,hour)
```
参数filename:文件/目录名,需拼接所在路径的相对或者绝对路径,路径斜杠为正斜杠。
类型:String
---
参数hour:删除文件的小时数
类型:Int
---
返回值:无
---
示例:删除D盘下的目录1中一小时之前的文件
```javascript
function init(){
RemoveBeforeHour("D:/1",1)
}
```
#### sleep 程序睡眠
```javascript
sleep(Millisec)
```
参数Millisec:让程序自动暂停毫秒数
类型:int
---
返回值:无
---
应用:在js代码运行期间,通过调用此函数暂停一段时间。
---
示例:让程序暂停一秒钟
```xml
```
#### Getjsparamsbyid 获取xml中jsparams的子标签参数
```javascript
function Getjsparamsbyid(id)
```
参数id:填写子标签params标签的id属性值
---
示例:根据id为student,获取学生的姓名与年龄,仅展示代码部分和配置项。
```xml
lixiang
20
```
```xml
```
### log 向log文件下写入当天的info日志
```javascript
log(data)
```
参数data:与console.log类似,可传入任意类型,若有多个参数,以逗号间隔。
类型:any
---
返回值:无
---
示例:向日志中写入字符串
```xml
```
### 数据库
#### mysql对象
用于操作mysql数据库。其属性如下:
|属性名| 类型 |备注|
|--|--|--|
| exec(string)| function |执行sql语句,常用于update,insert,delete等|
| select(string)| function |执行并查询sql语句,返回值为对象数组,常用于select|
---
说明:在使用mysql对象前,需设置Database标签的连接数据库。数据库编码建议使用utf-8
示例:连接test数据库,创建学生表(student),插入与查询学生信息。
```xml
root:@(127.0.0.1:3306)/test
```
```xml
```
## 补充
- js只兼容到es5,暂不支持es6。
- 写js程序时建议加上\标签,以防止与xml标签冲突。
- 更多是示例转至源码中example中阅览,地址[https://gitee.com/QdbcShen/hummingbird/tree/master/example](https://gitee.com/QdbcShen/hummingbird/tree/master/example)
- console.log并不能铺开对象属性,需要手动将其转成json字符串。
- js调用的api函数的调试信息在log下的debug中。
- 所有的异常均在控制台界面以红色字体显示,并捕捉到在log下的warn日志中。
---
示例:手动抛出一段测试异常,在控制台中看到红色警告提示。
```xml
```

## 开源许可
遵循 Apache-2.0 开源协议,细节请阅读项目中的 LICENSE 文件内容。