This commit is contained in:
2026-01-13 13:28:17 +08:00
parent 5dcc678ad4
commit 03f24318d2
7 changed files with 15 additions and 154 deletions

View File

@@ -1,38 +0,0 @@
name: Publish to npm
on:
push:
tags:
- 'v*.*.*' # 当推送带有版本号的 tag 时触发,例如 v1.0.0
workflow_dispatch: # 添加手动触发器
jobs:
publish:
runs-on: ubuntu-latest
steps:
# Step 1: Clone current Git repository
- name: Checkout this repository
uses: actions/checkout@v3
# Step 3: Setup Node.js and install dependencies
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '20.6'
registry-url: 'https://registry.npmjs.org/'
cache: 'npm' # 启用 npm 缓存,提高安装速度
- name: Configure npm authentication
run: npm config set //registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}
- name: Install dependencies
run: npm install --no-save
- name: Build project
run: npm run build
# Step 6: 发布到 npm
- name: Publish package
run: npm publish
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
# Step 7: 发布成功后,更新版本标签
# - name: Create Git tag
# run: |
# TAG="v$(node -p -e "require('./package.json').version")"
# git tag $TAG
# git push origin $TAG

View File

@@ -21,21 +21,21 @@
"keywords": [],
"author": "abearxiong",
"license": "MIT",
"packageManager": "pnpm@10.26.2",
"packageManager": "pnpm@10.28.0",
"devDependencies": {
"@kevisual/local-proxy": "^0.0.8",
"@kevisual/query": "^0.0.33",
"@kevisual/query": "^0.0.35",
"@rollup/plugin-alias": "^6.0.0",
"@rollup/plugin-commonjs": "29.0.0",
"@rollup/plugin-node-resolve": "^16.0.3",
"@rollup/plugin-typescript": "^12.3.0",
"@types/bun": "^1.3.5",
"@types/node": "^25.0.3",
"@types/node": "^25.0.7",
"@types/send": "^1.2.1",
"@types/xml2js": "^0.4.14",
"@types/ws": "^8.18.1",
"nanoid": "^5.1.6",
"rollup": "^4.54.0",
"rollup": "^4.55.1",
"rollup-plugin-dts": "^6.3.0",
"ts-loader": "^9.5.4",
"ts-node": "^10.9.2",
@@ -43,7 +43,7 @@
"tsx": "^4.21.0",
"typescript": "^5.9.3",
"xml2js": "^0.6.2",
"zod": "^4.2.1",
"zod": "^4.3.5",
"eventemitter3": "^5.0.1",
"ws": "npm:@kevisual/ws"
},
@@ -53,7 +53,7 @@
},
"dependencies": {
"path-to-regexp": "^8.3.0",
"selfsigned": "^5.4.0",
"selfsigned": "^5.5.0",
"send": "^1.2.1"
},
"publishConfig": {

6
pnpm-lock.yaml generated
View File

@@ -8,9 +8,6 @@ importers:
.:
dependencies:
eventemitter3:
specifier: ^5.0.1
version: 5.0.1
path-to-regexp:
specifier: ^8.3.0
version: 8.3.0
@@ -54,6 +51,9 @@ importers:
'@types/xml2js':
specifier: ^0.4.14
version: 0.4.14
eventemitter3:
specifier: ^5.0.1
version: 5.0.1
nanoid:
specifier: ^5.1.6
version: 5.1.6

View File

@@ -20,7 +20,7 @@ export { App } from './app.ts';
export * from './router-define.ts';
export {
export type {
RouterReq,
RouterRes,
OnWebSocketFn,
@@ -31,4 +31,6 @@ export {
WebSocketListenerFun,
HttpListenerFun,
OnListener,
} from './server/server-type.ts';
} from './server/server-type.ts';
export { loadTS } from './auto/load-ts.ts';

View File

@@ -1,6 +0,0 @@
// TODO: Implement IOApp
export class IOApp {
constructor() {
console.log('IoApp');
}
}

View File

@@ -9,7 +9,7 @@ export type AltNames = {
value?: string;
ip?: string;
};
export const createCert = (attrs: Attributes[] = [], altNames: AltNames[] = []) => {
export const createCert = async(attrs: Attributes[] = [], altNames: AltNames[] = []) => {
let attributes = [
{ name: 'countryName', value: 'CN' }, // 国家代码
{ name: 'stateOrProvinceName', value: 'ZheJiang' }, // 州名
@@ -51,7 +51,7 @@ export const createCert = (attrs: Attributes[] = [], altNames: AltNames[] = [])
},
],
};
const pems = generate(attributes, options);
const pems = await generate(attributes, options);
return {
key: pems.private,
cert: pems.cert,

View File

@@ -1,97 +0,0 @@
const http = require('http');
const fs = require('fs').promises;
const path = require('path');
const fetch = require('node-fetch'); // 如果使用 Node.js 18 以上版本,可以改用内置 fetch
const url = require('url');
// 配置远端静态文件服务器和本地缓存目录
const remoteServer = 'https://example.com/static'; // 远端服务器的 URL
const cacheDir = path.join(__dirname, 'cache'); // 本地缓存目录
const PORT = process.env.PORT || 3000;
// 确保本地缓存目录存在
fs.mkdir(cacheDir, { recursive: true }).catch(console.error);
// 获取文件的 content-type
function getContentType(filePath) {
const extname = path.extname(filePath);
const contentType = {
'.html': 'text/html',
'.js': 'text/javascript',
'.css': 'text/css',
'.json': 'application/json',
'.png': 'image/png',
'.jpg': 'image/jpg',
'.gif': 'image/gif',
'.svg': 'image/svg+xml',
'.wav': 'audio/wav',
'.mp4': 'video/mp4'
};
return contentType[extname] || 'application/octet-stream';
}
// 处理请求文件
async function serveFile(filePath, remoteUrl, res) {
try {
// 检查文件是否存在于本地缓存中
const fileContent = await fs.readFile(filePath);
res.writeHead(200, { 'Content-Type': getContentType(filePath) });
res.end(fileContent, 'utf-8');
} catch (err) {
if (err.code === 'ENOENT') {
// 本地缓存中不存在,向远端服务器请求文件
try {
const response = await fetch(remoteUrl);
if (response.ok) {
// 远端请求成功,获取文件内容
const data = await response.buffer();
// 将文件缓存到本地
await fs.writeFile(filePath, data);
// 返回文件内容
res.writeHead(200, { 'Content-Type': getContentType(filePath) });
res.end(data, 'utf-8');
} else {
// 远端文件未找到或错误,返回 404
res.writeHead(404, { 'Content-Type': 'text/plain' });
res.end(`Error 404: File not found at ${remoteUrl}`);
}
} catch (fetchErr) {
// 处理请求错误
res.writeHead(500, { 'Content-Type': 'text/plain' });
res.end(`Server Error: Unable to fetch ${remoteUrl}`);
}
} else {
// 其他文件系统错误
res.writeHead(500, { 'Content-Type': 'text/plain' });
res.end(`Server Error: ${err.message}`);
}
}
}
// 创建 HTTP 服务器
http.createServer(async (req, res) => {
let reqPath = req.url;
// 如果路径是根路径 `/`,将其设置为 `index.html`
if (reqPath === '/') reqPath = '/index.html';
// 构建本地缓存路径和远端 URL
const localFilePath = path.join(cacheDir, reqPath); // 本地文件路径
const remoteFileUrl = url.resolve(remoteServer, reqPath); // 远端文件 URL
// 根据请求路径处理文件或返回 index.html单页面应用处理
await serveFile(localFilePath, remoteFileUrl, res);
// 单页面应用的路由处理
if (res.headersSent) return; // 如果响应已发送,不再处理
// 如果未匹配到任何文件,返回 index.html
const indexFilePath = path.join(cacheDir, 'index.html');
const indexRemoteUrl = url.resolve(remoteServer, '/index.html');
await serveFile(indexFilePath, indexRemoteUrl, res);
}).listen(PORT, () => {
console.log(`Server running at http://localhost:${PORT}`);
});