@yunzai-ng/core 0.1.0

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.
Files changed (357) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +51 -0
  3. package/dist/adapter/accounts.d.ts +174 -0
  4. package/dist/adapter/accounts.d.ts.map +1 -0
  5. package/dist/adapter/accounts.js +653 -0
  6. package/dist/adapter/accounts.js.map +1 -0
  7. package/dist/adapter/bots.d.ts +142 -0
  8. package/dist/adapter/bots.d.ts.map +1 -0
  9. package/dist/adapter/bots.js +454 -0
  10. package/dist/adapter/bots.js.map +1 -0
  11. package/dist/adapter/host.d.ts +114 -0
  12. package/dist/adapter/host.d.ts.map +1 -0
  13. package/dist/adapter/host.js +90 -0
  14. package/dist/adapter/host.js.map +1 -0
  15. package/dist/adapter/login.d.ts +174 -0
  16. package/dist/adapter/login.d.ts.map +1 -0
  17. package/dist/adapter/login.js +345 -0
  18. package/dist/adapter/login.js.map +1 -0
  19. package/dist/adapter/registry.d.ts +102 -0
  20. package/dist/adapter/registry.d.ts.map +1 -0
  21. package/dist/adapter/registry.js +150 -0
  22. package/dist/adapter/registry.js.map +1 -0
  23. package/dist/config/core-config.d.ts +151 -0
  24. package/dist/config/core-config.d.ts.map +1 -0
  25. package/dist/config/core-config.js +338 -0
  26. package/dist/config/core-config.js.map +1 -0
  27. package/dist/config/schema.d.ts +449 -0
  28. package/dist/config/schema.d.ts.map +1 -0
  29. package/dist/config/schema.js +871 -0
  30. package/dist/config/schema.js.map +1 -0
  31. package/dist/config/store.d.ts +184 -0
  32. package/dist/config/store.d.ts.map +1 -0
  33. package/dist/config/store.js +428 -0
  34. package/dist/config/store.js.map +1 -0
  35. package/dist/config/yaml.d.ts +23 -0
  36. package/dist/config/yaml.d.ts.map +1 -0
  37. package/dist/config/yaml.js +108 -0
  38. package/dist/config/yaml.js.map +1 -0
  39. package/dist/http/client.d.ts +82 -0
  40. package/dist/http/client.d.ts.map +1 -0
  41. package/dist/http/client.js +658 -0
  42. package/dist/http/client.js.map +1 -0
  43. package/dist/index.d.ts +77 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +94 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/kernel/app.d.ts +244 -0
  48. package/dist/kernel/app.d.ts.map +1 -0
  49. package/dist/kernel/app.js +654 -0
  50. package/dist/kernel/app.js.map +1 -0
  51. package/dist/kernel/kv-sink.d.ts +34 -0
  52. package/dist/kernel/kv-sink.d.ts.map +1 -0
  53. package/dist/kernel/kv-sink.js +25 -0
  54. package/dist/kernel/kv-sink.js.map +1 -0
  55. package/dist/kernel/policy.d.ts +77 -0
  56. package/dist/kernel/policy.d.ts.map +1 -0
  57. package/dist/kernel/policy.js +99 -0
  58. package/dist/kernel/policy.js.map +1 -0
  59. package/dist/kernel/runtime.d.ts +117 -0
  60. package/dist/kernel/runtime.d.ts.map +1 -0
  61. package/dist/kernel/runtime.js +197 -0
  62. package/dist/kernel/runtime.js.map +1 -0
  63. package/dist/kernel/sql-sink.d.ts +36 -0
  64. package/dist/kernel/sql-sink.d.ts.map +1 -0
  65. package/dist/kernel/sql-sink.js +114 -0
  66. package/dist/kernel/sql-sink.js.map +1 -0
  67. package/dist/logger/format.d.ts +67 -0
  68. package/dist/logger/format.d.ts.map +1 -0
  69. package/dist/logger/format.js +218 -0
  70. package/dist/logger/format.js.map +1 -0
  71. package/dist/logger/index.d.ts +97 -0
  72. package/dist/logger/index.d.ts.map +1 -0
  73. package/dist/logger/index.js +363 -0
  74. package/dist/logger/index.js.map +1 -0
  75. package/dist/logger/rotate.d.ts +47 -0
  76. package/dist/logger/rotate.d.ts.map +1 -0
  77. package/dist/logger/rotate.js +242 -0
  78. package/dist/logger/rotate.js.map +1 -0
  79. package/dist/message/segment.d.ts +255 -0
  80. package/dist/message/segment.d.ts.map +1 -0
  81. package/dist/message/segment.js +510 -0
  82. package/dist/message/segment.js.map +1 -0
  83. package/dist/message/split.d.ts +34 -0
  84. package/dist/message/split.d.ts.map +1 -0
  85. package/dist/message/split.js +79 -0
  86. package/dist/message/split.js.map +1 -0
  87. package/dist/message/target.d.ts +29 -0
  88. package/dist/message/target.d.ts.map +1 -0
  89. package/dist/message/target.js +34 -0
  90. package/dist/message/target.js.map +1 -0
  91. package/dist/pipeline/cooldown.d.ts +84 -0
  92. package/dist/pipeline/cooldown.d.ts.map +1 -0
  93. package/dist/pipeline/cooldown.js +94 -0
  94. package/dist/pipeline/cooldown.js.map +1 -0
  95. package/dist/pipeline/dispatch.d.ts +98 -0
  96. package/dist/pipeline/dispatch.d.ts.map +1 -0
  97. package/dist/pipeline/dispatch.js +323 -0
  98. package/dist/pipeline/dispatch.js.map +1 -0
  99. package/dist/pipeline/event.d.ts +130 -0
  100. package/dist/pipeline/event.d.ts.map +1 -0
  101. package/dist/pipeline/event.js +538 -0
  102. package/dist/pipeline/event.js.map +1 -0
  103. package/dist/pipeline/middleware.d.ts +63 -0
  104. package/dist/pipeline/middleware.d.ts.map +1 -0
  105. package/dist/pipeline/middleware.js +174 -0
  106. package/dist/pipeline/middleware.js.map +1 -0
  107. package/dist/pipeline/prompt.d.ts +80 -0
  108. package/dist/pipeline/prompt.d.ts.map +1 -0
  109. package/dist/pipeline/prompt.js +155 -0
  110. package/dist/pipeline/prompt.js.map +1 -0
  111. package/dist/pipeline/router.d.ts +98 -0
  112. package/dist/pipeline/router.d.ts.map +1 -0
  113. package/dist/pipeline/router.js +489 -0
  114. package/dist/pipeline/router.js.map +1 -0
  115. package/dist/platform/detect.d.ts +24 -0
  116. package/dist/platform/detect.d.ts.map +1 -0
  117. package/dist/platform/detect.js +178 -0
  118. package/dist/platform/detect.js.map +1 -0
  119. package/dist/platform/paths.d.ts +38 -0
  120. package/dist/platform/paths.d.ts.map +1 -0
  121. package/dist/platform/paths.js +129 -0
  122. package/dist/platform/paths.js.map +1 -0
  123. package/dist/platform/system.d.ts +71 -0
  124. package/dist/platform/system.d.ts.map +1 -0
  125. package/dist/platform/system.js +242 -0
  126. package/dist/platform/system.js.map +1 -0
  127. package/dist/plugin/context.d.ts +92 -0
  128. package/dist/plugin/context.d.ts.map +1 -0
  129. package/dist/plugin/context.js +573 -0
  130. package/dist/plugin/context.js.map +1 -0
  131. package/dist/plugin/define.d.ts +92 -0
  132. package/dist/plugin/define.d.ts.map +1 -0
  133. package/dist/plugin/define.js +82 -0
  134. package/dist/plugin/define.js.map +1 -0
  135. package/dist/plugin/discover.d.ts +106 -0
  136. package/dist/plugin/discover.d.ts.map +1 -0
  137. package/dist/plugin/discover.js +254 -0
  138. package/dist/plugin/discover.js.map +1 -0
  139. package/dist/plugin/events.d.ts +109 -0
  140. package/dist/plugin/events.d.ts.map +1 -0
  141. package/dist/plugin/events.js +209 -0
  142. package/dist/plugin/events.js.map +1 -0
  143. package/dist/plugin/hooks.d.ts +266 -0
  144. package/dist/plugin/hooks.d.ts.map +1 -0
  145. package/dist/plugin/hooks.js +84 -0
  146. package/dist/plugin/hooks.js.map +1 -0
  147. package/dist/plugin/host.d.ts +160 -0
  148. package/dist/plugin/host.d.ts.map +1 -0
  149. package/dist/plugin/host.js +546 -0
  150. package/dist/plugin/host.js.map +1 -0
  151. package/dist/plugin/market.d.ts +264 -0
  152. package/dist/plugin/market.d.ts.map +1 -0
  153. package/dist/plugin/market.js +700 -0
  154. package/dist/plugin/market.js.map +1 -0
  155. package/dist/plugin/services.d.ts +116 -0
  156. package/dist/plugin/services.d.ts.map +1 -0
  157. package/dist/plugin/services.js +213 -0
  158. package/dist/plugin/services.js.map +1 -0
  159. package/dist/plugin/tar.d.ts +65 -0
  160. package/dist/plugin/tar.d.ts.map +1 -0
  161. package/dist/plugin/tar.js +277 -0
  162. package/dist/plugin/tar.js.map +1 -0
  163. package/dist/render/registry.d.ts +127 -0
  164. package/dist/render/registry.d.ts.map +1 -0
  165. package/dist/render/registry.js +306 -0
  166. package/dist/render/registry.js.map +1 -0
  167. package/dist/scheduler/index.d.ts +67 -0
  168. package/dist/scheduler/index.d.ts.map +1 -0
  169. package/dist/scheduler/index.js +279 -0
  170. package/dist/scheduler/index.js.map +1 -0
  171. package/dist/server/api.d.ts +179 -0
  172. package/dist/server/api.d.ts.map +1 -0
  173. package/dist/server/api.js +602 -0
  174. package/dist/server/api.js.map +1 -0
  175. package/dist/server/auth.d.ts +83 -0
  176. package/dist/server/auth.d.ts.map +1 -0
  177. package/dist/server/auth.js +178 -0
  178. package/dist/server/auth.js.map +1 -0
  179. package/dist/server/browse.d.ts +60 -0
  180. package/dist/server/browse.d.ts.map +1 -0
  181. package/dist/server/browse.js +187 -0
  182. package/dist/server/browse.js.map +1 -0
  183. package/dist/server/files.d.ts +27 -0
  184. package/dist/server/files.d.ts.map +1 -0
  185. package/dist/server/files.js +76 -0
  186. package/dist/server/files.js.map +1 -0
  187. package/dist/server/index.d.ts +189 -0
  188. package/dist/server/index.d.ts.map +1 -0
  189. package/dist/server/index.js +1123 -0
  190. package/dist/server/index.js.map +1 -0
  191. package/dist/server/table.d.ts +105 -0
  192. package/dist/server/table.d.ts.map +1 -0
  193. package/dist/server/table.js +289 -0
  194. package/dist/server/table.js.map +1 -0
  195. package/dist/store/index.d.ts +50 -0
  196. package/dist/store/index.d.ts.map +1 -0
  197. package/dist/store/index.js +120 -0
  198. package/dist/store/index.js.map +1 -0
  199. package/dist/store/json.d.ts +73 -0
  200. package/dist/store/json.d.ts.map +1 -0
  201. package/dist/store/json.js +174 -0
  202. package/dist/store/json.js.map +1 -0
  203. package/dist/store/kv.d.ts +126 -0
  204. package/dist/store/kv.d.ts.map +1 -0
  205. package/dist/store/kv.js +232 -0
  206. package/dist/store/kv.js.map +1 -0
  207. package/dist/store/level.d.ts +103 -0
  208. package/dist/store/level.d.ts.map +1 -0
  209. package/dist/store/level.js +119 -0
  210. package/dist/store/level.js.map +1 -0
  211. package/dist/store/memory.d.ts +61 -0
  212. package/dist/store/memory.d.ts.map +1 -0
  213. package/dist/store/memory.js +94 -0
  214. package/dist/store/memory.js.map +1 -0
  215. package/dist/store/sql.d.ts +142 -0
  216. package/dist/store/sql.d.ts.map +1 -0
  217. package/dist/store/sql.js +246 -0
  218. package/dist/store/sql.js.map +1 -0
  219. package/dist/testing/fake.d.ts +109 -0
  220. package/dist/testing/fake.d.ts.map +1 -0
  221. package/dist/testing/fake.js +196 -0
  222. package/dist/testing/fake.js.map +1 -0
  223. package/dist/testing/index.d.ts +16 -0
  224. package/dist/testing/index.d.ts.map +1 -0
  225. package/dist/testing/index.js +16 -0
  226. package/dist/testing/index.js.map +1 -0
  227. package/dist/testing/mock-adapter.d.ts +205 -0
  228. package/dist/testing/mock-adapter.d.ts.map +1 -0
  229. package/dist/testing/mock-adapter.js +309 -0
  230. package/dist/testing/mock-adapter.js.map +1 -0
  231. package/dist/util/deep.d.ts +108 -0
  232. package/dist/util/deep.d.ts.map +1 -0
  233. package/dist/util/deep.js +275 -0
  234. package/dist/util/deep.js.map +1 -0
  235. package/dist/util/defer.d.ts +107 -0
  236. package/dist/util/defer.d.ts.map +1 -0
  237. package/dist/util/defer.js +163 -0
  238. package/dist/util/defer.js.map +1 -0
  239. package/dist/util/dispose.d.ts +88 -0
  240. package/dist/util/dispose.d.ts.map +1 -0
  241. package/dist/util/dispose.js +143 -0
  242. package/dist/util/dispose.js.map +1 -0
  243. package/dist/util/duration.d.ts +28 -0
  244. package/dist/util/duration.d.ts.map +1 -0
  245. package/dist/util/duration.js +77 -0
  246. package/dist/util/duration.js.map +1 -0
  247. package/dist/util/fs.d.ts +110 -0
  248. package/dist/util/fs.d.ts.map +1 -0
  249. package/dist/util/fs.js +269 -0
  250. package/dist/util/fs.js.map +1 -0
  251. package/dist/util/id.d.ts +49 -0
  252. package/dist/util/id.d.ts.map +1 -0
  253. package/dist/util/id.js +87 -0
  254. package/dist/util/id.js.map +1 -0
  255. package/dist/util/lru.d.ts +74 -0
  256. package/dist/util/lru.d.ts.map +1 -0
  257. package/dist/util/lru.js +156 -0
  258. package/dist/util/lru.js.map +1 -0
  259. package/dist/util/queue.d.ts +64 -0
  260. package/dist/util/queue.d.ts.map +1 -0
  261. package/dist/util/queue.js +147 -0
  262. package/dist/util/queue.js.map +1 -0
  263. package/dist/util/text.d.ts +86 -0
  264. package/dist/util/text.d.ts.map +1 -0
  265. package/dist/util/text.js +182 -0
  266. package/dist/util/text.js.map +1 -0
  267. package/package.json +44 -0
  268. package/src/adapter/accounts.ts +758 -0
  269. package/src/adapter/bots.ts +582 -0
  270. package/src/adapter/host.ts +224 -0
  271. package/src/adapter/login.ts +481 -0
  272. package/src/adapter/registry.ts +202 -0
  273. package/src/config/core-config.test.ts +60 -0
  274. package/src/config/core-config.ts +401 -0
  275. package/src/config/schema.test.ts +179 -0
  276. package/src/config/schema.ts +1036 -0
  277. package/src/config/store.test.ts +245 -0
  278. package/src/config/store.ts +506 -0
  279. package/src/config/yaml.ts +119 -0
  280. package/src/http/client.test.ts +568 -0
  281. package/src/http/client.ts +777 -0
  282. package/src/index.ts +106 -0
  283. package/src/kernel/app.test.ts +267 -0
  284. package/src/kernel/app.ts +843 -0
  285. package/src/kernel/kv-sink.ts +58 -0
  286. package/src/kernel/policy.ts +120 -0
  287. package/src/kernel/runtime.test.ts +542 -0
  288. package/src/kernel/runtime.ts +307 -0
  289. package/src/kernel/sql-sink.ts +154 -0
  290. package/src/logger/format.ts +259 -0
  291. package/src/logger/index.ts +427 -0
  292. package/src/logger/rotate.ts +265 -0
  293. package/src/message/segment.test.ts +335 -0
  294. package/src/message/segment.ts +569 -0
  295. package/src/message/split.ts +97 -0
  296. package/src/message/target.ts +48 -0
  297. package/src/pipeline/cooldown.ts +136 -0
  298. package/src/pipeline/dispatch.ts +419 -0
  299. package/src/pipeline/event.ts +735 -0
  300. package/src/pipeline/middleware.test.ts +426 -0
  301. package/src/pipeline/middleware.ts +199 -0
  302. package/src/pipeline/prompt.ts +212 -0
  303. package/src/pipeline/router.test.ts +432 -0
  304. package/src/pipeline/router.ts +575 -0
  305. package/src/platform/detect.ts +178 -0
  306. package/src/platform/paths.ts +147 -0
  307. package/src/platform/system.test.ts +102 -0
  308. package/src/platform/system.ts +289 -0
  309. package/src/plugin/context.test.ts +459 -0
  310. package/src/plugin/context.ts +757 -0
  311. package/src/plugin/define.test.ts +120 -0
  312. package/src/plugin/define.ts +142 -0
  313. package/src/plugin/discover.test.ts +253 -0
  314. package/src/plugin/discover.ts +353 -0
  315. package/src/plugin/events.test.ts +162 -0
  316. package/src/plugin/events.ts +266 -0
  317. package/src/plugin/hooks.ts +373 -0
  318. package/src/plugin/host.test.ts +696 -0
  319. package/src/plugin/host.ts +738 -0
  320. package/src/plugin/market.test.ts +781 -0
  321. package/src/plugin/market.ts +870 -0
  322. package/src/plugin/services.test.ts +135 -0
  323. package/src/plugin/services.ts +261 -0
  324. package/src/plugin/tar.test.ts +158 -0
  325. package/src/plugin/tar.ts +309 -0
  326. package/src/render/registry.test.ts +127 -0
  327. package/src/render/registry.ts +439 -0
  328. package/src/scheduler/index.ts +357 -0
  329. package/src/server/api.test.ts +802 -0
  330. package/src/server/api.ts +869 -0
  331. package/src/server/auth.ts +201 -0
  332. package/src/server/browse.test.ts +193 -0
  333. package/src/server/browse.ts +240 -0
  334. package/src/server/files.ts +97 -0
  335. package/src/server/index.test.ts +566 -0
  336. package/src/server/index.ts +1386 -0
  337. package/src/server/table.ts +351 -0
  338. package/src/store/index.ts +156 -0
  339. package/src/store/json.ts +198 -0
  340. package/src/store/kv.test.ts +307 -0
  341. package/src/store/kv.ts +256 -0
  342. package/src/store/level.ts +167 -0
  343. package/src/store/memory.ts +109 -0
  344. package/src/store/sql.test.ts +204 -0
  345. package/src/store/sql.ts +324 -0
  346. package/src/testing/fake.ts +297 -0
  347. package/src/testing/index.ts +15 -0
  348. package/src/testing/mock-adapter.ts +588 -0
  349. package/src/util/deep.ts +272 -0
  350. package/src/util/defer.ts +211 -0
  351. package/src/util/dispose.ts +169 -0
  352. package/src/util/duration.ts +82 -0
  353. package/src/util/fs.ts +279 -0
  354. package/src/util/id.ts +94 -0
  355. package/src/util/lru.ts +185 -0
  356. package/src/util/queue.ts +167 -0
  357. package/src/util/text.ts +189 -0
