Skip to content

全局对象

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{}
}

Released under the MIT License.