精简代码,新增 js 类型提示

This commit is contained in:
dragon
2025-11-21 15:20:02 +08:00
parent 277f7e4226
commit 307f3b6f9f
5 changed files with 204 additions and 26 deletions

View File

@@ -1,35 +1,22 @@
const name = (request.getQuery("name"))?.trim();
if (!name) {
throw new Error(`Missing or empty name parameter`);
}
const name = request.getQuery("name")?.trim();
if (!name) throw new Error('Missing or empty name parameter');
const ws = websocket();
async function eventPull() {
const eventPull = async () => {
while (true) await ws.writeText(await event.load('messages'));
};
const messagePull = async () => {
while (true) {
const data = await event.load('messages')
await ws.writeText(data);
}
}
async function messagePull() {
while (true) {
const data = await ws.readText()
if (data === "exit")
await event.put("messages", JSON.stringify({
name:name,
data: name+' 已断开连接'
}));
break;
const data = await ws.readText();
if (data?.trim()) {
await event.put("messages", JSON.stringify({
name:name,
data: data.trim()
name: name,
data: data === "exit" ? `${name} 已断开连接` : data.trim()
}));
}
if (data === "exit") break;
}
}
(async () => {
await Promise.any([eventPull(), messagePull()])
})()
};
(async () => await Promise.any([eventPull(), messagePull()]))();

2
global-types/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
node_modules
dist

125
global-types/globals.d.ts vendored Normal file
View File

@@ -0,0 +1,125 @@
// goja.d.ts
declare global {
// WebSocket 相关类型
interface WebSocketConnection {
TypeTextMessage: number;
TypeBinaryMessage: number;
readText(): Promise<string>;
read(): Promise<{
type: number;
data: Uint8Array;
}>;
writeText(data: string): Promise<void>;
write(mType: number, data: string | Uint8Array): Promise<void>;
}
function websocket(): Promise<WebSocketConnection>;
// Event 相关类型
interface EventSystem {
load(key: string): Promise<any>;
put(key: string, value: string): Promise<void>;
}
// @ts-ignore
const event: EventSystem;
// Request 相关类型
interface RequestObject {
method: string;
url: URL;
rawPath: string;
host: string;
remoteAddr: string;
proto: string;
httpVersion: string;
path: string;
query: Record<string, string>;
headers: Record<string, string>;
get(key: string): string | null;
getQuery(key: string): string;
getHeader(name: string): string;
getHeaderNames(): string[];
getHeaders(): Record<string, string>;
getRawHeaderNames(): string[];
hasHeader(name: string): boolean;
readBody(): Uint8Array;
protocol: string;
}
const request: RequestObject;
// Response 相关类型
interface CookieOptions {
maxAge?: number;
expires?: number;
path?: string;
domain?: string;
secure?: boolean;
httpOnly?: boolean;
sameSite?: "lax" | "strict" | "none";
}
interface ResponseObject {
setHeader(key: string, value: string): void;
getHeader(key: string): string;
removeHeader(key: string): void;
hasHeader(key: string): boolean;
setStatus(statusCode: number): void;
statusCode(statusCode: number): void;
write(data: string): void;
writeHead(statusCode: number, headers?: Record<string, string>): void;
end(data?: string): void;
redirect(location: string, statusCode?: number): void;
json(data: any): void;
setCookie(name: string, value: string, options?: CookieOptions): void;
}
const response: ResponseObject;
// KV 存储相关类型
interface KVListResult {
keys: string[];
cursor: string;
hasNext: boolean;
}
interface KVOps {
get(key: string): Promise<string | null>;
set(key: string, value: string): Promise<void>;
delete(key: string): Promise<boolean>;
putIfNotExists(key: string, value: string): Promise<boolean>;
compareAndSwap(key: string, oldValue: string, newValue: string): Promise<boolean>;
list(limit?: number, cursor?: string): Promise<KVListResult>;
}
interface KVSystem {
repo(group: string): Promise<KVOps>;
org(group: string): Promise<KVOps>;
}
const kv: KVSystem;
// Console 相关 (假设通过 require 引入)
interface Console {
log(...args: any[]): void;
warn(...args: any[]): void;
error(...args: any[]): void;
info(...args: any[]): void;
debug(...args: any[]): void;
}
// @ts-ignore
const console: Console;
}
export {};

45
global-types/package-lock.json generated Normal file
View File

@@ -0,0 +1,45 @@
{
"name": "@d7z-project/gitea-pages",
"version": "0.0.1-rc1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@d7z-project/gitea-pages",
"version": "0.0.1-rc1",
"dependencies": {
"@dop251/types-goja_nodejs-url": "^0.0.0-20251015174255-5e94316bedaf"
},
"devDependencies": {
"typescript": "next"
}
},
"node_modules/@dop251/types-goja_nodejs-global": {
"version": "0.0.0-20251015174255-5e94316bedaf",
"resolved": "https://registry.npmmirror.com/@dop251/types-goja_nodejs-global/-/types-goja_nodejs-global-0.0.0-20251015174255-5e94316bedaf.tgz",
"integrity": "sha512-K54niz+UY67vH4IYfGJztG049z6RdtZfNGoI6VPC97NtRUR16D/k+iwg6dnbppuj/uBwCowimI+Qj9dWheucpg=="
},
"node_modules/@dop251/types-goja_nodejs-url": {
"version": "0.0.0-20251015174255-5e94316bedaf",
"resolved": "https://registry.npmmirror.com/@dop251/types-goja_nodejs-url/-/types-goja_nodejs-url-0.0.0-20251015174255-5e94316bedaf.tgz",
"integrity": "sha512-h9v7QtZydYruGj7vdIe/KSCqeywv8L0XruaH3wzSHb7A0PZtaQxRr4ANpKGoTxqPrLYfqbQaG7IRAbg/ylEBEA==",
"dependencies": {
"@dop251/types-goja_nodejs-global": "0.0.0-20251015174255-5e94316bedaf"
}
},
"node_modules/typescript": {
"version": "6.0.0-dev.20251121",
"resolved": "https://registry.npmmirror.com/typescript/-/typescript-6.0.0-dev.20251121.tgz",
"integrity": "sha512-TrGhGS4hOAKgwizhMuH/3pbTNNBMCpxRA7ia8Lrv4HRMOAOzI5lWhP5uoKRDmmaF3pUVe90MBYjSieM498zUqQ==",
"dev": true,
"license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=14.17"
}
}
}
}

19
global-types/package.json Normal file
View File

@@ -0,0 +1,19 @@
{
"name": "@d7z-project/gitea-pages",
"version": "0.0.1",
"types": "globals.d.ts",
"scripts": {
"test": "tsc --noEmit"
},
"devDependencies": {
"typescript": "next"
},
"repository": {
"type": "git",
"url": "git+https://github.com/d7z-project/gitea-pages.git"
},
"private": false,
"dependencies": {
"@dop251/types-goja_nodejs-url": "^0.0.0-20251015174255-5e94316bedaf"
}
}