@@ -0,0 +1,103 @@
1
+ /**
2
+ * 模块职责:内嵌 LevelDB KV 驱动(默认驱动)
3
+ * 依赖方向:动态依赖可选原生模块 classic-level;依赖类型包
4
+ * 生命周期:`open()` 打开数据库目录,`close()` 关闭并 flush
5
+ * 注意事项:classic-level 是 **optionalDependency**(原生模块,Termux 上可能编不出来),
6
+ * 所以这里用动态 `import()` 且**不引用它的类型** —— 只声明自己真正用到的
7
+ * 那几个方法。这样在没装成功的机器上,整个内核依然能编译、能跑,
8
+ * 由 `openKv()` 自动降级到 json 驱动。
9
+ *
10
+ * 刻意不实现 `incr`:LevelDB 没有原子自增原语,硬写成 get+put 会在并发下
11
+ * 丢计数。留空让上层的按键串行队列接管,语义才是对的。
12
+ */
13
+ import type { KvBatchOp, KvDriver, StoredEnvelope } from "@yunzai-ng/types";
14
+ /** classic-level 中本驱动实际用到的最小面 */
15
+ interface LevelDb {
16
+ /** 打开数据库 */
17
+ open(): Promise<void>;
18
+ /** 关闭数据库 */
19
+ close(): Promise<void>;
20
+ /** 读取,缺失返回 undefined(abstract-level 2.x 语义) */
21
+ get(key: string): Promise<StoredEnvelope | undefined>;
22
+ /** 写入 */
23
+ put(key: string, value: StoredEnvelope): Promise<void>;
24
+ /** 删除 */
25
+ del(key: string): Promise<void>;
26
+ /** 批量写入/删除 */
27
+ batch(ops: {
28
+ type: "put" | "del";
29
+ key: string;
30
+ value?: StoredEnvelope;
31
+ }[]): Promise<void>;
32
+ /** 范围迭代器 */
33
+ iterator(opts: {
34
+ gte?: string;
35
+ }): LevelIterator;
36
+ }
37
+ /** classic-level 的迭代器最小面 */
38
+ interface LevelIterator extends AsyncIterable<[string, StoredEnvelope]> {
39
+ /** 关闭迭代器,释放底层快照 */
40
+ close(): Promise<void>;
41
+ }
42
+ /** classic-level 的构造签名 */
43
+ type LevelCtor = new (location: string, opts: {
44
+ valueEncoding: "json";
45
+ }) => LevelDb;
46
+ /**
47
+ * 尝试加载 classic-level
48
+ * @returns 构造函数;模块不可用时 undefined
49
+ */
50
+ export declare function loadLevel(): Promise<LevelCtor | undefined>;
51
+ /** 内嵌 LevelDB KV 驱动 */
52
+ export declare class LevelKvDriver implements KvDriver {
53
+ #private;
54
+ /** 驱动 id */
55
+ readonly id = "level";
56
+ /**
57
+ * @param dir 数据库目录
58
+ * @param ctor classic-level 构造函数,由 `loadLevel()` 提供
59
+ */
60
+ constructor(dir: string, ctor: LevelCtor);
61
+ /** 数据库目录 */
62
+ get dir(): string;
63
+ /**
64
+ * 打开数据库
65
+ * @throws 目录被另一个进程锁住时(LevelDB 是单进程独占)
66
+ */
67
+ open(): Promise<void>;
68
+ /** 关闭数据库 */
69
+ close(): Promise<void>;
70
+ /**
71
+ * 读取
72
+ * @param key 完整键
73
+ * @returns 值信封;不存在时 undefined
74
+ */
75
+ get(key: string): Promise<StoredEnvelope | undefined>;
76
+ /**
77
+ * 写入
78
+ * @param key 完整键
79
+ * @param value 值信封
80
+ */
81
+ set(key: string, value: StoredEnvelope): Promise<void>;
82
+ /**
83
+ * 删除
84
+ * @param key 完整键
85
+ */
86
+ del(key: string): Promise<void>;
87
+ /**
88
+ * 批量操作(LevelDB 的原子批写)
89
+ * @param ops 操作列表
90
+ */
91
+ batch(ops: KvBatchOp[]): Promise<void>;
92
+ /**
93
+ * 按前缀扫描
94
+ *
95
+ * 只给出 `gte` 而不给上界,依靠"键按字节序排列 ⇒ 同前缀的键连续"提前结束。
96
+ * 较自行计算 `lt` 上界更可靠:手工计算上界一旦遇到 emoji 一类四字节字符即会漏键。
97
+ * @param prefix 键前缀
98
+ * @returns 键值对迭代器
99
+ */
100
+ scan(prefix: string): AsyncIterableIterator<readonly [string, StoredEnvelope]>;
101
+ }
102
+ export {};
103
+ //# sourceMappingURL=level.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"level.d.ts","sourceRoot":"","sources":["../../src/store/level.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAG3E,iCAAiC;AACjC,UAAU,OAAO;IACf,YAAY;IACZ,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACrB,YAAY;IACZ,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,+CAA+C;IAC/C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAAA;IACrD,SAAS;IACT,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtD,SAAS;IACT,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/B,cAAc;IACd,KAAK,CAAC,GAAG,EAAE;QAAE,IAAI,EAAE,KAAK,GAAG,KAAK,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,cAAc,CAAA;KAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzF,YAAY;IACZ,QAAQ,CAAC,IAAI,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,aAAa,CAAA;CAChD;AAED,4BAA4B;AAC5B,UAAU,aAAc,SAAQ,aAAa,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACrE,mBAAmB;IACnB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED,0BAA0B;AAC1B,KAAK,SAAS,GAAG,KAAK,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,KAAK,OAAO,CAAA;AAEnF;;;GAGG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAOhE;AAED,uBAAuB;AACvB,qBAAa,aAAc,YAAW,QAAQ;;IAC5C,YAAY;IACZ,QAAQ,CAAC,EAAE,WAAU;IASrB;;;OAGG;gBACS,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS;IAKxC,YAAY;IACZ,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,YAAY;IACN,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B;;;;OAIG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAI3D;;;;OAIG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5D;;;OAGG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC;;;OAGG;IACG,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5C;;;;;;;OAOG;IACI,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAsBtF"}
@@ -0,0 +1,119 @@
1
+ import { ensureDir } from "../util/fs.js";
2
+ /**
3
+ * 尝试加载 classic-level
4
+ * @returns 构造函数;模块不可用时 undefined
5
+ */
6
+ export async function loadLevel() {
7
+ try {
8
+ const mod = (await import("classic-level"));
9
+ return mod.ClassicLevel;
10
+ }
11
+ catch {
12
+ return undefined;
13
+ }
14
+ }
15
+ /** 内嵌 LevelDB KV 驱动 */
16
+ export class LevelKvDriver {
17
+ /** 驱动 id */
18
+ id = "level";
19
+ /** 数据库目录 */
20
+ #dir;
21
+ /** 构造函数 */
22
+ #ctor;
23
+ /** 数据库实例 */
24
+ #db;
25
+ /**
26
+ * @param dir 数据库目录
27
+ * @param ctor classic-level 构造函数,由 `loadLevel()` 提供
28
+ */
29
+ constructor(dir, ctor) {
30
+ this.#dir = dir;
31
+ this.#ctor = ctor;
32
+ }
33
+ /** 数据库目录 */
34
+ get dir() {
35
+ return this.#dir;
36
+ }
37
+ /**
38
+ * 打开数据库
39
+ * @throws 目录被另一个进程锁住时(LevelDB 是单进程独占)
40
+ */
41
+ async open() {
42
+ await ensureDir(this.#dir);
43
+ const db = new this.#ctor(this.#dir, { valueEncoding: "json" });
44
+ await db.open();
45
+ this.#db = db;
46
+ }
47
+ /** 关闭数据库 */
48
+ async close() {
49
+ const db = this.#db;
50
+ this.#db = undefined;
51
+ if (db)
52
+ await db.close();
53
+ }
54
+ /**
55
+ * 读取
56
+ * @param key 完整键
57
+ * @returns 值信封;不存在时 undefined
58
+ */
59
+ async get(key) {
60
+ return this.#require().get(key);
61
+ }
62
+ /**
63
+ * 写入
64
+ * @param key 完整键
65
+ * @param value 值信封
66
+ */
67
+ async set(key, value) {
68
+ await this.#require().put(key, value);
69
+ }
70
+ /**
71
+ * 删除
72
+ * @param key 完整键
73
+ */
74
+ async del(key) {
75
+ await this.#require().del(key);
76
+ }
77
+ /**
78
+ * 批量操作(LevelDB 的原子批写)
79
+ * @param ops 操作列表
80
+ */
81
+ async batch(ops) {
82
+ if (ops.length === 0)
83
+ return;
84
+ await this.#require().batch(ops.map(op => (op.op === "set" ? { type: "put", key: op.key, value: op.value } : { type: "del", key: op.key })));
85
+ }
86
+ /**
87
+ * 按前缀扫描
88
+ *
89
+ * 只给出 `gte` 而不给上界,依靠"键按字节序排列 ⇒ 同前缀的键连续"提前结束。
90
+ * 较自行计算 `lt` 上界更可靠:手工计算上界一旦遇到 emoji 一类四字节字符即会漏键。
91
+ * @param prefix 键前缀
92
+ * @returns 键值对迭代器
93
+ */
94
+ async *scan(prefix) {
95
+ const it = this.#require().iterator({ gte: prefix });
96
+ try {
97
+ for await (const [key, value] of it) {
98
+ if (!key.startsWith(prefix))
99
+ break;
100
+ yield [key, value];
101
+ }
102
+ }
103
+ finally {
104
+ // 迭代器持有底层快照,不关会一直占着 sst 文件不让压缩
105
+ await it.close().catch(() => undefined);
106
+ }
107
+ }
108
+ /**
109
+ * 取已打开的数据库
110
+ * @returns 数据库实例
111
+ * @throws 未 open 时
112
+ */
113
+ #require() {
114
+ if (!this.#db)
115
+ throw new Error("LevelDB 尚未打开,请先调用 open()");
116
+ return this.#db;
117
+ }
118
+ }
119
+ //# sourceMappingURL=level.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"level.js","sourceRoot":"","sources":["../../src/store/level.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * 模块职责:内存 KV 驱动(测试与"仅内存"模式)
3
+ * 依赖方向:依赖类型包与 util/deep
4
+ * 生命周期:`close()` 后可再 `open()`
5
+ * 注意事项:**存取都做深拷贝**。若直接存引用,调用方在 set 之后修改对象会连带改掉
6
+ * "已落盘"的值;这样内存驱动下能跑通的代码换到 level/json 驱动就会出错,
7
+ * 属于最难查的一类问题。宁可多一次拷贝,也要让三种驱动语义完全一致。
8
+ */
9
+ import type { KvBatchOp, KvDriver, StoredEnvelope } from "@yunzai-ng/types";
10
+ /** 内存 KV 驱动 */
11
+ export declare class MemoryKvDriver implements KvDriver {
12
+ #private;
13
+ /** 驱动 id */
14
+ readonly id = "memory";
15
+ /** 键数量(含未清理的过期键),仅用于调试与面板展示 */
16
+ get size(): number;
17
+ /** 打开(内存驱动无需准备) */
18
+ open(): Promise<void>;
19
+ /** 关闭并清空 */
20
+ close(): Promise<void>;
21
+ /**
22
+ * 读取
23
+ * @param key 完整键
24
+ * @returns 值信封的副本
25
+ */
26
+ get(key: string): Promise<StoredEnvelope | undefined>;
27
+ /**
28
+ * 写入
29
+ * @param key 完整键
30
+ * @param value 值信封
31
+ */
32
+ set(key: string, value: StoredEnvelope): Promise<void>;
33
+ /**
34
+ * 删除
35
+ * @param key 完整键
36
+ */
37
+ del(key: string): Promise<void>;
38
+ /**
39
+ * 批量操作
40
+ * @param ops 操作列表
41
+ */
42
+ batch(ops: KvBatchOp[]): Promise<void>;
43
+ /**
44
+ * 按前缀扫描
45
+ * @param prefix 键前缀
46
+ * @returns 键值对迭代器
47
+ */
48
+ scan(prefix: string): AsyncIterableIterator<readonly [string, StoredEnvelope]>;
49
+ /**
50
+ * 原生原子自增
51
+ *
52
+ * 单线程 JS 里同步的读改写天然原子,故内存驱动可以直接提供,
53
+ * 免掉上层的串行队列开销。
54
+ * @param key 完整键
55
+ * @param by 增量
56
+ * @param expireAt 首次创建时的过期时间点
57
+ * @returns 自增后的值
58
+ */
59
+ incr(key: string, by: number, expireAt?: number): Promise<number>;
60
+ }
61
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/store/memory.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAI3E,eAAe;AACf,qBAAa,cAAe,YAAW,QAAQ;;IAC7C,YAAY;IACZ,QAAQ,CAAC,EAAE,YAAW;IAKtB,+BAA+B;IAC/B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,mBAAmB;IACb,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,YAAY;IACN,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;;;OAIG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAK3D;;;;OAIG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5D;;;OAGG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC;;;OAGG;IACG,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5C;;;;OAIG;IACI,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAWrF;;;;;;;;;OASG;IACG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CASxE"}
@@ -0,0 +1,94 @@
1
+ import { deepClone } from "../util/deep.js";
2
+ import { isExpired } from "./kv.js";
3
+ /** 内存 KV 驱动 */
4
+ export class MemoryKvDriver {
5
+ /** 驱动 id */
6
+ id = "memory";
7
+ /** 数据表 */
8
+ #map = new Map();
9
+ /** 键数量(含未清理的过期键),仅用于调试与面板展示 */
10
+ get size() {
11
+ return this.#map.size;
12
+ }
13
+ /** 打开(内存驱动无需准备) */
14
+ async open() {
15
+ // 无操作
16
+ }
17
+ /** 关闭并清空 */
18
+ async close() {
19
+ this.#map.clear();
20
+ }
21
+ /**
22
+ * 读取
23
+ * @param key 完整键
24
+ * @returns 值信封的副本
25
+ */
26
+ async get(key) {
27
+ const env = this.#map.get(key);
28
+ return env === undefined ? undefined : deepClone(env);
29
+ }
30
+ /**
31
+ * 写入
32
+ * @param key 完整键
33
+ * @param value 值信封
34
+ */
35
+ async set(key, value) {
36
+ this.#map.set(key, deepClone(value));
37
+ }
38
+ /**
39
+ * 删除
40
+ * @param key 完整键
41
+ */
42
+ async del(key) {
43
+ this.#map.delete(key);
44
+ }
45
+ /**
46
+ * 批量操作
47
+ * @param ops 操作列表
48
+ */
49
+ async batch(ops) {
50
+ for (const op of ops) {
51
+ if (op.op === "set")
52
+ this.#map.set(op.key, deepClone(op.value));
53
+ else
54
+ this.#map.delete(op.key);
55
+ }
56
+ }
57
+ /**
58
+ * 按前缀扫描
59
+ * @param prefix 键前缀
60
+ * @returns 键值对迭代器
61
+ */
62
+ async *scan(prefix) {
63
+ // 先快照键集合:调用方在遍历中删除过期键是正常用法,
64
+ // 直接迭代 Map 会撞上"遍历中修改"的未定义顺序
65
+ for (const key of [...this.#map.keys()]) {
66
+ if (!key.startsWith(prefix))
67
+ continue;
68
+ const env = this.#map.get(key);
69
+ if (env === undefined)
70
+ continue;
71
+ yield [key, deepClone(env)];
72
+ }
73
+ }
74
+ /**
75
+ * 原生原子自增
76
+ *
77
+ * 单线程 JS 里同步的读改写天然原子,故内存驱动可以直接提供,
78
+ * 免掉上层的串行队列开销。
79
+ * @param key 完整键
80
+ * @param by 增量
81
+ * @param expireAt 首次创建时的过期时间点
82
+ * @returns 自增后的值
83
+ */
84
+ async incr(key, by, expireAt) {
85
+ const env = this.#map.get(key);
86
+ const alive = env !== undefined && !isExpired(env);
87
+ const current = alive && typeof env.v === "number" ? env.v : 0;
88
+ const next = current + by;
89
+ const keep = alive ? env.e : expireAt;
90
+ this.#map.set(key, keep === undefined ? { v: next } : { v: next, e: keep });
91
+ return next;
92
+ }
93
+ }
94
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/store/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * 模块职责:SQLite 关系存储(语句缓存、异步事务、迁移)
3
+ * 依赖方向:动态依赖可选原生模块 better-sqlite3;依赖 util/{lru,queue}、类型包
4
+ * 生命周期:`openSql()` 打开,`close()` 关闭
5
+ * 注意事项:**不引 ORM**,只暴露 run/all/get/transaction/migrate。
6
+ *
7
+ * **事务手写 BEGIN/COMMIT 并用互斥锁串行化**:better-sqlite3 的 `db.transaction()`
8
+ * 只收同步函数,而本框架的接口是异步的(要容得下别的驱动)。一条连接上开不了两个
9
+ * 事务,故事务之间必须排队;嵌套事务改用 SAVEPOINT,不重复抢锁。
10
+ *
11
+ * **语句缓存有界。** `prepare()` 有真实开销,但无上限的缓存在动态拼 SQL 的插件手里
12
+ * 就是内存泄漏。
13
+ */
14
+ import type { SqlHandle, SqlMigration, SqlParam } from "@yunzai-ng/types";
15
+ import { LruCache } from "../util/lru.js";
16
+ import { Semaphore } from "../util/queue.js";
17
+ /** better-sqlite3 的语句最小面 */
18
+ interface SqliteStatement {
19
+ /** 执行不取行 */
20
+ run(...params: SqlParam[]): {
21
+ changes: number;
22
+ lastInsertRowid: number | bigint;
23
+ };
24
+ /** 取全部行 */
25
+ all(...params: SqlParam[]): unknown[];
26
+ /** 取首行 */
27
+ get(...params: SqlParam[]): unknown;
28
+ }
29
+ /** better-sqlite3 的连接最小面 */
30
+ interface SqliteDb {
31
+ /** 预编译语句 */
32
+ prepare(sql: string): SqliteStatement;
33
+ /** 直接执行脚本(可含多条语句,不支持绑定参数) */
34
+ exec(sql: string): void;
35
+ /** 读写 pragma */
36
+ pragma(source: string): unknown;
37
+ /** 关闭连接 */
38
+ close(): void;
39
+ }
40
+ /** better-sqlite3 的构造签名 */
41
+ type SqliteCtor = new (file: string, opts?: {
42
+ readonly?: boolean;
43
+ }) => SqliteDb;
44
+ /** 一条连接上的共享状态 */
45
+ interface SqlState {
46
+ /** 连接 */
47
+ db: SqliteDb;
48
+ /** 语句缓存 */
49
+ stmts: LruCache<SqliteStatement>;
50
+ /** 事务互斥锁 */
51
+ mutex: Semaphore;
52
+ /** SAVEPOINT 命名计数器 */
53
+ savepoint: number;
54
+ }
55
+ /**
56
+ * 尝试加载 better-sqlite3
57
+ * @returns 构造函数;模块不可用时 undefined
58
+ */
59
+ export declare function loadSqlite(): Promise<SqliteCtor | undefined>;
60
+ /**
61
+ * SQLite 句柄
62
+ *
63
+ * 根句柄由 `openSql()` 创建;事务内传给回调的是 `depth > 0` 的子句柄,
64
+ * 它们共享同一条连接,因此**不能**在事务回调里持有子句柄留到事务外使用。
65
+ */
66
+ export declare class SqliteHandle implements SqlHandle {
67
+ #private;
68
+ /**
69
+ * @param state 共享状态
70
+ * @param depth 事务嵌套深度
71
+ */
72
+ constructor(state: SqlState, depth?: number);
73
+ /**
74
+ * 执行不返回行的语句
75
+ *
76
+ * 不带参数且含多条语句时走 `exec()`,方便迁移里一次建表 + 建索引;
77
+ * 这种情况下无法报告受影响行数,返回 0。
78
+ * @param sql SQL 文本
79
+ * @param params 绑定参数
80
+ * @returns 受影响行数与最后插入 id
81
+ */
82
+ run(sql: string, params?: SqlParam[]): Promise<{
83
+ changes: number;
84
+ lastInsertRowid: number | bigint;
85
+ }>;
86
+ /**
87
+ * 查询多行
88
+ * @param sql SQL 文本
89
+ * @param params 绑定参数
90
+ * @returns 结果行数组
91
+ */
92
+ all<T = Record<string, unknown>>(sql: string, params?: SqlParam[]): Promise<T[]>;
93
+ /**
94
+ * 查询首行
95
+ * @param sql SQL 文本
96
+ * @param params 绑定参数
97
+ * @returns 首行;无结果时 undefined
98
+ */
99
+ get<T = Record<string, unknown>>(sql: string, params?: SqlParam[]): Promise<T | undefined>;
100
+ /**
101
+ * 在事务中执行
102
+ *
103
+ * 最外层用 `BEGIN IMMEDIATE`(立刻拿写锁,避免升级锁时才发现冲突而整段重来);
104
+ * 嵌套层用 SAVEPOINT,实现"内层回滚不牵连外层"。
105
+ * @param fn 事务体,抛错即回滚
106
+ * @returns 事务体的返回值
107
+ */
108
+ transaction<T>(fn: (tx: SqlHandle) => Promise<T>): Promise<T>;
109
+ /**
110
+ * 应用迁移
111
+ *
112
+ * 每条迁移单独一个事务:失败只回滚这一条,已成功的保持生效,修好后重跑从断点继续。
113
+ * 版本号落在迁移表里,故"这个库到哪一版了"有确定答案,不必靠"存在则忽略"的 try/catch。
114
+ * @param migrations 迁移列表
115
+ * @throws 版本号未严格递增,或某条迁移执行失败
116
+ */
117
+ migrate(migrations: SqlMigration[]): Promise<void>;
118
+ }
119
+ /** 打开 SQL 存储的参数 */
120
+ export interface OpenSqlOptions {
121
+ /** 数据库文件绝对路径 */
122
+ file: string;
123
+ /** 构造函数,缺省自动加载 */
124
+ ctor?: SqliteCtor;
125
+ }
126
+ /** 已打开的 SQL 存储 */
127
+ export interface SqlStore {
128
+ /** 句柄 */
129
+ readonly handle: SqlHandle;
130
+ /** 数据库文件路径 */
131
+ readonly file: string;
132
+ /** 关闭连接 */
133
+ close(): void;
134
+ }
135
+ /**
136
+ * 打开 SQLite 数据库
137
+ * @param opts 参数
138
+ * @returns 已打开的 SQL 存储;原生模块不可用时 undefined(调用方应降级为纯 KV)
139
+ */
140
+ export declare function openSql(opts: OpenSqlOptions): Promise<SqlStore | undefined>;
141
+ export {};
142
+ //# sourceMappingURL=sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/store/sql.ts"],"names":[],"mappings":"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"}