midway-fatcms 0.0.16 → 0.0.17

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 (119) hide show
  1. package/dist/config/config.default.js +5 -3
  2. package/dist/configuration.d.ts +0 -3
  3. package/dist/configuration.js +0 -19
  4. package/dist/controller/gateway/ProxyApiGatewayController.d.ts +0 -2
  5. package/dist/controller/gateway/ProxyApiGatewayController.js +0 -18
  6. package/dist/controller/helpers.controller.d.ts +4 -5
  7. package/dist/controller/helpers.controller.js +56 -14
  8. package/dist/controller/manage/AccountRoleManageApi.js +3 -5
  9. package/dist/controller/manage/AnyApiMangeApi.js +4 -3
  10. package/dist/controller/manage/AppMangeApi.js +3 -4
  11. package/dist/controller/manage/AppPageMangeApi.js +4 -3
  12. package/dist/controller/manage/CrudMethodsMangeApi.js +3 -4
  13. package/dist/controller/manage/DataDictManageApi.js +6 -7
  14. package/dist/controller/manage/DeployManageApi.js +4 -5
  15. package/dist/controller/manage/FlowConfigManageApi.js +3 -5
  16. package/dist/controller/manage/MenuManageApi.js +3 -4
  17. package/dist/controller/manage/ProxyApiMangeApi.js +3 -4
  18. package/dist/controller/manage/SysConfigMangeApi.js +3 -3
  19. package/dist/controller/manage/SystemInfoManageApi.js +3 -1
  20. package/dist/controller/manage/WorkbenchMangeApi.js +3 -4
  21. package/dist/index.d.ts +3 -0
  22. package/dist/index.js +3 -0
  23. package/dist/libs/crud-pro/models/TransactionSqlServer.js +27 -4
  24. package/dist/libs/crud-pro/services/CrudProCachedCfgService.d.ts +5 -8
  25. package/dist/libs/crud-pro/services/CrudProCachedCfgService.js +25 -42
  26. package/dist/libs/crud-pro/utils/CrudMonitor.d.ts +0 -9
  27. package/dist/libs/crud-pro/utils/CrudMonitor.js +0 -21
  28. package/dist/libs/crud-pro/utils/pool/SqlServerUtils.js +26 -0
  29. package/dist/middleware/cacherefresh.middleware.d.ts +3 -46
  30. package/dist/middleware/cacherefresh.middleware.js +9 -67
  31. package/dist/models/CacheRefreshCategory.d.ts +1 -18
  32. package/dist/models/CacheRefreshCategory.js +0 -17
  33. package/dist/models/SystemEntities.d.ts +2 -0
  34. package/dist/models/bizmodels.d.ts +0 -8
  35. package/dist/models/bizmodels.js +0 -8
  36. package/dist/schedule/scheduleNames.d.ts +2 -0
  37. package/dist/schedule/scheduleNames.js +3 -1
  38. package/dist/service/SysAppService.d.ts +2 -5
  39. package/dist/service/SysAppService.js +15 -69
  40. package/dist/service/SysConfigService.d.ts +1 -6
  41. package/dist/service/SysConfigService.js +7 -46
  42. package/dist/service/SysDictDataService.d.ts +2 -5
  43. package/dist/service/SysDictDataService.js +13 -59
  44. package/dist/service/SysMenuService.d.ts +1 -4
  45. package/dist/service/SysMenuService.js +6 -42
  46. package/dist/service/WorkbenchService.d.ts +1 -5
  47. package/dist/service/WorkbenchService.js +10 -61
  48. package/dist/service/anyapi/AnyApiService.d.ts +1 -1
  49. package/dist/service/anyapi/AnyApiService.js +6 -16
  50. package/dist/service/base/bizmemcache/BizMemCacheService.d.ts +16 -0
  51. package/dist/service/base/bizmemcache/BizMemCacheService.js +239 -0
  52. package/dist/service/base/bizmemcache/BizMemCacheStore.d.ts +34 -0
  53. package/dist/service/base/bizmemcache/BizMemCacheStore.js +118 -0
  54. package/dist/service/base/bizmemcache/BizMemCacheTypes.d.ts +60 -0
  55. package/dist/service/base/bizmemcache/BizMemCacheTypes.js +18 -0
  56. package/dist/service/base/cache-refresh/CacheRefreshHub.d.ts +0 -22
  57. package/dist/service/base/cache-refresh/CacheRefreshHub.js +0 -22
  58. package/dist/service/base/cache-refresh/CacheRefreshHubScheduleService.d.ts +0 -6
  59. package/dist/service/base/cache-refresh/CacheRefreshHubScheduleService.js +0 -6
  60. package/dist/service/curd/CurdMixByDictService.d.ts +0 -4
  61. package/dist/service/curd/CurdMixByDictService.js +9 -55
  62. package/dist/service/curd/CurdMixBySysConfigService.d.ts +0 -5
  63. package/dist/service/curd/CurdMixBySysConfigService.js +9 -54
  64. package/dist/service/curd/CurdMixByWorkbenchService.d.ts +0 -1
  65. package/dist/service/curd/CurdMixByWorkbenchService.js +9 -36
  66. package/dist/service/curd/CurdProService.d.ts +0 -1
  67. package/dist/service/curd/CurdProService.js +0 -4
  68. package/dist/service/proxyapi/ProxyApiLoadService.d.ts +3 -8
  69. package/dist/service/proxyapi/ProxyApiLoadService.js +40 -68
  70. package/dist/service/proxyapi/ProxyApiService.d.ts +2 -0
  71. package/dist/service/proxyapi/ProxyApiService.js +32 -9
  72. package/dist/service/proxyapi/RouteTrie.d.ts +1 -7
  73. package/dist/service/proxyapi/RouteTrie.js +1 -17
  74. package/package.json +1 -1
  75. package/src/config/config.default.ts +4 -2
  76. package/src/configuration.ts +0 -23
  77. package/src/controller/gateway/ProxyApiGatewayController.ts +1 -9
  78. package/src/controller/helpers.controller.ts +66 -15
  79. package/src/controller/manage/AccountRoleManageApi.ts +3 -5
  80. package/src/controller/manage/AnyApiMangeApi.ts +4 -3
  81. package/src/controller/manage/AppMangeApi.ts +4 -5
  82. package/src/controller/manage/AppPageMangeApi.ts +4 -3
  83. package/src/controller/manage/CrudMethodsMangeApi.ts +4 -5
  84. package/src/controller/manage/DataDictManageApi.ts +7 -8
  85. package/src/controller/manage/DeployManageApi.ts +2 -3
  86. package/src/controller/manage/FlowConfigManageApi.ts +3 -5
  87. package/src/controller/manage/MenuManageApi.ts +4 -5
  88. package/src/controller/manage/ProxyApiMangeApi.ts +4 -5
  89. package/src/controller/manage/SysConfigMangeApi.ts +5 -5
  90. package/src/controller/manage/SystemInfoManageApi.ts +3 -1
  91. package/src/controller/manage/WorkbenchMangeApi.ts +4 -5
  92. package/src/index.ts +3 -0
  93. package/src/libs/crud-pro/models/TransactionSqlServer.ts +26 -4
  94. package/src/libs/crud-pro/services/CrudProCachedCfgService.ts +25 -43
  95. package/src/libs/crud-pro/utils/CrudMonitor.ts +0 -23
  96. package/src/libs/crud-pro/utils/pool/SqlServerUtils.ts +31 -0
  97. package/src/middleware/cacherefresh.middleware.ts +10 -71
  98. package/src/models/CacheRefreshCategory.ts +0 -17
  99. package/src/models/SystemEntities.ts +2 -0
  100. package/src/models/bizmodels.ts +0 -8
  101. package/src/schedule/scheduleNames.ts +5 -3
  102. package/src/service/SysAppService.ts +13 -66
  103. package/src/service/SysConfigService.ts +6 -39
  104. package/src/service/SysDictDataService.ts +11 -56
  105. package/src/service/SysMenuService.ts +4 -37
  106. package/src/service/WorkbenchService.ts +10 -68
  107. package/src/service/anyapi/AnyApiService.ts +5 -17
  108. package/src/service/base/bizmemcache/BizMemCacheService.ts +288 -0
  109. package/src/service/base/bizmemcache/BizMemCacheStore.ts +158 -0
  110. package/src/service/base/bizmemcache/BizMemCacheTypes.ts +76 -0
  111. package/src/service/base/cache-refresh/CacheRefreshHub.ts +0 -22
  112. package/src/service/base/cache-refresh/CacheRefreshHubScheduleService.ts +0 -6
  113. package/src/service/curd/CurdMixByDictService.ts +10 -61
  114. package/src/service/curd/CurdMixBySysConfigService.ts +9 -62
  115. package/src/service/curd/CurdMixByWorkbenchService.ts +7 -32
  116. package/src/service/curd/CurdProService.ts +0 -6
  117. package/src/service/proxyapi/ProxyApiLoadService.ts +39 -77
  118. package/src/service/proxyapi/ProxyApiService.ts +45 -9
  119. package/src/service/proxyapi/RouteTrie.ts +1 -18
