全局对象
global
全局变量
server
ts
class Server{
//监听请求
async watchRequest(req:Request,scopeKey:ScopeKey):void|Error{}
//监听响应
async watchResponse(res:Response,scopeKey:ScopeKey):void|Error{}
//监听消息
async watchMessage(msg:Message,scopeKey:ScopeKey):void|Error{}
//拦截请求
async onRequest(req:Request,scopeKey:ScopeKey):HttpAction|Error{}
//拦截响应
async onResponse(res:Response,scopeKey:ScopeKey):Response|Error{}
//拦截消息
async onMessage(msg:Message,scopeKey:ScopeKey):WsAction|Error{}
//当网页端被注入时
async onClientOpen(sessionType:string,sessionId:string,scopeKey:ScopeKey):void|Error{}
//当网页端长连接与服务器断开
async onClientClose(sessionType:string,sessionId:string,scopeKey:ScopeKey):void|Error{}
//服务端对外暴露的接口 当访问 POST https://<插件ID>.plugin.cthulhu.server/server/ask?key=<Key>&scopeId=<scopeId>,body => value,将会把请求转发到这个函数
async onAsk(key:string,value:any,scopeKey:ScopeKey): { code:number,msg?:string,data?:any }{}
//处理动态js,当访问GET https://<插件ID>.plugin.cthulhu.server/dynamic/<link>时,将会把请求转发到这个函数
async dynamicScript(link:string,scopeKey:ScopeKey):string|Error{}
//给sessionId对应的页面中派发一个事件
async sendEvent(sessionId:string,eventType:string,eventBody:object):void|Error{}
//给sessionId对应的页面中发送一个脚本,立即执行
async sendScript(sessionId:string,script:string):void|Error{}
//设置页面的csp,由服务器统一处理之后返回
set csp(v:string){}
}
store
ts
class Store{
//打开或者新建一个tree 数据库
openTree(treeName:string):Tree {}
//删除一个tree 数据库
dropTree(treeName:string) {}
//返回所有tree数据库的名称
treeNames():[string] {}
}
Tree
ts
class Tree{
set(key:string,value:any):void|Error {}
sets(kvs:object):void|Error {}
get(key:string):any|Error {}
gets(keys:[string]):object|Error {}
getWith(prefix:string):object|Error {}
remove(key:string):any|Error {}
removes(keys:[string]):object|Error {}
removeWith(prefix:string):object|Error {}
clear():void|Error {}
keys():[string]|Error {}
contains(key:string):boolean|Error {}
//遍历具有指定key前缀的值
iterWith(prefix:string,fn:(key:string,value:any)=>void):object|Error {}
//统计指定前缀的key数量
countWith(prefix:string):number|Error {}
//将所有的操作手动写入硬盘
flush():void|Error {}
//开启一个事务
transaction(key:string,fn:()=>any):any|Error {}
}
console
ts
class Console {
log(msg:any):void|Error{}
debug(msg:any):void|Error{}
warn(msg:any):void|Error{}
error(msg:any):void|Error{}
}
HTTP api
http协议相关api
Uri
url对象
ts
class Uri {
constructor(url:string):Uri {}
get scheme():string{}
get authority():string{}
get port():number|-1{}
get host():string{}
get path():string{}
get params():object{}
}
Headers
http请求/响应头
ts
class Headers {
constructor():Headers {}
/**
* 通过key获取对应的header值
* @param key header key
*/
get(key: string): string | undefined {}
/**
* 设置header key对应的值,header key只会有一个
* @param key header key
* @param value header value
*/
insert(key: string, value: string) {}
/**
* 设置header key对应的值,允许多个相同的header key存在
* @param key header key
* @param value header value
*/
append(key: string, value: string) {}
/**
* 通过key删除所有对应的header值
* @param key header key
*/
remove(key: string): string | undefined {}
/**
* 返回所有的header key
*/
keys(): [string] {}
/**
* 清空header
*/
clear() {}
}
Body
http请求/响应体
ts
class Body {
static empty(): Body {}
static str(s:string): Body {}
static bytes(s:Uint8Array): Body {}
static file(file:File): Body {}
async toBytes():Uint8Array|Error{}
}
Request
http请求
ts
class Request {
constructor(method?: string, url?: string, headers?: object, body?:Body): Request | Error {}
/**
* GET,POST,PUT,DELETE.OPTION,CONNECT,HEAD,TRACE,PATCH
* @param v
*/
set method(v: string) {}
get method(): string {}
set uri(v: string) {}
get uri(): Uri {}
/**
* HTTP/0.9 HTTP/1.0 HTTP/1.1 HTTP/2.0 HTTP/3.0
* @param v
*/
set version(v: string) {}
get version(): string {}
set headers(v: Headers) {}
get headers(): Headers {}
set body(v: Body) {}
get body(): Body {}
}
Response
http响应
ts
class Response {
constructor(status?: number, headers?: object, body?:Body): Response | Error {}
set status(v: number) {}
get status(): number {}
/**
* HTTP/0.9 HTTP/1.0 HTTP/1.1 HTTP/2.0 HTTP/3.0
* @param v
*/
set version(v: string) {}
get version(): string {}
set headers(v: Headers) {}
get headers(): Headers {}
set body(v: Body) {}
get body(): Body {}
}
HttpAction
对请求的操作
ts
class HttpAction {
//将请求拦截 服务器返回500
static reject(): HttpAction {}
//将该请求放行
static release(req: Request): HttpAction {}
//直接响应该请求
static respond(res: Response): HttpAction {}
//给该请求添加代理 然后放行
static proxy(req: Request, cfg: { proxy: string, ja3: number, h2: number } | undefined): HttpAction {}
}
fetch
发起http请求
ts
async function fetch(req: Request, cfg: { proxy: string, ja3: number, h2: number } | undefined): Response | Error {}
WebSocket api
FrameHeader
FrameHeader frame消息头
ts
class FrameHeader {
/**
*
* @param isFinal 指示该帧是可能分段的消息中的最后一帧。
* @param rsv1 rsv2 rsv3 保留用于协议扩展。
* @param opcode WebSocket协议操作码 例如"data:continue" "control:pong"
* data:continue|text|binary
* control:close|ping|pong
* @param mask 掩码(可选),长度为4
*/
constructor(isFinal:boolean,rsv1:boolean,rsv2:boolean,rsv3:boolean,opcode:string,mask?:Int8Array) {}
}
Message
WebSocket 消息体
ts
class Message {
static text(msg: string): Message {}
static binary(msg: Int8Array): Message {}
static frame(header: FrameHeader, payload: Int8Array): Message {}
toText(): string | Error {}
toBytes(): Int8Array {}
type(): string {}
len(): number {}
}
WsAction
对WebSocket 消息体的操作
ts
class WsAction{
static ignore():WsAction{}
static release(msg:Message):WsAction{}
static respond(msg:Message):WsAction{}
}
文件相关
Metadata
文件或文件夹元数据
ts
class Metadata {
isFile():boolean{}
isDir():boolean{}
isSymlink():boolean{}
lastAccessTime():number{}
lastWriteTime():number{}
creationTime():number{}
fileSize():number{}
len():number{}
}
Path
文件或文件夹路径
ts
class Path {
constructor(path: string): Path{}
isFile(): boolean {}
isDir(): boolean {}
isSymlink(): boolean {}
isAbsolute(): boolean {}
isRelative(): boolean {}
extension(): string|undefined {}
fileName(): string|undefined {}
fileStem(): string|undefined {}
metadata(): Metadata|undefined {}
toPath(base:string): Path|Error {}
toLogicalPath(base:string): Path|Error {}
exists(): boolean {}
}
File
文件对象
ts
type OpenCfg = {
read?: boolean,
write?: boolean,
append?: boolean,
create?: boolean,
createNew?: boolean,
truncate?: boolean,
};
class File {
constructor(path: string, cfg?: OpenCfg): File | Error {}
metadata(): Metadata {}
async writeBytes(bytes: Int8Array): void | Error {}
async readBytes(): Int8Array | Error {}
}
通用类
Scope
客户端域
ts
class Scope{
get id():string{}
// 客户端ip
get ip():string{}
//页面协议 http https
get scheme():string{}
//页面域名
get host():string{}
//客户端ua
get ua():string{}
//用户邮箱
get email():string{}
//窗口id
get window():string{}
//页面id
get tab():string{}
//frame id
get frame():string{}
//自定义值
get custom():string{}
}
StrUtils
字符串工具类
ts
class StrUtils{
//将字符串hash为指定长度的字符串
static hashstr(str:string,size:number):string{}
static strToBytes(str:string):Int8Array{}
static bytesToUtf8(bytes:Int8Array):Int8Array{}
//匹配 * ?两种模式的字符串
static miniMatch(pattern: string, target: string):boolean{}
static urlDecode(text: string):string{}
static urlEncode(text: string):string{}
static base64Decode(bytes: Int8Array):string{}
static base64Encode(text: string):string{}
}