monsqlize 1.3.0 → 2.0.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 (172) hide show
  1. package/CHANGELOG.md +56 -60
  2. package/LICENSE +201 -21
  3. package/README.md +537 -1828
  4. package/changelogs/README.md +160 -0
  5. package/changelogs/v2.0.0.md +222 -0
  6. package/dist/cjs/index.cjs +10600 -0
  7. package/dist/cjs/mongodb/common/transaction-aware.cjs +10 -0
  8. package/dist/cjs/transaction/CacheLockManager.cjs +100 -0
  9. package/dist/cjs/transaction/Transaction.cjs +158 -0
  10. package/dist/cjs/transaction/TransactionManager.cjs +298 -0
  11. package/dist/esm/index.mjs +10650 -0
  12. package/dist/types/base.d.ts +81 -0
  13. package/dist/types/collection.d.ts +1031 -0
  14. package/dist/types/expression.d.ts +115 -0
  15. package/dist/types/index.d.ts +23 -0
  16. package/dist/types/lock.d.ts +74 -0
  17. package/dist/types/model.d.ts +526 -0
  18. package/dist/types/mongodb.d.ts +49 -0
  19. package/dist/types/monsqlize.d.ts +491 -0
  20. package/dist/types/pool.d.ts +84 -0
  21. package/dist/types/runtime.d.ts +362 -0
  22. package/dist/types/saga.d.ts +143 -0
  23. package/dist/types/slow-query-log.d.ts +126 -0
  24. package/dist/types/sync.d.ts +103 -0
  25. package/dist/types/transaction.d.ts +132 -0
  26. package/package.json +67 -69
  27. package/index.d.ts +0 -206
  28. package/index.mjs +0 -52
  29. package/lib/cache-invalidation.js +0 -279
  30. package/lib/cache.js +0 -530
  31. package/lib/common/cursor.js +0 -59
  32. package/lib/common/docs-urls.js +0 -73
  33. package/lib/common/index-options.js +0 -223
  34. package/lib/common/log.js +0 -61
  35. package/lib/common/namespace.js +0 -22
  36. package/lib/common/normalize.js +0 -34
  37. package/lib/common/page-result.js +0 -43
  38. package/lib/common/runner.js +0 -57
  39. package/lib/common/server-features.js +0 -232
  40. package/lib/common/shape-builders.js +0 -27
  41. package/lib/common/validation.js +0 -113
  42. package/lib/connect.js +0 -99
  43. package/lib/constants.js +0 -55
  44. package/lib/count-queue.js +0 -188
  45. package/lib/distributed-cache-invalidator.js +0 -260
  46. package/lib/errors.js +0 -168
  47. package/lib/expression/cache/ExpressionCache.js +0 -114
  48. package/lib/expression/compiler/ExpressionCompiler.js +0 -1090
  49. package/lib/expression/compiler/ExpressionCompilerExtensions.js +0 -531
  50. package/lib/expression/detector.js +0 -84
  51. package/lib/expression/factory.js +0 -29
  52. package/lib/expression/index.js +0 -19
  53. package/lib/function-cache.js +0 -533
  54. package/lib/index.js +0 -1251
  55. package/lib/infrastructure/ConnectionPoolManager.js +0 -464
  56. package/lib/infrastructure/HealthChecker.js +0 -281
  57. package/lib/infrastructure/PoolConfig.js +0 -199
  58. package/lib/infrastructure/PoolSelector.js +0 -225
  59. package/lib/infrastructure/PoolStats.js +0 -244
  60. package/lib/infrastructure/ssh-tunnel-ssh2.js +0 -212
  61. package/lib/infrastructure/ssh-tunnel.js +0 -41
  62. package/lib/infrastructure/uri-parser.js +0 -36
  63. package/lib/lock/Lock.js +0 -67
  64. package/lib/lock/errors.js +0 -28
  65. package/lib/lock/index.js +0 -13
  66. package/lib/logger.js +0 -225
  67. package/lib/model/examples/test.js +0 -311
  68. package/lib/model/features/defaults.js +0 -161
  69. package/lib/model/features/populate.js +0 -568
  70. package/lib/model/features/relations.js +0 -120
  71. package/lib/model/features/soft-delete.js +0 -349
  72. package/lib/model/features/version.js +0 -157
  73. package/lib/model/features/virtuals.js +0 -219
  74. package/lib/model/index.js +0 -1265
  75. package/lib/mongodb/common/accessor-helpers.js +0 -59
  76. package/lib/mongodb/common/agg-pipeline.js +0 -36
  77. package/lib/mongodb/common/aggregation-validator.js +0 -127
  78. package/lib/mongodb/common/iid.js +0 -28
  79. package/lib/mongodb/common/lexicographic-expr.js +0 -53
  80. package/lib/mongodb/common/shape.js +0 -32
  81. package/lib/mongodb/common/sort.js +0 -39
  82. package/lib/mongodb/common/transaction-aware.js +0 -25
  83. package/lib/mongodb/connect.js +0 -234
  84. package/lib/mongodb/index.js +0 -639
  85. package/lib/mongodb/management/admin-ops.js +0 -200
  86. package/lib/mongodb/management/bookmark-ops.js +0 -167
  87. package/lib/mongodb/management/cache-ops.js +0 -50
  88. package/lib/mongodb/management/collection-ops.js +0 -387
  89. package/lib/mongodb/management/database-ops.js +0 -202
  90. package/lib/mongodb/management/index-ops.js +0 -475
  91. package/lib/mongodb/management/index.js +0 -17
  92. package/lib/mongodb/management/namespace.js +0 -31
  93. package/lib/mongodb/management/validation-ops.js +0 -268
  94. package/lib/mongodb/queries/aggregate.js +0 -172
  95. package/lib/mongodb/queries/chain.js +0 -631
  96. package/lib/mongodb/queries/count.js +0 -99
  97. package/lib/mongodb/queries/distinct.js +0 -78
  98. package/lib/mongodb/queries/find-and-count.js +0 -193
  99. package/lib/mongodb/queries/find-by-ids.js +0 -236
  100. package/lib/mongodb/queries/find-one-by-id.js +0 -171
  101. package/lib/mongodb/queries/find-one.js +0 -71
  102. package/lib/mongodb/queries/find-page.js +0 -618
  103. package/lib/mongodb/queries/find.js +0 -171
  104. package/lib/mongodb/queries/index.js +0 -51
  105. package/lib/mongodb/queries/watch.js +0 -538
  106. package/lib/mongodb/writes/common/batch-retry.js +0 -65
  107. package/lib/mongodb/writes/delete-batch.js +0 -323
  108. package/lib/mongodb/writes/delete-many.js +0 -181
  109. package/lib/mongodb/writes/delete-one.js +0 -173
  110. package/lib/mongodb/writes/find-one-and-delete.js +0 -203
  111. package/lib/mongodb/writes/find-one-and-replace.js +0 -239
  112. package/lib/mongodb/writes/find-one-and-update.js +0 -240
  113. package/lib/mongodb/writes/increment-one.js +0 -259
  114. package/lib/mongodb/writes/index.js +0 -46
  115. package/lib/mongodb/writes/insert-batch.js +0 -508
  116. package/lib/mongodb/writes/insert-many.js +0 -223
  117. package/lib/mongodb/writes/insert-one.js +0 -169
  118. package/lib/mongodb/writes/replace-one.js +0 -226
  119. package/lib/mongodb/writes/result-handler.js +0 -237
  120. package/lib/mongodb/writes/update-batch.js +0 -416
  121. package/lib/mongodb/writes/update-many.js +0 -275
  122. package/lib/mongodb/writes/update-one.js +0 -273
  123. package/lib/mongodb/writes/upsert-one.js +0 -203
  124. package/lib/multi-level-cache.js +0 -244
  125. package/lib/operators.js +0 -330
  126. package/lib/redis-cache-adapter.js +0 -267
  127. package/lib/saga/SagaContext.js +0 -67
  128. package/lib/saga/SagaDefinition.js +0 -32
  129. package/lib/saga/SagaExecutor.js +0 -201
  130. package/lib/saga/SagaOrchestrator.js +0 -186
  131. package/lib/saga/index.js +0 -11
  132. package/lib/slow-query-log/base-storage.js +0 -70
  133. package/lib/slow-query-log/batch-queue.js +0 -97
  134. package/lib/slow-query-log/config-manager.js +0 -196
  135. package/lib/slow-query-log/index.js +0 -238
  136. package/lib/slow-query-log/mongodb-storage.js +0 -324
  137. package/lib/slow-query-log/query-hash.js +0 -39
  138. package/lib/sync/ChangeStreamSyncManager.js +0 -405
  139. package/lib/sync/ResumeTokenStore.js +0 -192
  140. package/lib/sync/SyncConfig.js +0 -127
  141. package/lib/sync/SyncTarget.js +0 -240
  142. package/lib/sync/index.js +0 -20
  143. package/lib/transaction/CacheLockManager.js +0 -162
  144. package/lib/transaction/DistributedCacheLockManager.js +0 -475
  145. package/lib/transaction/Transaction.js +0 -315
  146. package/lib/transaction/TransactionManager.js +0 -267
  147. package/lib/transaction/index.js +0 -11
  148. package/lib/utils/objectid-converter.js +0 -632
  149. package/types/README.md +0 -122
  150. package/types/base.ts +0 -94
  151. package/types/batch.ts +0 -187
  152. package/types/cache.ts +0 -71
  153. package/types/chain.ts +0 -254
  154. package/types/collection.ts +0 -357
  155. package/types/expression.ts +0 -109
  156. package/types/function-cache.d.ts +0 -135
  157. package/types/lock.ts +0 -95
  158. package/types/model/definition.ts +0 -152
  159. package/types/model/index.ts +0 -10
  160. package/types/model/instance.ts +0 -121
  161. package/types/model/relations.ts +0 -121
  162. package/types/model/virtuals.ts +0 -32
  163. package/types/monsqlize.ts +0 -245
  164. package/types/options.ts +0 -192
  165. package/types/pagination.ts +0 -154
  166. package/types/pool.ts +0 -125
  167. package/types/query.ts +0 -71
  168. package/types/saga.ts +0 -125
  169. package/types/stream.ts +0 -64
  170. package/types/sync.ts +0 -79
  171. package/types/transaction.ts +0 -79
  172. package/types/write.ts +0 -77