@@ -15,7 +15,6 @@ const keys_1 = require("../../libs/crud-pro/models/keys");
15
15
  const BaseApiController_1 = require("../base/BaseApiController");
16
16
  const permission_middleware_1 = require("../../middleware/permission.middleware");
17
17
  const cacherefresh_middleware_1 = require("../../middleware/cacherefresh.middleware");
18
- const CacheRefreshCategory_1 = require("../../models/CacheRefreshCategory");
19
18
  const SystemPerm_1 = require("../../models/SystemPerm");
20
19
  const SystemTables_1 = require("../../models/SystemTables");
21
20
  let ProxyApiMangeApi = class ProxyApiMangeApi extends BaseApiController_1.BaseApiController {
@@ -66,19 +65,19 @@ __decorate([
66
65
  __metadata("design:returntype", Promise)
67
66
  ], ProxyApiMangeApi.prototype, "getProxyApiOne", null);
68
67
  __decorate([
69
- (0, core_1.Post)('/createProxyApi', { middleware: [(0, permission_middleware_1.checkPermission)(SystemPerm_1.SystemFuncCode.ProxyApiManageWrite), (0, cacherefresh_middleware_1.refreshCategory)(CacheRefreshCategory_1.CacheRefreshCategory.ProxyApiRoute)] }),
68
+ (0, core_1.Post)('/createProxyApi', { middleware: [(0, permission_middleware_1.checkPermission)(SystemPerm_1.SystemFuncCode.ProxyApiManageWrite), (0, cacherefresh_middleware_1.refreshBizMemCache)('sysProxyApiCacheObj')] }),
70
69
  __metadata("design:type", Function),
71
70
  __metadata("design:paramtypes", []),
72
71
  __metadata("design:returntype", Promise)
73
72
  ], ProxyApiMangeApi.prototype, "createProxyApi", null);
74
73
  __decorate([
75
- (0, core_1.Post)('/updateProxyApi', { middleware: [(0, permission_middleware_1.checkPermission)(SystemPerm_1.SystemFuncCode.ProxyApiManageWrite), (0, cacherefresh_middleware_1.refreshCategory)(CacheRefreshCategory_1.CacheRefreshCategory.ProxyApiRoute)] }),
74
+ (0, core_1.Post)('/updateProxyApi', { middleware: [(0, permission_middleware_1.checkPermission)(SystemPerm_1.SystemFuncCode.ProxyApiManageWrite), (0, cacherefresh_middleware_1.refreshBizMemCache)('sysProxyApiCacheObj')] }),
76
75
  __metadata("design:type", Function),
77
76
  __metadata("design:paramtypes", []),
78
77
  __metadata("design:returntype", Promise)
79
78
  ], ProxyApiMangeApi.prototype, "updateProxyApi", null);
80
79
  __decorate([
81
- (0, core_1.Post)('/deleteProxyApi', { middleware: [(0, permission_middleware_1.checkPermission)(SystemPerm_1.SystemFuncCode.ProxyApiManageWrite), (0, cacherefresh_middleware_1.refreshCategory)(CacheRefreshCategory_1.CacheRefreshCategory.ProxyApiRoute)] }),
80
+ (0, core_1.Post)('/deleteProxyApi', { middleware: [(0, permission_middleware_1.checkPermission)(SystemPerm_1.SystemFuncCode.ProxyApiManageWrite), (0, cacherefresh_middleware_1.refreshBizMemCache)('sysProxyApiCacheObj')] }),
82
81
  __metadata("design:type", Function),
83
82
  __metadata("design:paramtypes", []),
84
83
  __metadata("design:returntype", Promise)
@@ -115,19 +115,19 @@ __decorate([
115
115
  __metadata("design:returntype", Promise)
116
116
  ], SysConfigMangeApi.prototype, "getSysConfigOne", null);
117
117
  __decorate([
118
- (0, core_1.Post)('/createSysConfig', { middleware: [(0, permission_middleware_1.checkPermission)(SystemPerm_1.SystemFuncCode.SysConfigMangeWrite), (0, cacherefresh_middleware_1.refreshCache)(bizmodels_1.CacheNameEnum.GetSysConfigOne)] }),
118
+ (0, core_1.Post)('/createSysConfig', { middleware: [(0, permission_middleware_1.checkPermission)(SystemPerm_1.SystemFuncCode.SysConfigMangeWrite), (0, cacherefresh_middleware_1.refreshBizMemCache)('sysConfgCacheObj')] }),
119
119
  __metadata("design:type", Function),
120
120
  __metadata("design:paramtypes", []),
121
121
  __metadata("design:returntype", Promise)
122
122
  ], SysConfigMangeApi.prototype, "createSysConfig", null);
123
123
  __decorate([
124
- (0, core_1.Post)('/updateSysConfig', { middleware: [(0, permission_middleware_1.checkPermission)(SystemPerm_1.SystemFuncCode.SysConfigMangeWrite), (0, cacherefresh_middleware_1.refreshCache)(bizmodels_1.CacheNameEnum.GetSysConfigOne)] }),
124
+ (0, core_1.Post)('/updateSysConfig', { middleware: [(0, permission_middleware_1.checkPermission)(SystemPerm_1.SystemFuncCode.SysConfigMangeWrite), (0, cacherefresh_middleware_1.refreshBizMemCache)('sysConfgCacheObj')] }),
125
125
  __metadata("design:type", Function),
126
126
  __metadata("design:paramtypes", []),
127
127
  __metadata("design:returntype", Promise)
128
128
  ], SysConfigMangeApi.prototype, "updateSysConfig", null);
129
129
  __decorate([
130
- (0, core_1.Post)('/deleteSysConfig', { middleware: [(0, permission_middleware_1.checkPermission)(SystemPerm_1.SystemFuncCode.SysConfigMangeWrite), (0, cacherefresh_middleware_1.refreshCache)(bizmodels_1.CacheNameEnum.GetSysConfigOne)] }),
130
+ (0, core_1.Post)('/deleteSysConfig', { middleware: [(0, permission_middleware_1.checkPermission)(SystemPerm_1.SystemFuncCode.SysConfigMangeWrite), (0, cacherefresh_middleware_1.refreshBizMemCache)('sysConfgCacheObj')] }),
131
131
  __metadata("design:type", Function),
132
132
  __metadata("design:paramtypes", []),
133
133
  __metadata("design:returntype", Promise)
@@ -16,6 +16,7 @@ const BaseApiController_1 = require("../base/BaseApiController");
16
16
  const SystemPerm_1 = require("../../models/SystemPerm");
17
17
  const common_dto_1 = require("../../libs/utils/common-dto");
18
18
  const CrudMonitor_1 = require("../../libs/crud-pro/utils/CrudMonitor");
19
+ const BizMemCacheStore_1 = require("../../service/base/bizmemcache/BizMemCacheStore");
19
20
  let SystemInfoManageApi = class SystemInfoManageApi extends BaseApiController_1.BaseApiController {
20
21
  /**
21
22
  * 预设系统内置功能点数据
@@ -58,7 +59,8 @@ let SystemInfoManageApi = class SystemInfoManageApi extends BaseApiController_1.
58
59
  timeInfo,
59
60
  envInfo,
60
61
  networkInfo,
61
- crudMonitorInfo: CrudMonitor_1.CrudMonitor
62
+ crudMonitorInfo: CrudMonitor_1.CrudMonitor,
63
+ bizMemCacheLastTime: BizMemCacheStore_1.bizMemCacheStore.getLastTimeSnapshot(),
62
64
  });
63
65
  }
64
66
  };
@@ -15,7 +15,6 @@ const keys_1 = require("../../libs/crud-pro/models/keys");
15
15
  const BaseApiController_1 = require("../base/BaseApiController");
16
16
  const permission_middleware_1 = require("../../middleware/permission.middleware");
17
17
  const cacherefresh_middleware_1 = require("../../middleware/cacherefresh.middleware");
18
- const bizmodels_1 = require("../../models/bizmodels");
19
18
  const SystemPerm_1 = require("../../models/SystemPerm");
20
19
  const SystemTables_1 = require("../../models/SystemTables");
21
20
  let WorkbenchMangeApi = class WorkbenchMangeApi extends BaseApiController_1.BaseApiController {
@@ -78,19 +77,19 @@ __decorate([
78
77
  __metadata("design:returntype", Promise)
79
78
  ], WorkbenchMangeApi.prototype, "getWorkbenchOne", null);
80
79
  __decorate([
81
- (0, core_1.Post)('/createWorkbench', { middleware: [(0, permission_middleware_1.checkPermission)(SystemPerm_1.SystemFuncCode.WorkbenchMangeWrite), (0, cacherefresh_middleware_1.refreshCache)([bizmodels_1.CacheNameEnum.GetWorkbenchCachedObj, bizmodels_1.CacheNameEnum.CurdMixByWorkbench])] }),
80
+ (0, core_1.Post)('/createWorkbench', { middleware: [(0, permission_middleware_1.checkPermission)(SystemPerm_1.SystemFuncCode.WorkbenchMangeWrite), (0, cacherefresh_middleware_1.refreshBizMemCache)('workbenchCachedObj')] }),
82
81
  __metadata("design:type", Function),
83
82
  __metadata("design:paramtypes", []),
84
83
  __metadata("design:returntype", Promise)
85
84
  ], WorkbenchMangeApi.prototype, "createWorkbench", null);
86
85
  __decorate([
87
- (0, core_1.Post)('/updateWorkbench', { middleware: [(0, permission_middleware_1.checkPermission)(SystemPerm_1.SystemFuncCode.WorkbenchMangeWrite), (0, cacherefresh_middleware_1.refreshCache)([bizmodels_1.CacheNameEnum.GetWorkbenchCachedObj, bizmodels_1.CacheNameEnum.CurdMixByWorkbench])] }),
86
+ (0, core_1.Post)('/updateWorkbench', { middleware: [(0, permission_middleware_1.checkPermission)(SystemPerm_1.SystemFuncCode.WorkbenchMangeWrite), (0, cacherefresh_middleware_1.refreshBizMemCache)('workbenchCachedObj')] }),
88
87
  __metadata("design:type", Function),
89
88
  __metadata("design:paramtypes", []),
90
89
  __metadata("design:returntype", Promise)
91
90
  ], WorkbenchMangeApi.prototype, "updateWorkbench", null);
92
91
  __decorate([
93
- (0, core_1.Post)('/deleteWorkbench', { middleware: [(0, permission_middleware_1.checkPermission)(SystemPerm_1.SystemFuncCode.WorkbenchMangeWrite), (0, cacherefresh_middleware_1.refreshCache)([bizmodels_1.CacheNameEnum.GetWorkbenchCachedObj, bizmodels_1.CacheNameEnum.CurdMixByWorkbench])] }),
92
+ (0, core_1.Post)('/deleteWorkbench', { middleware: [(0, permission_middleware_1.checkPermission)(SystemPerm_1.SystemFuncCode.WorkbenchMangeWrite), (0, cacherefresh_middleware_1.refreshBizMemCache)('workbenchCachedObj')] }),
94
93
  __metadata("design:type", Function),
95
94
  __metadata("design:paramtypes", []),
96
95
  __metadata("design:returntype", Promise)
package/dist/index.d.ts CHANGED
@@ -58,6 +58,9 @@ export * from './service/UserAccountService';
58
58
  export * from './service/UserSessionService';
59
59
  export * from './service/VisitStatService';
60
60
  export * from './service/WorkbenchService';
61
+ export * from './service/base/bizmemcache/BizMemCacheService';
62
+ export * from './service/base/bizmemcache/BizMemCacheTypes';
63
+ export * from './service/base/bizmemcache/BizMemCacheStore';
61
64
  export * from './service/anyapi/AnyApiSandboxService';
62
65
  export * from './service/anyapi/AnyApiService';
63
66
  export * from './service/base/ApiBaseService';
package/dist/index.js CHANGED
@@ -76,6 +76,9 @@ __exportStar(require("./service/UserAccountService"), exports);
76
76
  __exportStar(require("./service/UserSessionService"), exports);
77
77
  __exportStar(require("./service/VisitStatService"), exports);
78
78
  __exportStar(require("./service/WorkbenchService"), exports);
79
+ __exportStar(require("./service/base/bizmemcache/BizMemCacheService"), exports);
80
+ __exportStar(require("./service/base/bizmemcache/BizMemCacheTypes"), exports);
81
+ __exportStar(require("./service/base/bizmemcache/BizMemCacheStore"), exports);
79
82
  __exportStar(require("./service/anyapi/AnyApiSandboxService"), exports);
80
83
  __exportStar(require("./service/anyapi/AnyApiService"), exports);
81
84
  __exportStar(require("./service/base/ApiBaseService"), exports);
@@ -6,10 +6,15 @@ const CrudMonitor_1 = require("../../../libs/crud-pro/utils/CrudMonitor");
6
6
  const _ = require("lodash");
7
7
  class SqlServerConnectionClient {
8
8
  constructor(originConnection) {
9
+ this.isReleased = false;
9
10
  this.originConnection = originConnection;
11
+ CrudMonitor_1.CrudMonitor.mssqlGetConnectionCount++;
10
12
  }
11
13
  async query(sql, values) {
12
- const request = new mssql_1.Request(this.originConnection);
14
+ // 如果存在活跃的事务,请求应该绑定到事务上,否则事务不生效
15
+ const request = this.sqlServerTransaction
16
+ ? new mssql_1.Request(this.sqlServerTransaction)
17
+ : new mssql_1.Request(this.originConnection);
13
18
  if (Array.isArray(values)) {
14
19
  for (let i = 0; i < values.length; i++) {
15
20
  const index = i + 1;
@@ -32,15 +37,33 @@ class SqlServerConnectionClient {
32
37
  }
33
38
  async commit() {
34
39
  const tmpTx = this.sqlServerTransaction;
35
- await tmpTx.commit();
40
+ if (tmpTx) {
41
+ await tmpTx.commit();
42
+ }
36
43
  }
37
44
  async rollback() {
38
45
  const tmpTx = this.sqlServerTransaction;
39
- await tmpTx.rollback();
46
+ if (tmpTx) {
47
+ await tmpTx.rollback();
48
+ }
40
49
  }
41
50
  async release() {
51
+ if (this.isReleased) {
52
+ return;
53
+ }
54
+ this.isReleased = true;
42
55
  try {
43
- CrudMonitor_1.CrudMonitor.postgresReleaseConnectionCount++;
56
+ // 如果有未结束的事务,先回滚
57
+ if (this.sqlServerTransaction) {
58
+ try {
59
+ await this.sqlServerTransaction.rollback();
60
+ }
61
+ catch (e) {
62
+ // 事务可能已经回滚或提交,忽略错误
63
+ }
64
+ this.sqlServerTransaction = null;
65
+ }
66
+ CrudMonitor_1.CrudMonitor.mssqlReleaseConnectionCount++;
44
67
  }
45
68
  catch (e) {
46
69
  console.log('[crud-pro] SqlServerConnectionClient release ', e);
@@ -1,18 +1,15 @@
1
1
  import { CrudProServiceBase } from './CrudProServiceBase';
2
2
  import { IRequestCfgModel } from '../interfaces';
3
3
  import { ICurdProServiceHub } from '../models/ServiceHub';
4
+ export declare function parseCrudMethodInfo(row: any): IRequestCfgModel;
5
+ /**
6
+ * 注入 CRUD 方法配置缓存(由 BizMemCache 加载后调用)
7
+ */
8
+ export declare function setMethodCache(methodInfoList: IRequestCfgModel[] | null): void;
4
9
  declare class CrudProCachedCfgService extends CrudProServiceBase {
5
10
  constructor(serviceHub: ICurdProServiceHub);
6
11
  getCachedCfgByMethod(method: string, isEnableCache: boolean): Promise<IRequestCfgModel | null>;
7
12
  private getCachedCfgByMethodInner;
8
13
  private loadMethodInfo;
9
- private loadMethodInfoList;
10
14
  }
11
15
  export { CrudProCachedCfgService };
12
- /**
13
- * 清空 CRUD 方法配置缓存(独立函数,无需实例化 Service 即可调用)
14
- *
15
- * 清空后,下次请求会自动从数据库重新加载(懒加载刷新)。
16
- * 适用于 manage 增删改触发刷新、定时刷新等场景。
17
- */
18
- export declare function clearMethodCache(): void;
@@ -1,19 +1,29 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.clearMethodCache = exports.CrudProCachedCfgService = void 0;
3
+ exports.CrudProCachedCfgService = exports.setMethodCache = exports.parseCrudMethodInfo = void 0;
4
4
  const humps_1 = require("humps");
5
5
  const CrudProServiceBase_1 = require("./CrudProServiceBase");
6
6
  const MixinUtils_1 = require("../utils/MixinUtils");
7
- // import { pickAndConvertRowsByMix } from '../utils/sqlConvert/convertMix';
8
- const MemoryRefreshCache_1 = require("../utils/MemoryRefreshCache");
9
- const DEFAULT_KEEP_TIME = 1000 * 60 * 60 * 24 * 365; // 内存缓存时间默认 1年
10
- const methodCache = new MemoryRefreshCache_1.default();
11
- function parseMethodInfo(row) {
12
- const methodInfo = (0, humps_1.camelizeKeys)(row); //转换成驼峰
7
+ /** 由上层 BizMemCache 注入的方法配置缓存,key method */
8
+ let externalMethodCacheMap = null;
9
+ function parseCrudMethodInfo(row) {
10
+ const methodInfo = (0, humps_1.camelizeKeys)(row);
13
11
  const configObject = MixinUtils_1.MixinUtils.parseJsonObject(methodInfo.moreConfig) || {};
14
12
  const sqlCfgList = MixinUtils_1.MixinUtils.parseJsonObject(methodInfo.sqlCfgList) || [];
15
13
  return { ...configObject, ...methodInfo, sqlCfgList };
16
14
  }
15
+ exports.parseCrudMethodInfo = parseCrudMethodInfo;
16
+ /**
17
+ * 注入 CRUD 方法配置缓存(由 BizMemCache 加载后调用)
18
+ */
19
+ function setMethodCache(methodInfoList) {
20
+ if (!methodInfoList) {
21
+ externalMethodCacheMap = null;
22
+ return;
23
+ }
24
+ externalMethodCacheMap = MixinUtils_1.MixinUtils.toMap(methodInfoList, item => item.method);
25
+ }
26
+ exports.setMethodCache = setMethodCache;
17
27
  class CrudProCachedCfgService extends CrudProServiceBase_1.CrudProServiceBase {
18
28
  constructor(serviceHub) {
19
29
  super(serviceHub);
@@ -26,24 +36,21 @@ class CrudProCachedCfgService extends CrudProServiceBase_1.CrudProServiceBase {
26
36
  return { ...methodInfo };
27
37
  }
28
38
  async getCachedCfgByMethodInner(method, isEnableCache) {
29
- // 不使用缓存
30
39
  if (!isEnableCache) {
31
40
  return await this.loadMethodInfo(method);
32
41
  }
33
- methodCache.setProps({
34
- keepTime: DEFAULT_KEEP_TIME,
35
- requestFn: () => this.loadMethodInfoList(),
36
- getKeyFn: item => item.method,
37
- });
38
- const methodInfo = await methodCache.getItem(method);
39
- if (methodInfo) {
40
- return methodInfo;
42
+ if (externalMethodCacheMap) {
43
+ const methodInfo = externalMethodCacheMap[method];
44
+ if (methodInfo) {
45
+ return methodInfo;
46
+ }
41
47
  }
48
+ // 缓存未就绪或未命中时,降级单条查询
42
49
  return await this.loadMethodInfo(method);
43
50
  }
44
51
  async loadMethodInfo(method) {
45
52
  const { methodsTableName, sysDatabaseName, sysDatabaseDbType } = this.getContextCfg();
46
- const sql = `select * from ${methodsTableName} where method = ? `; // 全部加载到内存
53
+ const sql = `select * from ${methodsTableName} where method = ? `;
47
54
  const baseInfo = {
48
55
  sqlTable: methodsTableName,
49
56
  sqlDatabase: sysDatabaseName,
@@ -52,33 +59,9 @@ class CrudProCachedCfgService extends CrudProServiceBase_1.CrudProServiceBase {
52
59
  const queryRes = await this.executeUnsafeQuery(baseInfo, sql, [method]);
53
60
  const rows2 = queryRes.rows || [];
54
61
  if (rows2.length > 0) {
55
- return parseMethodInfo(rows2[0]);
62
+ return parseCrudMethodInfo(rows2[0]);
56
63
  }
57
64
  return null;
58
65
  }
59
- async loadMethodInfoList() {
60
- const { methodsTableName, sysDatabaseName, sysDatabaseDbType } = this.getContextCfg();
61
- const sql = `select * from ${methodsTableName}`; // 全部加载到内存
62
- const baseInfo = {
63
- sqlTable: methodsTableName,
64
- sqlDatabase: sysDatabaseName,
65
- sqlDbType: sysDatabaseDbType,
66
- };
67
- const queryRes = await this.executeUnsafeQuery(baseInfo, sql);
68
- const rows2 = queryRes.rows || [];
69
- return rows2.map(row => {
70
- return parseMethodInfo(row);
71
- });
72
- }
73
66
  }
74
67
  exports.CrudProCachedCfgService = CrudProCachedCfgService;
75
- /**
76
- * 清空 CRUD 方法配置缓存(独立函数,无需实例化 Service 即可调用)
77
- *
78
- * 清空后,下次请求会自动从数据库重新加载(懒加载刷新)。
79
- * 适用于 manage 增删改触发刷新、定时刷新等场景。
80
- */
81
- function clearMethodCache() {
82
- methodCache.clear();
83
- }
84
- exports.clearMethodCache = clearMethodCache;
@@ -13,17 +13,8 @@ declare const CrudMonitor: {
13
13
  postgresReleaseConnectionCount: number;
14
14
  mssqlGetConnectionCount: number;
15
15
  mssqlReleaseConnectionCount: number;
16
- /** 每个缓存项的最近一次刷新时间(时间戳 ms),null 表示尚未刷新 */
17
16
  cacheLastRefreshTime: CacheLastRefreshTimeMap;
18
- /**
19
- * 记录缓存刷新时间
20
- * @param key 缓存类别或缓存名
21
- */
22
17
  markCacheRefreshed(key: CacheRefreshKey): void;
23
- /**
24
- * 获取缓存最近刷新时间
25
- * @param key 缓存类别或缓存名
26
- */
27
18
  getCacheLastRefreshTime(key: CacheRefreshKey): number | null;
28
19
  };
29
20
  export { CrudMonitor, };
@@ -10,40 +10,19 @@ const CrudMonitor = {
10
10
  postgresReleaseConnectionCount: 0,
11
11
  mssqlGetConnectionCount: 0,
12
12
  mssqlReleaseConnectionCount: 0,
13
- /** 每个缓存项的最近一次刷新时间(时间戳 ms),null 表示尚未刷新 */
14
13
  cacheLastRefreshTime: {
15
- // CacheRefreshCategory
16
14
  [CacheRefreshCategory_1.CacheRefreshCategory.TableMeta]: null,
17
15
  [CacheRefreshCategory_1.CacheRefreshCategory.CacheService]: null,
18
16
  [CacheRefreshCategory_1.CacheRefreshCategory.LinkToCustom]: null,
19
- [CacheRefreshCategory_1.CacheRefreshCategory.ProxyApiRoute]: null,
20
- [CacheRefreshCategory_1.CacheRefreshCategory.CrudMethodConfig]: null,
21
- // CacheNameEnum
22
17
  [bizmodels_1.CacheNameEnum.CurdMixByAccount]: null,
23
- [bizmodels_1.CacheNameEnum.CurdMixByDict]: null,
24
18
  [bizmodels_1.CacheNameEnum.CurdMixByLinkToCustom]: null,
25
- [bizmodels_1.CacheNameEnum.CurdMixByWorkbench]: null,
26
- [bizmodels_1.CacheNameEnum.GetSysConfigOne]: null,
27
- [bizmodels_1.CacheNameEnum.GetDataDictItemsByDictCode]: null,
28
- [bizmodels_1.CacheNameEnum.GetWorkbenchCachedObj]: null,
29
- [bizmodels_1.CacheNameEnum.GetSysAppOne]: null,
30
- [bizmodels_1.CacheNameEnum.GetSysAppPageOne]: null,
31
- [bizmodels_1.CacheNameEnum.GetSysMenusList]: null,
32
19
  [bizmodels_1.CacheNameEnum.GetFlowConfigOne]: null,
33
20
  [bizmodels_1.CacheNameEnum.UserSessionBySessionId]: null,
34
21
  [bizmodels_1.CacheNameEnum.UserSessionByAsyncTaskId]: null,
35
22
  },
36
- /**
37
- * 记录缓存刷新时间
38
- * @param key 缓存类别或缓存名
39
- */
40
23
  markCacheRefreshed(key) {
41
24
  this.cacheLastRefreshTime[key] = Date.now();
42
25
  },
43
- /**
44
- * 获取缓存最近刷新时间
45
- * @param key 缓存类别或缓存名
46
- */
47
26
  getCacheLastRefreshTime(key) {
48
27
  var _a;
49
28
  return (_a = this.cacheLastRefreshTime[key]) !== null && _a !== void 0 ? _a : null;
@@ -4,10 +4,36 @@ exports.getConnectionPool = void 0;
4
4
  const mssql_1 = require("mssql");
5
5
  const keys_1 = require("../../models/keys");
6
6
  const POOL_CACHE_MAP = {};
7
+ const POOL_CONNECTING_MAP = {};
8
+ async function doConnectPool(poolName, poolObj) {
9
+ // 避免重复连接同一个池
10
+ if (POOL_CONNECTING_MAP[poolName]) {
11
+ return POOL_CONNECTING_MAP[poolName];
12
+ }
13
+ const connectPromise = poolObj.connect().then((connectedPool) => {
14
+ console.log(`[crud-pro] SQL Server connection pool "${poolName}" connected successfully.`);
15
+ return connectedPool;
16
+ }).catch((err) => {
17
+ console.error(`[crud-pro] SQL Server connection pool "${poolName}" connect failed:`, err);
18
+ throw err;
19
+ }).finally(() => {
20
+ delete POOL_CONNECTING_MAP[poolName];
21
+ });
22
+ POOL_CONNECTING_MAP[poolName] = connectPromise;
23
+ return connectPromise;
24
+ }
7
25
  function getConnectionPool(poolName, poolOptions) {
8
26
  let pool = POOL_CACHE_MAP[poolName];
9
27
  if (!pool) {
10
28
  const poolObj = new mssql_1.ConnectionPool(poolOptions);
29
+ // 监听连接池错误,避免未捕获的异常导致进程崩溃
30
+ poolObj.on('error', (err) => {
31
+ console.error(`[crud-pro] SQL Server connection pool "${poolName}" error:`, err);
32
+ });
33
+ // 预连接池,避免首次请求时才建立连接导致延迟
34
+ doConnectPool(poolName, poolObj).catch(() => {
35
+ // 错误已在 doConnectPool 中打印,此处无需重复处理
36
+ });
11
37
  pool = {
12
38
  dbType: keys_1.SqlDbType.sqlserver,
13
39
  poolName: poolName,
@@ -1,47 +1,4 @@
1
1
  import { NextFunction, Context } from '@midwayjs/koa';
2
- import { CacheNameEnum } from '../models/bizmodels';
3
- import { CacheRefreshCategory } from '../models/CacheRefreshCategory';
4
- /**
5
- * 缓存刷新中间件
6
- *
7
- * 在路由处理成功完成后,自动触发指定缓存项的刷新。
8
- * 采用后置刷新模式:先 await next() 让业务逻辑执行完毕,再刷新缓存。
9
- *
10
- * 应用场景:
11
- * 1. manage 增删改操作后自动刷新关联的业务缓存
12
- * 2. 精准刷新:只刷新与本次操作相关的缓存项,避免全量刷新
13
- *
14
- * 使用示例:
15
- * ```typescript
16
- * // 刷新全部业务缓存(向后兼容,等同原来的 refreshCache())
17
- * @Post('/createRole', { middleware: [checkPermission('write'), refreshCache()] })
18
- * async createRole() { ... }
19
- *
20
- * // 精准刷新:只刷新指定缓存项
21
- * @Post('/createMenu', { middleware: [checkPermission('write'), refreshCache(CacheNameEnum.GetSysMenusList)] })
22
- * async createMenu() { ... }
23
- *
24
- * // 同时刷新多个缓存项
25
- * @Post('/createApp', { middleware: [checkPermission('write'), refreshCache([CacheNameEnum.GetSysAppOne, CacheNameEnum.GetSysAppPageOne])] })
26
- * async createApp() { ... }
27
- * ```
28
- *
29
- * @param cacheName 缓存名称,不传则刷新全部,支持单个或数组
30
- */
31
- declare function refreshCache(cacheName?: CacheNameEnum | CacheNameEnum[]): (ctx: Context, next: NextFunction) => Promise<void>;
32
- /**
33
- * 缓存类别刷新中间件
34
- *
35
- * 通过 CacheRefreshHub 刷新指定类别的缓存(TableMeta / LinkToCustom / ProxyApiRoute 等)。
36
- * 适用于非 CacheNameEnum 管理的缓存类别。
37
- *
38
- * 使用示例:
39
- * ```typescript
40
- * @Post('/createProxyApi', { middleware: [checkPermission('write'), refreshCategory(CacheRefreshCategory.ProxyApiRoute)] })
41
- * async createProxyApi() { ... }
42
- * ```
43
- *
44
- * @param category 缓存类别,支持单个或数组
45
- */
46
- declare function refreshCategory(category: CacheRefreshCategory | CacheRefreshCategory[]): (ctx: Context, next: NextFunction) => Promise<void>;
47
- export { refreshCache, refreshCategory };
2
+ import { BizMemCacheKey } from '../service/base/bizmemcache/BizMemCacheTypes';
3
+ declare function refreshBizMemCache(cacheKey: BizMemCacheKey | BizMemCacheKey[]): (ctx: Context, next: NextFunction) => Promise<void>;
4
+ export { refreshBizMemCache };
@@ -1,74 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.refreshCategory = exports.refreshCache = void 0;
4
- const CacheServiceFactory_1 = require("../service/base/cache/CacheServiceFactory");
5
- const CacheRefreshHub_1 = require("../service/base/cache-refresh/CacheRefreshHub");
6
- /**
7
- * 缓存刷新中间件
8
- *
9
- * 在路由处理成功完成后,自动触发指定缓存项的刷新。
10
- * 采用后置刷新模式:先 await next() 让业务逻辑执行完毕,再刷新缓存。
11
- *
12
- * 应用场景:
13
- * 1. manage 增删改操作后自动刷新关联的业务缓存
14
- * 2. 精准刷新:只刷新与本次操作相关的缓存项,避免全量刷新
15
- *
16
- * 使用示例:
17
- * ```typescript
18
- * // 刷新全部业务缓存(向后兼容,等同原来的 refreshCache())
19
- * @Post('/createRole', { middleware: [checkPermission('write'), refreshCache()] })
20
- * async createRole() { ... }
21
- *
22
- * // 精准刷新:只刷新指定缓存项
23
- * @Post('/createMenu', { middleware: [checkPermission('write'), refreshCache(CacheNameEnum.GetSysMenusList)] })
24
- * async createMenu() { ... }
25
- *
26
- * // 同时刷新多个缓存项
27
- * @Post('/createApp', { middleware: [checkPermission('write'), refreshCache([CacheNameEnum.GetSysAppOne, CacheNameEnum.GetSysAppPageOne])] })
28
- * async createApp() { ... }
29
- * ```
30
- *
31
- * @param cacheName 缓存名称,不传则刷新全部,支持单个或数组
32
- */
33
- function refreshCache(cacheName) {
34
- const cacheNames = cacheName ? (Array.isArray(cacheName) ? cacheName : [cacheName]) : null;
3
+ exports.refreshBizMemCache = void 0;
4
+ const redis_1 = require("@midwayjs/redis");
5
+ const BizMemCacheStore_1 = require("../service/base/bizmemcache/BizMemCacheStore");
6
+ function refreshBizMemCache(cacheKey) {
7
+ const cacheKeys = Array.isArray(cacheKey) ? cacheKey : [cacheKey];
35
8
  return async (ctx, next) => {
36
9
  await next();
37
- const cacheServiceFactory = await ctx.requestContext.getAsync(CacheServiceFactory_1.CacheServiceFactory);
38
- if (cacheNames) {
39
- // 精准刷新:只刷新指定的缓存项
40
- for (const name of cacheNames) {
41
- await cacheServiceFactory.refreshByCacheName(name, ctx);
42
- }
43
- }
44
- else {
45
- // 全量刷新:刷新所有已注册的业务缓存
46
- await cacheServiceFactory.refreshAllCache(ctx);
47
- }
48
- };
49
- }
50
- exports.refreshCache = refreshCache;
51
- /**
52
- * 缓存类别刷新中间件
53
- *
54
- * 通过 CacheRefreshHub 刷新指定类别的缓存(TableMeta / LinkToCustom / ProxyApiRoute 等)。
55
- * 适用于非 CacheNameEnum 管理的缓存类别。
56
- *
57
- * 使用示例:
58
- * ```typescript
59
- * @Post('/createProxyApi', { middleware: [checkPermission('write'), refreshCategory(CacheRefreshCategory.ProxyApiRoute)] })
60
- * async createProxyApi() { ... }
61
- * ```
62
- *
63
- * @param category 缓存类别,支持单个或数组
64
- */
65
- function refreshCategory(category) {
66
- const categories = Array.isArray(category) ? category : [category];
67
- return async (ctx, next) => {
68
- await next();
69
- for (const cat of categories) {
70
- await CacheRefreshHub_1.CacheRefreshHub.refresh(cat, ctx);
10
+ const redisService = await ctx.requestContext.getAsync(redis_1.RedisService);
11
+ for (const key of cacheKeys) {
12
+ await BizMemCacheStore_1.bizMemCacheStore.markDirty(key, redisService);
71
13
  }
72
14
  };
73
15
  }
74
- exports.refreshCategory = refreshCategory;
16
+ exports.refreshBizMemCache = refreshBizMemCache;
@@ -1,23 +1,6 @@
1
- /**
2
- * 缓存刷新类型枚举
3
- *
4
- * 用于统一标识项目中的各类缓存,支持:
5
- * - 定时刷新(10分钟自动刷新)
6
- * - API 主动刷新(helpers/refreshCache?category=xxx)
7
- * - manage 增删改触发刷新
8
- * - Redis Pub/Sub 集群广播刷新
9
- */
10
1
  export declare enum CacheRefreshCategory {
11
- /** 表元数据缓存(CrudProTableMetaService 的 metaCache + tableInfoCache) */
12
2
  TableMeta = "TableMeta",
13
- /** CacheServiceFactory 管理的业务缓存(CacheNameEnum 定义的所有缓存) */
14
3
  CacheService = "CacheService",
15
- /** linkToCustom 关联枚举缓存(CurdMixByLinkToCustomService 管理的关联数据缓存) */
16
- LinkToCustom = "LinkToCustom",
17
- /** 代理API路由缓存(ProxyApiLoadService 的 RouteTrie + UpstreamMap) */
18
- ProxyApiRoute = "ProxyApiRoute",
19
- /** CRUD 方法配置缓存(CrudProCachedCfgService 的 methodCache) */
20
- CrudMethodConfig = "CrudMethodConfig"
4
+ LinkToCustom = "LinkToCustom"
21
5
  }
22
- /** 所有缓存刷新类型列表,用于全量刷新 */
23
6
  export declare const ALL_CACHE_REFRESH_CATEGORIES: CacheRefreshCategory[];
@@ -1,27 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ALL_CACHE_REFRESH_CATEGORIES = exports.CacheRefreshCategory = void 0;
4
- /**
5
- * 缓存刷新类型枚举
6
- *
7
- * 用于统一标识项目中的各类缓存,支持:
8
- * - 定时刷新(10分钟自动刷新)
9
- * - API 主动刷新(helpers/refreshCache?category=xxx)
10
- * - manage 增删改触发刷新
11
- * - Redis Pub/Sub 集群广播刷新
12
- */
13
4
  var CacheRefreshCategory;
14
5
  (function (CacheRefreshCategory) {
15
- /** 表元数据缓存(CrudProTableMetaService 的 metaCache + tableInfoCache) */
16
6
  CacheRefreshCategory["TableMeta"] = "TableMeta";
17
- /** CacheServiceFactory 管理的业务缓存(CacheNameEnum 定义的所有缓存) */
18
7
  CacheRefreshCategory["CacheService"] = "CacheService";
19
- /** linkToCustom 关联枚举缓存(CurdMixByLinkToCustomService 管理的关联数据缓存) */
20
8
  CacheRefreshCategory["LinkToCustom"] = "LinkToCustom";
21
- /** 代理API路由缓存(ProxyApiLoadService 的 RouteTrie + UpstreamMap) */
22
- CacheRefreshCategory["ProxyApiRoute"] = "ProxyApiRoute";
23
- /** CRUD 方法配置缓存(CrudProCachedCfgService 的 methodCache) */
24
- CacheRefreshCategory["CrudMethodConfig"] = "CrudMethodConfig";
25
9
  })(CacheRefreshCategory = exports.CacheRefreshCategory || (exports.CacheRefreshCategory = {}));
26
- /** 所有缓存刷新类型列表,用于全量刷新 */
27
10
  exports.ALL_CACHE_REFRESH_CATEGORIES = Object.values(CacheRefreshCategory);
@@ -79,6 +79,8 @@ export interface IProxyApiEntity extends IApiBaseEntity {
79
79
  pass_real_ip: number;
80
80
  change_origin: string;
81
81
  change_host: string;
82
+ custom_header: string;
83
+ custom_body: string;
82
84
  balanceStrategy: string;
83
85
  targetList: IUpstreamItem[];
84
86
  targetIndex: number;
@@ -123,15 +123,7 @@ export interface ICacheService {
123
123
  }
124
124
  export declare enum CacheNameEnum {
125
125
  CurdMixByAccount = "CurdMixByAccount",
126
- CurdMixByDict = "CurdMixByDict",
127
126
  CurdMixByLinkToCustom = "CurdMixByLinkToCustom",
128
- CurdMixByWorkbench = "CurdMixByWorkbench",
129
- GetSysConfigOne = "GetSysConfigOne",
130
- GetDataDictItemsByDictCode = "GetDataDictItemsByDictCode",
131
- GetWorkbenchCachedObj = "GetWorkbenchCachedObj",
132
- GetSysAppOne = "GetSysAppOne",
133
- GetSysAppPageOne = "GetSysAppPageOne",
134
- GetSysMenusList = "GetSysMenusList",
135
127
  GetFlowConfigOne = "GetFlowConfigOne",
136
128
  UserSessionBySessionId = "UserSessionBySessionId",
137
129
  UserSessionByAsyncTaskId = "UserSessionByAsyncTaskId"
@@ -47,15 +47,7 @@ var StdCrudExportInputParamsAppType;
47
47
  var CacheNameEnum;
48
48
  (function (CacheNameEnum) {
49
49
  CacheNameEnum["CurdMixByAccount"] = "CurdMixByAccount";
50
- CacheNameEnum["CurdMixByDict"] = "CurdMixByDict";
51
50
  CacheNameEnum["CurdMixByLinkToCustom"] = "CurdMixByLinkToCustom";
52
- CacheNameEnum["CurdMixByWorkbench"] = "CurdMixByWorkbench";
53
- CacheNameEnum["GetSysConfigOne"] = "GetSysConfigOne";
54
- CacheNameEnum["GetDataDictItemsByDictCode"] = "GetDataDictItemsByDictCode";
55
- CacheNameEnum["GetWorkbenchCachedObj"] = "GetWorkbenchCachedObj";
56
- CacheNameEnum["GetSysAppOne"] = "GetSysAppOne";
57
- CacheNameEnum["GetSysAppPageOne"] = "GetSysAppPageOne";
58
- CacheNameEnum["GetSysMenusList"] = "GetSysMenusList";
59
51
  CacheNameEnum["GetFlowConfigOne"] = "GetFlowConfigOne";
60
52
  CacheNameEnum["UserSessionBySessionId"] = "UserSessionBySessionId";
61
53
  CacheNameEnum["UserSessionByAsyncTaskId"] = "UserSessionByAsyncTaskId";