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,196 +0,0 @@
1
- /**
2
- * 慢查询日志配置管理器
3
- * 负责配置合并、验证和默认值处理
4
- *
5
- * @version 1.3.0
6
- * @since 2025-12-22
7
- */
8
-
9
- // 默认配置
10
- const DEFAULT_CONFIG = {
11
- enabled: false,
12
-
13
- storage: {
14
- type: null, // null = 自动推断
15
- useBusinessConnection: true,
16
- uri: null,
17
-
18
- mongodb: {
19
- database: 'admin',
20
- collection: 'slow_query_logs',
21
- ttl: 7 * 24 * 3600, // 7天
22
- ttlField: 'lastSeen'
23
- }
24
- },
25
-
26
- deduplication: {
27
- enabled: true,
28
- strategy: 'aggregate',
29
- keepRecentExecutions: 0
30
- },
31
-
32
- batch: {
33
- enabled: true,
34
- size: 10,
35
- interval: 5000,
36
- maxBufferSize: 100
37
- },
38
-
39
- filter: {
40
- excludeDatabases: [],
41
- excludeCollections: [],
42
- excludeOperations: [],
43
- minExecutionTimeMs: 0
44
- },
45
-
46
- advanced: {
47
- autoCreateIndexes: true,
48
- validateConnection: true,
49
- errorHandling: 'log', // log | throw | silent
50
- debug: false
51
- }
52
- };
53
-
54
- class SlowQueryLogConfigManager {
55
- /**
56
- * 合并用户配置与默认配置
57
- * @param {*} userConfig - 用户配置(可以是boolean或object)
58
- * @param {string} businessType - 业务库类型
59
- * @returns {Object} 合并后的完整配置
60
- */
61
- static mergeConfig(userConfig, businessType) {
62
- // 场景1:未配置(默认禁用)
63
- if (userConfig === undefined || userConfig === null) {
64
- return { ...deepClone(DEFAULT_CONFIG), enabled: false };
65
- }
66
-
67
- // 场景2:boolean快捷配置
68
- if (typeof userConfig === 'boolean') {
69
- const config = deepClone(DEFAULT_CONFIG);
70
- config.enabled = userConfig;
71
-
72
- // 自动推断storage.type
73
- if (userConfig && businessType) {
74
- config.storage.type = businessType;
75
- }
76
-
77
- return config;
78
- }
79
-
80
- // 场景3:对象配置(深度合并)
81
- if (typeof userConfig === 'object') {
82
- const merged = deepMerge(deepClone(DEFAULT_CONFIG), userConfig);
83
-
84
- // 智能推断:如果提供了storage配置,自动启用
85
- if (userConfig.storage && merged.enabled === false) {
86
- merged.enabled = true;
87
- }
88
-
89
- // 自动推断storage.type
90
- if (merged.storage.type === null && businessType) {
91
- if (merged.storage.useBusinessConnection) {
92
- merged.storage.type = businessType;
93
- } else {
94
- merged.storage.type = 'mongodb'; // 独立连接默认MongoDB
95
- }
96
- }
97
-
98
- return merged;
99
- }
100
-
101
- throw new Error('Invalid slowQueryLog config type. Expected boolean or object');
102
- }
103
-
104
- /**
105
- * 验证配置合法性
106
- * @param {Object} config - 配置对象
107
- * @param {string} businessType - 业务库类型
108
- * @throws {Error} 配置错误时抛出异常
109
- */
110
- static validate(config, businessType) {
111
- const { storage } = config;
112
-
113
- // 验证storage.type
114
- const validTypes = ['mongodb', 'postgresql', 'mysql', 'file', 'custom'];
115
- if (storage.type && !validTypes.includes(storage.type)) {
116
- throw new Error(
117
- `Invalid storage.type: ${storage.type}. ` +
118
- `Valid types are: ${validTypes.join(', ')}`
119
- );
120
- }
121
-
122
- // 验证复用连接的类型一致性
123
- if (storage.useBusinessConnection === true) {
124
- if (storage.type && storage.type !== businessType) {
125
- throw new Error(
126
- `Cannot use business connection when storage type (${storage.type}) ` +
127
- `differs from business type (${businessType}). ` +
128
- `Set useBusinessConnection=false and provide storage.uri`
129
- );
130
- }
131
- } else {
132
- // 验证独立连接的uri
133
- if (!storage.uri) {
134
- throw new Error(
135
- 'storage.uri is required when useBusinessConnection=false'
136
- );
137
- }
138
- }
139
-
140
- // 验证deduplication.strategy
141
- const validStrategies = ['aggregate', 'none'];
142
- if (!validStrategies.includes(config.deduplication.strategy)) {
143
- throw new Error(
144
- `Invalid deduplication.strategy: ${config.deduplication.strategy}. ` +
145
- `Valid strategies are: ${validStrategies.join(', ')}`
146
- );
147
- }
148
-
149
- // 验证TTL
150
- if (storage.mongodb.ttl < 0) {
151
- throw new Error('storage.mongodb.ttl must be positive');
152
- }
153
-
154
- // 验证batch配置
155
- if (config.batch.size < 1 || config.batch.size > 1000) {
156
- throw new Error('batch.size must be between 1 and 1000');
157
- }
158
-
159
- if (config.batch.interval < 100) {
160
- throw new Error('batch.interval must be >= 100ms');
161
- }
162
-
163
- return true;
164
- }
165
- }
166
-
167
- /**
168
- * 深度克隆对象
169
- * @param {Object} obj - 源对象
170
- * @returns {Object} 克隆后的对象
171
- */
172
- function deepClone(obj) {
173
- return JSON.parse(JSON.stringify(obj));
174
- }
175
-
176
- /**
177
- * 深度合并对象
178
- * @param {Object} target - 目标对象
179
- * @param {Object} source - 源对象
180
- * @returns {Object} 合并后的对象
181
- */
182
- function deepMerge(target, source) {
183
- for (const key in source) {
184
- if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {
185
- target[key] = target[key] || {};
186
- deepMerge(target[key], source[key]);
187
- } else {
188
- target[key] = source[key];
189
- }
190
- }
191
- return target;
192
- }
193
-
194
- module.exports = { SlowQueryLogConfigManager, DEFAULT_CONFIG };
195
-
196
-
@@ -1,238 +0,0 @@
1
- /**
2
- * 慢查询日志模块导出
3
- *
4
- * @version 1.3.0
5
- * @since 2025-12-22
6
- */
7
-
8
- const { ISlowQueryLogStorage } = require('./base-storage');
9
- const { MongoDBSlowQueryLogStorage } = require('./mongodb-storage');
10
- const { BatchQueue } = require('./batch-queue');
11
- const { generateQueryHash } = require('./query-hash');
12
- const { SlowQueryLogConfigManager, DEFAULT_CONFIG } = require('./config-manager');
13
-
14
- /**
15
- * 慢查询日志管理器
16
- * 统一管理存储、队列、配置
17
- */
18
- class SlowQueryLogManager {
19
- /**
20
- * 创建慢查询日志管理器
21
- * @param {Object} userConfig - 用户配置
22
- * @param {Object} [businessClient] - 业务数据库客户端(复用连接时)
23
- * @param {string} businessType - 业务数据库类型
24
- * @param {Object} logger - 日志记录器
25
- */
26
- constructor(userConfig, businessClient, businessType, logger) {
27
- this.logger = logger || console;
28
-
29
- // 合并配置
30
- this.config = SlowQueryLogConfigManager.mergeConfig(userConfig, businessType);
31
-
32
- // 验证配置
33
- SlowQueryLogConfigManager.validate(this.config, businessType);
34
-
35
- // 初始化存储适配器
36
- this.storage = this.createStorage(businessClient);
37
-
38
- // 初始化批量队列
39
- if (this.config.batch.enabled) {
40
- this.queue = new BatchQueue(this.storage, this.config.batch, this.logger);
41
- } else {
42
- this.queue = null;
43
- }
44
-
45
- this.initialized = false;
46
- }
47
-
48
- /**
49
- * 创建存储适配器
50
- * @param {Object} businessClient - 业务数据库客户端
51
- * @returns {ISlowQueryLogStorage}
52
- */
53
- createStorage(businessClient) {
54
- const { storage } = this.config;
55
-
56
- // 根据存储类型创建适配器
57
- switch (storage.type) {
58
- case 'mongodb': {
59
- const client = storage.useBusinessConnection ? businessClient : null;
60
- return new MongoDBSlowQueryLogStorage(
61
- storage.mongodb,
62
- client,
63
- this.logger
64
- );
65
- }
66
-
67
- case 'postgresql':
68
- case 'mysql':
69
- case 'file':
70
- case 'custom':
71
- throw new Error(
72
- `Storage type '${storage.type}' is not yet implemented. ` +
73
- `Currently only 'mongodb' is supported in v1.3`
74
- );
75
-
76
- default:
77
- throw new Error(`Unknown storage type: ${storage.type}`);
78
- }
79
- }
80
-
81
- /**
82
- * 初始化(延迟初始化)
83
- * @returns {Promise<void>}
84
- */
85
- async initialize() {
86
- if (this.initialized) {
87
- return;
88
- }
89
-
90
- try {
91
- await this.storage.initialize();
92
- this.initialized = true;
93
-
94
- if (this.logger.info) {
95
- this.logger.info('[SlowQueryLog] Manager initialized successfully');
96
- }
97
- } catch (err) {
98
- if (this.logger.error) {
99
- this.logger.error('[SlowQueryLog] Failed to initialize manager:', err);
100
- }
101
-
102
- // 根据错误处理策略决定是否抛出异常
103
- if (this.config.advanced.errorHandling === 'throw') {
104
- throw err;
105
- }
106
- }
107
- }
108
-
109
- /**
110
- * 保存慢查询日志
111
- * @param {Object} log - 慢查询日志对象
112
- * @returns {Promise<void>}
113
- */
114
- async save(log) {
115
- // 延迟初始化
116
- if (!this.initialized) {
117
- await this.initialize();
118
- }
119
-
120
- // 过滤检查
121
- if (this.shouldFilter(log)) {
122
- return;
123
- }
124
-
125
- try {
126
- if (this.queue) {
127
- // 批量模式:添加到队列
128
- await this.queue.add(log);
129
- } else {
130
- // 实时模式:直接保存
131
- await this.storage.save(log);
132
- }
133
- } catch (err) {
134
- if (this.logger.error) {
135
- this.logger.error('[SlowQueryLog] Failed to save log:', err);
136
- }
137
-
138
- // 保存失败不抛异常(不影响主流程)
139
- if (this.config.advanced.errorHandling === 'throw') {
140
- throw err;
141
- }
142
- }
143
- }
144
-
145
- /**
146
- * 检查是否应该过滤该日志
147
- * @param {Object} log - 慢查询日志对象
148
- * @returns {boolean}
149
- */
150
- shouldFilter(log) {
151
- const { filter } = this.config;
152
-
153
- // 检查数据库过滤
154
- if (filter.excludeDatabases.length > 0) {
155
- if (filter.excludeDatabases.includes(log.db)) {
156
- return true;
157
- }
158
- }
159
-
160
- // 检查集合过滤
161
- if (filter.excludeCollections.length > 0) {
162
- const coll = log.collection || log.coll;
163
- if (filter.excludeCollections.includes(coll)) {
164
- return true;
165
- }
166
- }
167
-
168
- // 检查操作类型过滤
169
- if (filter.excludeOperations.length > 0) {
170
- const op = log.operation || log.op;
171
- if (filter.excludeOperations.includes(op)) {
172
- return true;
173
- }
174
- }
175
-
176
- // 检查最小执行时间
177
- if (filter.minExecutionTimeMs > 0) {
178
- const ms = log.executionTimeMs || log.ms || 0;
179
- if (ms < filter.minExecutionTimeMs) {
180
- return true;
181
- }
182
- }
183
-
184
- return false;
185
- }
186
-
187
- /**
188
- * 查询慢查询日志
189
- * @param {Object} filter - 查询条件
190
- * @param {Object} options - 查询选项
191
- * @returns {Promise<Object[]>}
192
- */
193
- async query(filter, options) {
194
- if (!this.initialized) {
195
- await this.initialize();
196
- }
197
-
198
- return this.storage.query(filter, options);
199
- }
200
-
201
- /**
202
- * 关闭管理器
203
- * @returns {Promise<void>}
204
- */
205
- async close() {
206
- try {
207
- // 关闭队列(确保数据不丢失)
208
- if (this.queue) {
209
- await this.queue.close();
210
- }
211
-
212
- // 关闭存储
213
- await this.storage.close();
214
-
215
- this.initialized = false;
216
-
217
- if (this.logger.info) {
218
- this.logger.info('[SlowQueryLog] Manager closed');
219
- }
220
- } catch (err) {
221
- if (this.logger.error) {
222
- this.logger.error('[SlowQueryLog] Failed to close manager:', err);
223
- }
224
- }
225
- }
226
- }
227
-
228
- module.exports = {
229
- SlowQueryLogManager,
230
- SlowQueryLogConfigManager,
231
- MongoDBSlowQueryLogStorage,
232
- BatchQueue,
233
- generateQueryHash,
234
- DEFAULT_CONFIG,
235
- ISlowQueryLogStorage
236
- };
237
-
238
-