@@ -1,324 +0,0 @@
1
- /**
2
- * MongoDB慢查询日志存储实现
3
- * 实现方案B(更新记录去重)
4
- *
5
- * @version 1.3.0
6
- * @since 2025-12-22
7
- */
8
-
9
- const { ISlowQueryLogStorage } = require('./base-storage');
10
- const { generateQueryHash } = require('./query-hash');
11
-
12
- class MongoDBSlowQueryLogStorage extends ISlowQueryLogStorage {
13
- /**
14
- * 创建MongoDB存储实例
15
- * @param {Object} config - 存储配置
16
- * @param {string} [config.uri] - MongoDB连接URI(独立连接时)
17
- * @param {string} [config.database='admin'] - 存储数据库
18
- * @param {string} [config.collection='slow_query_logs'] - 存储集合
19
- * @param {number} [config.ttl=604800] - TTL过期时间(秒)
20
- * @param {string} [config.ttlField='lastSeen'] - TTL字段
21
- * @param {Object} [client] - MongoDB客户端(复用连接时)
22
- * @param {Object} [logger] - 日志记录器
23
- */
24
- constructor(config, client, logger) {
25
- super();
26
- this.config = config;
27
- this.client = client; // 可能是复用的业务连接
28
- this.ownClient = null; // 独立连接(如果创建)
29
- this.collection = null;
30
- this.logger = logger || console;
31
- this.initialized = false;
32
- }
33
-
34
- /**
35
- * 初始化存储(连接+创建索引)
36
- * @returns {Promise<void>}
37
- */
38
- async initialize() {
39
- if (this.initialized) {
40
- return;
41
- }
42
-
43
- try {
44
- // 如果没有传入client,创建独立连接
45
- if (!this.client) {
46
- if (!this.config.uri) {
47
- throw new Error('MongoDB URI is required when client is not provided');
48
- }
49
-
50
- const { MongoClient } = require('mongodb');
51
- this.ownClient = await MongoClient.connect(this.config.uri);
52
- this.client = this.ownClient;
53
-
54
- if (this.logger.info) {
55
- this.logger.info(`[SlowQueryLog] Connected to MongoDB: ${this.config.uri}`);
56
- }
57
- }
58
-
59
- // 获取数据库和集合
60
- const dbName = this.config.database || 'admin';
61
- const collName = this.config.collection || 'slow_query_logs';
62
-
63
- this.db = this.client.db(dbName);
64
- this.collection = this.db.collection(collName);
65
-
66
- // 创建索引
67
- await this.setupIndexes();
68
-
69
- this.initialized = true;
70
-
71
- if (this.logger.info) {
72
- this.logger.info(
73
- `[SlowQueryLog] Initialized MongoDB storage: ${dbName}.${collName}`
74
- );
75
- }
76
- } catch (err) {
77
- if (this.logger.error) {
78
- this.logger.error('[SlowQueryLog] Failed to initialize MongoDB storage:', err);
79
- }
80
- throw err;
81
- }
82
- }
83
-
84
- /**
85
- * 创建索引
86
- * @returns {Promise<void>}
87
- */
88
- async setupIndexes() {
89
- try {
90
- // 索引1:queryHash唯一索引(去重关键)
91
- await this.collection.createIndex(
92
- { queryHash: 1 },
93
- { unique: true, name: 'idx_queryHash_unique' }
94
- );
95
-
96
- // 索引2:lastSeen TTL索引(自动过期)
97
- const ttl = this.config.ttl || 7 * 24 * 3600;
98
- const ttlField = this.config.ttlField || 'lastSeen';
99
-
100
- await this.collection.createIndex(
101
- { [ttlField]: 1 },
102
- {
103
- name: 'idx_lastSeen_ttl',
104
- expireAfterSeconds: ttl
105
- }
106
- );
107
-
108
- // 索引3:按集合查询(辅助索引)
109
- await this.collection.createIndex(
110
- { db: 1, collection: 1 },
111
- { name: 'idx_db_collection' }
112
- );
113
-
114
- // 索引4:按执行次数查询(找高频慢查询)
115
- await this.collection.createIndex(
116
- { count: -1 },
117
- { name: 'idx_count_desc' }
118
- );
119
-
120
- if (this.logger.debug) {
121
- this.logger.debug('[SlowQueryLog] MongoDB indexes created successfully');
122
- }
123
- } catch (err) {
124
- // 索引创建失败不应该阻塞功能
125
- if (this.logger.warn) {
126
- this.logger.warn('[SlowQueryLog] Failed to create some indexes:', err.message);
127
- }
128
- }
129
- }
130
-
131
- /**
132
- * 保存单条慢查询日志(upsert)
133
- * @param {Object} log - 慢查询日志对象
134
- * @returns {Promise<void>}
135
- */
136
- async save(log) {
137
- if (!this.initialized) {
138
- await this.initialize();
139
- }
140
-
141
- const queryHash = generateQueryHash(log);
142
- await this.upsert(queryHash, log);
143
- }
144
-
145
- /**
146
- * 批量保存慢查询日志(bulkWrite + upsert)
147
- * @param {Object[]} logs - 慢查询日志数组
148
- * @returns {Promise<void>}
149
- */
150
- async saveBatch(logs) {
151
- if (!this.initialized) {
152
- await this.initialize();
153
- }
154
-
155
- if (!logs || logs.length === 0) {
156
- return;
157
- }
158
-
159
- try {
160
- // 构建bulkWrite操作数组
161
- const operations = logs.map(log => {
162
- const queryHash = generateQueryHash(log);
163
- const timestamp = log.timestamp || new Date();
164
- const executionTimeMs = log.executionTimeMs || log.ms || 0;
165
-
166
- return {
167
- updateOne: {
168
- filter: { queryHash },
169
- update: {
170
- $set: {
171
- lastSeen: timestamp,
172
- lastExecution: {
173
- executionTimeMs,
174
- timestamp,
175
- metadata: log.metadata || {}
176
- }
177
- },
178
- $inc: {
179
- count: 1,
180
- totalTimeMs: executionTimeMs
181
- },
182
- $min: { minTimeMs: executionTimeMs },
183
- $max: { maxTimeMs: executionTimeMs },
184
- $setOnInsert: {
185
- queryHash,
186
- db: log.db,
187
- collection: log.collection || log.coll,
188
- operation: log.operation || log.op,
189
- queryShape: log.queryShape || {},
190
- type: log.type || 'mongodb',
191
- firstSeen: timestamp
192
- }
193
- },
194
- upsert: true
195
- }
196
- };
197
- });
198
-
199
- // 批量写入(ordered=false 允许部分失败)
200
- const result = await this.collection.bulkWrite(operations, { ordered: false });
201
-
202
- if (this.logger.debug) {
203
- this.logger.debug(
204
- `[SlowQueryLog] Batch saved: ${result.upsertedCount} inserted, ` +
205
- `${result.modifiedCount} updated`
206
- );
207
- }
208
- } catch (err) {
209
- if (this.logger.error) {
210
- this.logger.error('[SlowQueryLog] Failed to save batch:', err);
211
- }
212
- throw err;
213
- }
214
- }
215
-
216
- /**
217
- * 单条upsert操作
218
- * @param {string} queryHash - 查询Hash
219
- * @param {Object} log - 慢查询日志对象
220
- * @returns {Promise<void>}
221
- */
222
- async upsert(queryHash, log) {
223
- const timestamp = log.timestamp || new Date();
224
- const executionTimeMs = log.executionTimeMs || log.ms || 0;
225
-
226
- await this.collection.updateOne(
227
- { queryHash },
228
- {
229
- $set: {
230
- lastSeen: timestamp,
231
- lastExecution: {
232
- executionTimeMs,
233
- timestamp,
234
- metadata: log.metadata || {}
235
- }
236
- },
237
- $inc: {
238
- count: 1,
239
- totalTimeMs: executionTimeMs
240
- },
241
- $min: { minTimeMs: executionTimeMs },
242
- $max: { maxTimeMs: executionTimeMs },
243
- $setOnInsert: {
244
- queryHash,
245
- db: log.db,
246
- collection: log.collection || log.coll,
247
- operation: log.operation || log.op,
248
- queryShape: log.queryShape || {},
249
- type: log.type || 'mongodb',
250
- firstSeen: timestamp
251
- }
252
- },
253
- { upsert: true }
254
- );
255
- }
256
-
257
- /**
258
- * 查询慢查询日志
259
- * @param {Object} filter - 查询条件
260
- * @param {Object} options - 查询选项
261
- * @returns {Promise<Object[]>}
262
- */
263
- async query(filter = {}, options = {}) {
264
- if (!this.initialized) {
265
- await this.initialize();
266
- }
267
-
268
- try {
269
- const cursor = this.collection.find(filter);
270
-
271
- if (options.sort) {
272
- cursor.sort(options.sort);
273
- }
274
- if (options.limit) {
275
- cursor.limit(options.limit);
276
- }
277
- if (options.skip) {
278
- cursor.skip(options.skip);
279
- }
280
-
281
- const results = await cursor.toArray();
282
-
283
- // 计算avgTimeMs(动态计算)
284
- return results.map(doc => ({
285
- ...doc,
286
- avgTimeMs: doc.count > 0 ? Math.round(doc.totalTimeMs / doc.count) : 0
287
- }));
288
- } catch (err) {
289
- if (this.logger.error) {
290
- this.logger.error('[SlowQueryLog] Failed to query:', err);
291
- }
292
- return [];
293
- }
294
- }
295
-
296
- /**
297
- * 关闭连接
298
- * @returns {Promise<void>}
299
- */
300
- async close() {
301
- // 只关闭自己创建的连接,不关闭复用的连接
302
- if (this.ownClient) {
303
- try {
304
- await this.ownClient.close();
305
- if (this.logger.info) {
306
- this.logger.info('[SlowQueryLog] MongoDB connection closed');
307
- }
308
- } catch (err) {
309
- if (this.logger.error) {
310
- this.logger.error('[SlowQueryLog] Failed to close MongoDB connection:', err);
311
- }
312
- }
313
- this.ownClient = null;
314
- }
315
-
316
- this.client = null;
317
- this.collection = null;
318
- this.initialized = false;
319
- }
320
- }
321
-
322
- module.exports = { MongoDBSlowQueryLogStorage };
323
-
324
-
@@ -1,39 +0,0 @@
1
- /**
2
- * 慢查询Hash生成工具
3
- * 用于生成queryHash(去重标识)
4
- *
5
- * @version 1.3.0
6
- * @since 2025-12-22
7
- */
8
-
9
- const crypto = require('crypto');
10
-
11
- /**
12
- * 生成慢查询的唯一Hash标识
13
- * @param {Object} log - 慢查询日志对象
14
- * @param {string} log.db - 数据库名
15
- * @param {string} log.collection - 集合名
16
- * @param {string} log.operation - 操作类型
17
- * @param {Object} log.queryShape - 查询模式(已脱敏)
18
- * @returns {string} 16位Hash字符串
19
- */
20
- function generateQueryHash(log) {
21
- // 构建唯一键(不包含executionTimeMs、timestamp等动态字段)
22
- const key = JSON.stringify({
23
- db: log.db || '',
24
- collection: log.collection || log.coll || '',
25
- operation: log.operation || log.op || '',
26
- queryShape: log.queryShape || {}
27
- });
28
-
29
- // 生成SHA256 Hash,取前16位
30
- return crypto
31
- .createHash('sha256')
32
- .update(key)
33
- .digest('hex')
34
- .substring(0, 16);
35
- }
36
-
37
- module.exports = { generateQueryHash };
38
-
39
-