node-karin 1.15.5 → 1.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +31 -0
- package/dist/adapter-BqlH3u3X.mjs +218 -0
- package/dist/app-DdMQbBEY.mjs +4109 -0
- package/dist/cache-CPcPeo6N.mjs +163 -0
- package/dist/chunk-NzVPYdc1.mjs +21 -0
- package/dist/cli/index.cjs +10900 -1
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.mjs +10770 -10224
- package/dist/file-ZGuqNDd-.mjs +15987 -0
- package/dist/file-dGy9of8-.mjs +268 -0
- package/dist/fsSync-Cf5MWILk.mjs +65 -0
- package/dist/index.d.ts +12235 -12738
- package/dist/index.mjs +2054 -25247
- package/dist/internal-DupfycKE.mjs +597 -0
- package/dist/kv-DZp4UIxg.mjs +192 -0
- package/dist/module/art-template.d.ts +2 -13
- package/dist/module/art-template.mjs +3 -1
- package/dist/module/axios.d.ts +3 -2
- package/dist/module/axios.mjs +5 -2
- package/dist/module/chalk.d.ts +3 -2
- package/dist/module/chalk.mjs +5 -2
- package/dist/module/chokidar.d.ts +3 -2
- package/dist/module/chokidar.mjs +5 -2
- package/dist/module/express.d.ts +2 -1
- package/dist/module/express.mjs +3 -1
- package/dist/module/lodash.d.ts +2 -1
- package/dist/module/lodash.mjs +3 -1
- package/dist/module/log4js.d.ts +3 -2
- package/dist/module/log4js.mjs +5 -2
- package/dist/module/moment.d.ts +2 -1
- package/dist/module/moment.mjs +3 -1
- package/dist/module/node-schedule.d.ts +3 -2
- package/dist/module/node-schedule.mjs +5 -2
- package/dist/module/redis.d.ts +3 -2
- package/dist/module/redis.mjs +5 -2
- package/dist/module/sqlite3.d.ts +3 -2
- package/dist/module/sqlite3.mjs +5 -2
- package/dist/module/ws.d.ts +3 -2
- package/dist/module/ws.mjs +5 -2
- package/dist/module/yaml.d.ts +3 -2
- package/dist/module/yaml.mjs +5 -2
- package/dist/queue-CnKedaZA.mjs +70 -0
- package/dist/redis-aLJ7wbJH.mjs +1556 -0
- package/dist/render-DPqueDZr.mjs +170 -0
- package/dist/root.d.ts +46 -46
- package/dist/root.mjs +136 -93
- package/dist/router-zPSN9-tY.mjs +124 -0
- package/dist/server-DT64D-m-.mjs +38 -0
- package/dist/snapka-BTlnZOyI.mjs +450 -0
- package/dist/sqlite-Dcj9jlW9.mjs +307 -0
- package/dist/start/app.d.ts +1 -1
- package/dist/start/app.mjs +14 -7
- package/dist/start/index.d.ts +1 -1
- package/dist/start/index.mjs +325 -656
- package/dist/template-Djk6y0uC.mjs +133 -0
- package/dist/terminalManager-Lxa8Sm06.mjs +783 -0
- package/dist/uptime-C121X_rq.mjs +210 -0
- package/dist/web/{CompressaPRO-GX.woff2.br → CompressaPRO-GX.woff2} +0 -0
- package/dist/web/assets/css/style-CBB8wM_W.css +14880 -0
- package/dist/web/assets/js/entry-Blf4Trpx.js +258540 -0
- package/dist/web/{googleapis.woff2.br → googleapis.woff2} +0 -0
- package/dist/web/index.html +2 -15
- package/dist/web/karin.png +0 -0
- package/dist/web/sha256.min.js +9 -0
- package/dist/ws-BLDoC2gV.mjs +80 -0
- package/dist/ws-CcoWd3Ar.mjs +106 -0
- package/package.json +7 -7
- package/dist/global.d.d.ts +0 -68
- package/dist/types-hAhbXJDZ.d.ts +0 -109
- package/dist/web/assets/css/components-ep7vm38G.css +0 -1
- package/dist/web/assets/css/index-Dadvd9mn.css.br +0 -0
- package/dist/web/assets/css/vendor-editor-CFbL2ovg.css.br +0 -0
- package/dist/web/assets/css/vendor-others-ZgkIHsf0.css +0 -1
- package/dist/web/assets/js/components-CU2xw4lY.js.br +0 -0
- package/dist/web/assets/js/entry-Dvb7eYLE.js.br +0 -0
- package/dist/web/assets/js/hooks-CRfhs4ON.js.br +0 -0
- package/dist/web/assets/js/page-404.tsx-DYMd_RI_.js +0 -1
- package/dist/web/assets/js/page-dashboard-CG60V_Z-.js.br +0 -0
- package/dist/web/assets/js/page-loading.tsx-wY8a9me3.js.br +0 -0
- package/dist/web/assets/js/page-login.tsx-B54ZOEZB.js.br +0 -0
- package/dist/web/assets/js/utils-C9nWTSuo.js +0 -2
- package/dist/web/assets/js/vendor-editor-BmqYP7lh.js.br +0 -0
- package/dist/web/assets/js/vendor-heroui-ClBCy2zk.js.br +0 -0
- package/dist/web/assets/js/vendor-others-6GiMrjd4.js.br +0 -0
- package/dist/web/assets/js/vendor-react-Dc9jdQiK.js.br +0 -0
- package/dist/web/assets/js/vendor-ui-utils-D0xkboLL.js.br +0 -0
- package/dist/web/assets/js/vendor-visual-saF8KLH_.js.br +0 -0
- package/dist/web/karin.png.br +0 -0
- package/dist/web/sha256.min.js.br +0 -0
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import { a as mkdirSync } from "./fsSync-Cf5MWILk.mjs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import sqlite3 from "sqlite3";
|
|
4
|
+
|
|
5
|
+
//#region src/core/db/redis/mock/sqlite/index.ts
|
|
6
|
+
/**
|
|
7
|
+
* @description 日志前缀
|
|
8
|
+
*/
|
|
9
|
+
const logPrefix = (message) => `[redis-mock] ${message}`;
|
|
10
|
+
/**
|
|
11
|
+
* @description SQLite3封装类,用于Redis模拟的持久化存储 new之后需要调用init方法
|
|
12
|
+
*/
|
|
13
|
+
var SQLiteWrapper = class {
|
|
14
|
+
db;
|
|
15
|
+
#isClosing = false;
|
|
16
|
+
#inTransaction = false;
|
|
17
|
+
dbPath;
|
|
18
|
+
/**
|
|
19
|
+
* 构造函数
|
|
20
|
+
* @param dbPath 数据库路径
|
|
21
|
+
*/
|
|
22
|
+
constructor(dbPath) {
|
|
23
|
+
this.dbPath = dbPath;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 初始化数据库连接和表结构
|
|
27
|
+
*/
|
|
28
|
+
async init() {
|
|
29
|
+
mkdirSync(path.dirname(this.dbPath));
|
|
30
|
+
await new Promise((resolve, reject) => {
|
|
31
|
+
this.db = new sqlite3.Database(this.dbPath, sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE, (err) => {
|
|
32
|
+
if (err) {
|
|
33
|
+
logger.error(logPrefix("SQLite数据库连接失败:"));
|
|
34
|
+
logger.error(err);
|
|
35
|
+
reject(err);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
resolve();
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
await new Promise((resolve) => {
|
|
42
|
+
this.db.exec(`
|
|
43
|
+
PRAGMA foreign_keys = ON;
|
|
44
|
+
PRAGMA journal_mode = WAL;
|
|
45
|
+
PRAGMA synchronous = NORMAL;
|
|
46
|
+
`, (pragmaErr) => {
|
|
47
|
+
if (pragmaErr) {
|
|
48
|
+
logger.warn(logPrefix("设置SQLite PRAGMA失败:"));
|
|
49
|
+
logger.warn(pragmaErr);
|
|
50
|
+
}
|
|
51
|
+
resolve();
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
await new Promise((resolve, reject) => {
|
|
55
|
+
this.db.run(`
|
|
56
|
+
CREATE TABLE IF NOT EXISTS redis_data (
|
|
57
|
+
key TEXT PRIMARY KEY,
|
|
58
|
+
type TEXT NOT NULL,
|
|
59
|
+
expire INTEGER NOT NULL,
|
|
60
|
+
value TEXT NOT NULL
|
|
61
|
+
)
|
|
62
|
+
`, (err) => {
|
|
63
|
+
if (err) {
|
|
64
|
+
logger.error(logPrefix("创建SQLite表失败:"));
|
|
65
|
+
logger.error(err);
|
|
66
|
+
reject(err);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
resolve();
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
return this;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 获取所有键
|
|
76
|
+
* @returns 返回所有键的数组
|
|
77
|
+
*/
|
|
78
|
+
async keys() {
|
|
79
|
+
if (this.#isClosing) throw new Error("数据库正在关闭中");
|
|
80
|
+
return new Promise((resolve, reject) => {
|
|
81
|
+
this.db.all("SELECT key FROM redis_data", [], (err, rows) => {
|
|
82
|
+
if (err) {
|
|
83
|
+
logger.error(logPrefix("获取所有键失败:"));
|
|
84
|
+
logger.error(err);
|
|
85
|
+
reject(err);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
resolve(rows ? rows.map((row) => row.key) : []);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* 获取指定键的数据
|
|
94
|
+
* @param key 键名
|
|
95
|
+
* @returns 返回键的数据或null
|
|
96
|
+
*/
|
|
97
|
+
async get(key) {
|
|
98
|
+
if (!key) return null;
|
|
99
|
+
if (this.#isClosing) throw new Error("数据库正在关闭中");
|
|
100
|
+
return await this.query("SELECT type, expire, value FROM redis_data WHERE key = ?", [key]).then((rows) => rows[0] || null).catch((err) => {
|
|
101
|
+
logger.error(logPrefix(`获取键${key}的值失败:`));
|
|
102
|
+
logger.error(err);
|
|
103
|
+
return null;
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* 设置键值对
|
|
108
|
+
* @param key 键名
|
|
109
|
+
* @param type 类型
|
|
110
|
+
* @param expire 过期时间
|
|
111
|
+
* @param value 值
|
|
112
|
+
* @returns 成功返回true
|
|
113
|
+
*/
|
|
114
|
+
async set(key, value, type, expire = -1) {
|
|
115
|
+
if (!key) throw new Error("键名不能为空");
|
|
116
|
+
if (this.#isClosing) throw new Error("数据库正在关闭中");
|
|
117
|
+
return await this.run("INSERT OR REPLACE INTO redis_data (key, type, expire, value) VALUES (?, ?, ?, ?)", [
|
|
118
|
+
key,
|
|
119
|
+
type,
|
|
120
|
+
expire,
|
|
121
|
+
value
|
|
122
|
+
]).then((changes) => changes > 0).catch((err) => {
|
|
123
|
+
logger.error(logPrefix(`设置键${key}的值失败:`));
|
|
124
|
+
logger.error(err);
|
|
125
|
+
return false;
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* 删除键
|
|
130
|
+
* @param key 键名
|
|
131
|
+
* @returns 成功返回true
|
|
132
|
+
*/
|
|
133
|
+
async del(key) {
|
|
134
|
+
if (!key) return false;
|
|
135
|
+
if (this.#isClosing) throw new Error("数据库正在关闭中");
|
|
136
|
+
return await this.run("DELETE FROM redis_data WHERE key = ?", [key]).then((changes) => changes > 0).catch((err) => {
|
|
137
|
+
logger.error(logPrefix(`删除键${key}失败:`));
|
|
138
|
+
logger.error(err);
|
|
139
|
+
return false;
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* 设置键的过期时间
|
|
144
|
+
* @param key 键名
|
|
145
|
+
* @param expire 过期时间
|
|
146
|
+
* @returns 成功返回true
|
|
147
|
+
*/
|
|
148
|
+
async expire(key, expire) {
|
|
149
|
+
if (!key) return false;
|
|
150
|
+
return await this.run("UPDATE redis_data SET expire = ? WHERE key = ?", [expire, key]).then((changes) => changes > 0).catch((err) => {
|
|
151
|
+
logger.error(logPrefix(`设置键${key}的过期时间失败:`));
|
|
152
|
+
logger.error(err);
|
|
153
|
+
return false;
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* 获取所有数据
|
|
158
|
+
* @returns 返回所有数据的数组
|
|
159
|
+
*/
|
|
160
|
+
async getAllData() {
|
|
161
|
+
if (this.#isClosing) throw new Error("数据库正在关闭中");
|
|
162
|
+
return new Promise((resolve, reject) => {
|
|
163
|
+
this.db.all("SELECT key, type, expire, value FROM redis_data", [], (err, rows) => {
|
|
164
|
+
if (err) {
|
|
165
|
+
logger.error(logPrefix("获取所有数据失败:"));
|
|
166
|
+
logger.error(err);
|
|
167
|
+
reject(err);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
resolve(rows || []);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* 关闭数据库连接
|
|
176
|
+
*/
|
|
177
|
+
async close() {
|
|
178
|
+
if (this.#isClosing) return;
|
|
179
|
+
this.#isClosing = true;
|
|
180
|
+
return new Promise((resolve, reject) => {
|
|
181
|
+
this.db.close((err) => {
|
|
182
|
+
if (err) {
|
|
183
|
+
logger.error(logPrefix("关闭SQLite数据库失败:"));
|
|
184
|
+
logger.error(err);
|
|
185
|
+
this.#isClosing = false;
|
|
186
|
+
reject(err);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
resolve();
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* 开始事务
|
|
195
|
+
*/
|
|
196
|
+
async beginTransaction() {
|
|
197
|
+
if (this.#isClosing) throw new Error("数据库正在关闭中");
|
|
198
|
+
if (this.#inTransaction) {
|
|
199
|
+
logger.warn(logPrefix("已在事务中,跳过开始新事务"));
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
return new Promise((resolve, reject) => {
|
|
203
|
+
this.db.run("BEGIN TRANSACTION", (err) => {
|
|
204
|
+
if (err) {
|
|
205
|
+
logger.error(logPrefix("开始事务失败:"));
|
|
206
|
+
logger.error(err);
|
|
207
|
+
reject(err);
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
this.#inTransaction = true;
|
|
211
|
+
resolve();
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* 提交事务
|
|
217
|
+
*/
|
|
218
|
+
async commitTransaction() {
|
|
219
|
+
if (this.#isClosing) throw new Error("数据库正在关闭中");
|
|
220
|
+
if (!this.#inTransaction) {
|
|
221
|
+
logger.warn(logPrefix("没有活动事务,跳过提交"));
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
return new Promise((resolve, reject) => {
|
|
225
|
+
this.db.run("COMMIT", (err) => {
|
|
226
|
+
if (err) {
|
|
227
|
+
logger.error(logPrefix("提交事务失败:"));
|
|
228
|
+
logger.error(err);
|
|
229
|
+
reject(err);
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
this.#inTransaction = false;
|
|
233
|
+
resolve();
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* 回滚事务
|
|
239
|
+
*/
|
|
240
|
+
async rollbackTransaction() {
|
|
241
|
+
if (this.#isClosing) throw new Error("数据库正在关闭中");
|
|
242
|
+
if (!this.#inTransaction) {
|
|
243
|
+
logger.warn(logPrefix("没有活动事务,跳过回滚"));
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
return new Promise((resolve, reject) => {
|
|
247
|
+
this.db.run("ROLLBACK", (err) => {
|
|
248
|
+
if (err) {
|
|
249
|
+
logger.error(logPrefix("回滚事务失败:"));
|
|
250
|
+
logger.error(err);
|
|
251
|
+
reject(err);
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
this.#inTransaction = false;
|
|
255
|
+
resolve();
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* 执行SQL查询并返回结果
|
|
261
|
+
* @param sql SQL语句
|
|
262
|
+
* @param params 参数
|
|
263
|
+
* @returns 查询结果
|
|
264
|
+
*/
|
|
265
|
+
async query(sql, params = []) {
|
|
266
|
+
if (!this.db) throw new Error("数据库未初始化");
|
|
267
|
+
return new Promise((resolve, reject) => {
|
|
268
|
+
this.db.all(sql, params, (err, rows) => {
|
|
269
|
+
if (err) {
|
|
270
|
+
logger.error(logPrefix(`查询失败: ${sql}`));
|
|
271
|
+
logger.error(err);
|
|
272
|
+
reject(err);
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
resolve(rows);
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* 清理过期键
|
|
281
|
+
*/
|
|
282
|
+
async cleanupExpiredKeys() {
|
|
283
|
+
const now = Date.now();
|
|
284
|
+
return (await this.query("SELECT key FROM redis_data WHERE expire != -1 AND expire < ? LIMIT 500", [now])).length;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* 将db.run方法封装为Promise
|
|
288
|
+
* @param sql SQL语句
|
|
289
|
+
* @param params 参数数组
|
|
290
|
+
* @returns 返回受影响的行数
|
|
291
|
+
*/
|
|
292
|
+
async run(sql, params) {
|
|
293
|
+
if (this.#isClosing) throw new Error("数据库正在关闭中...");
|
|
294
|
+
return new Promise((resolve, reject) => {
|
|
295
|
+
this.db.run(sql, params, function(err) {
|
|
296
|
+
if (err) {
|
|
297
|
+
reject(err);
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
resolve(this.changes);
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
};
|
|
305
|
+
|
|
306
|
+
//#endregion
|
|
307
|
+
export { logPrefix as n, SQLiteWrapper as t };
|
package/dist/start/app.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
export { };
|
package/dist/start/app.mjs
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
//#region src/start/app.ts
|
|
2
|
+
/**
|
|
3
|
+
* 直接启动 此文件不暴露给外部
|
|
4
|
+
* 通过变量来防止打包器解析模块
|
|
5
|
+
*/
|
|
6
|
+
let isStart = false;
|
|
3
7
|
(async () => {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
if (isStart) return;
|
|
9
|
+
isStart = true;
|
|
10
|
+
const entry = import.meta.url.includes(".ts") ? "../index.ts" : "../index.mjs";
|
|
11
|
+
const { start } = await import(new URL(entry, import.meta.url).href);
|
|
12
|
+
start();
|
|
9
13
|
})();
|
|
14
|
+
|
|
15
|
+
//#endregion
|
|
16
|
+
export { };
|
package/dist/start/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
export { };
|