yingzios-platform-backend-shared 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -0
- package/dist/apollo/apollo.config.d.ts +26 -0
- package/dist/apollo/apollo.config.d.ts.map +1 -0
- package/dist/apollo/apollo.config.js +2 -0
- package/dist/apollo/apollo.module.d.ts +13 -0
- package/dist/apollo/apollo.module.d.ts.map +1 -0
- package/dist/apollo/apollo.module.js +61 -0
- package/dist/apollo/apollo.service.d.ts +17 -0
- package/dist/apollo/apollo.service.d.ts.map +1 -0
- package/dist/apollo/apollo.service.js +35 -0
- package/dist/apollo/index.d.ts +5 -0
- package/dist/apollo/index.d.ts.map +1 -0
- package/dist/apollo/index.js +17 -0
- package/dist/cache/cache.config.d.ts +28 -0
- package/dist/cache/cache.config.d.ts.map +1 -0
- package/dist/cache/cache.config.js +2 -0
- package/dist/cache/cache.module.d.ts +39 -0
- package/dist/cache/cache.module.d.ts.map +1 -0
- package/dist/cache/cache.module.js +75 -0
- package/dist/cache/cache.service.d.ts +49 -0
- package/dist/cache/cache.service.d.ts.map +1 -0
- package/dist/cache/cache.service.js +208 -0
- package/dist/cache/index.d.ts +4 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +19 -0
- package/dist/env/env-loader.d.ts +50 -0
- package/dist/env/env-loader.d.ts.map +1 -0
- package/dist/env/env-loader.js +159 -0
- package/dist/env/env.module.d.ts +11 -0
- package/dist/env/env.module.d.ts.map +1 -0
- package/dist/env/env.module.js +47 -0
- package/dist/env/env.service.d.ts +31 -0
- package/dist/env/env.service.d.ts.map +1 -0
- package/dist/env/env.service.js +195 -0
- package/dist/env/index.d.ts +4 -0
- package/dist/env/index.d.ts.map +1 -0
- package/dist/env/index.js +19 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/internal-auth/decorators/caller.decorator.d.ts +29 -0
- package/dist/internal-auth/decorators/caller.decorator.d.ts.map +1 -0
- package/dist/internal-auth/decorators/caller.decorator.js +37 -0
- package/dist/internal-auth/decorators/index.d.ts +3 -0
- package/dist/internal-auth/decorators/index.d.ts.map +1 -0
- package/dist/internal-auth/decorators/index.js +18 -0
- package/dist/internal-auth/decorators/use-either-guard.decorator.d.ts +31 -0
- package/dist/internal-auth/decorators/use-either-guard.decorator.d.ts.map +1 -0
- package/dist/internal-auth/decorators/use-either-guard.decorator.js +79 -0
- package/dist/internal-auth/guards/index.d.ts +2 -0
- package/dist/internal-auth/guards/index.d.ts.map +1 -0
- package/dist/internal-auth/guards/index.js +17 -0
- package/dist/internal-auth/guards/service-key.guard.d.ts +36 -0
- package/dist/internal-auth/guards/service-key.guard.d.ts.map +1 -0
- package/dist/internal-auth/guards/service-key.guard.js +86 -0
- package/dist/internal-auth/index.d.ts +43 -0
- package/dist/internal-auth/index.d.ts.map +1 -0
- package/dist/internal-auth/index.js +62 -0
- package/dist/internal-auth/internal-auth.module.d.ts +62 -0
- package/dist/internal-auth/internal-auth.module.d.ts.map +1 -0
- package/dist/internal-auth/internal-auth.module.js +118 -0
- package/dist/internal-auth/internal-http.service.d.ts +72 -0
- package/dist/internal-auth/internal-http.service.d.ts.map +1 -0
- package/dist/internal-auth/internal-http.service.js +119 -0
- package/dist/jwt/auto-fill-user.pipe.d.ts +43 -0
- package/dist/jwt/auto-fill-user.pipe.d.ts.map +1 -0
- package/dist/jwt/auto-fill-user.pipe.js +166 -0
- package/dist/jwt/decorators/current-user.decorator.d.ts +37 -0
- package/dist/jwt/decorators/current-user.decorator.d.ts.map +1 -0
- package/dist/jwt/decorators/current-user.decorator.js +29 -0
- package/dist/jwt/decorators/public.decorator.d.ts +8 -0
- package/dist/jwt/decorators/public.decorator.d.ts.map +1 -0
- package/dist/jwt/decorators/public.decorator.js +12 -0
- package/dist/jwt/guards/jwt-auth.guard.d.ts +20 -0
- package/dist/jwt/guards/jwt-auth.guard.d.ts.map +1 -0
- package/dist/jwt/guards/jwt-auth.guard.js +88 -0
- package/dist/jwt/index.d.ts +8 -0
- package/dist/jwt/index.d.ts.map +1 -0
- package/dist/jwt/index.js +26 -0
- package/dist/jwt/jwt-config.service.d.ts +10 -0
- package/dist/jwt/jwt-config.service.d.ts.map +1 -0
- package/dist/jwt/jwt-config.service.js +40 -0
- package/dist/jwt/jwt.config.d.ts +15 -0
- package/dist/jwt/jwt.config.d.ts.map +1 -0
- package/dist/jwt/jwt.config.js +2 -0
- package/dist/jwt/jwt.module.d.ts +19 -0
- package/dist/jwt/jwt.module.d.ts.map +1 -0
- package/dist/jwt/jwt.module.js +100 -0
- package/dist/jwt/jwt.service.d.ts +31 -0
- package/dist/jwt/jwt.service.d.ts.map +1 -0
- package/dist/jwt/jwt.service.js +71 -0
- package/dist/jwt/strategies/jwt.strategy.d.ts +25 -0
- package/dist/jwt/strategies/jwt.strategy.d.ts.map +1 -0
- package/dist/jwt/strategies/jwt.strategy.js +150 -0
- package/dist/jwt/user-aware-axios.service.d.ts +17 -0
- package/dist/jwt/user-aware-axios.service.d.ts.map +1 -0
- package/dist/jwt/user-aware-axios.service.js +105 -0
- package/dist/jwt/utils/jwt.utils.d.ts +24 -0
- package/dist/jwt/utils/jwt.utils.d.ts.map +1 -0
- package/dist/jwt/utils/jwt.utils.js +40 -0
- package/dist/logger/index.d.ts +4 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +19 -0
- package/dist/logger/logger.config.d.ts +41 -0
- package/dist/logger/logger.config.d.ts.map +1 -0
- package/dist/logger/logger.config.js +13 -0
- package/dist/logger/logger.module.d.ts +17 -0
- package/dist/logger/logger.module.d.ts.map +1 -0
- package/dist/logger/logger.module.js +49 -0
- package/dist/logger/logger.service.d.ts +62 -0
- package/dist/logger/logger.service.d.ts.map +1 -0
- package/dist/logger/logger.service.js +124 -0
- package/dist/logger/winston.config.d.ts +43 -0
- package/dist/logger/winston.config.d.ts.map +1 -0
- package/dist/logger/winston.config.js +183 -0
- package/dist/nacos/index.d.ts +4 -0
- package/dist/nacos/index.d.ts.map +1 -0
- package/dist/nacos/index.js +19 -0
- package/dist/nacos/nacos.config.d.ts +10 -0
- package/dist/nacos/nacos.config.d.ts.map +1 -0
- package/dist/nacos/nacos.config.js +2 -0
- package/dist/nacos/nacos.module.d.ts +9 -0
- package/dist/nacos/nacos.module.d.ts.map +1 -0
- package/dist/nacos/nacos.module.js +42 -0
- package/dist/nacos/nacos.service.d.ts +43 -0
- package/dist/nacos/nacos.service.d.ts.map +1 -0
- package/dist/nacos/nacos.service.js +212 -0
- package/dist/nacos/utils.d.ts +10 -0
- package/dist/nacos/utils.d.ts.map +1 -0
- package/dist/nacos/utils.js +65 -0
- package/dist/restful/current-request.util.d.ts +16 -0
- package/dist/restful/current-request.util.d.ts.map +1 -0
- package/dist/restful/current-request.util.js +34 -0
- package/dist/restful/http-exception.filter.d.ts +24 -0
- package/dist/restful/http-exception.filter.d.ts.map +1 -0
- package/dist/restful/http-exception.filter.js +126 -0
- package/dist/restful/index.d.ts +8 -0
- package/dist/restful/index.d.ts.map +1 -0
- package/dist/restful/index.js +23 -0
- package/dist/restful/request-context.middleware.d.ts +6 -0
- package/dist/restful/request-context.middleware.d.ts.map +1 -0
- package/dist/restful/request-context.middleware.js +25 -0
- package/dist/restful/response-codes.d.ts +104 -0
- package/dist/restful/response-codes.d.ts.map +1 -0
- package/dist/restful/response-codes.js +163 -0
- package/dist/restful/response.dto.d.ts +52 -0
- package/dist/restful/response.dto.d.ts.map +1 -0
- package/dist/restful/response.dto.js +146 -0
- package/dist/restful/response.interceptor.d.ts +17 -0
- package/dist/restful/response.interceptor.d.ts.map +1 -0
- package/dist/restful/response.interceptor.js +86 -0
- package/dist/restful/restful.module.d.ts +5 -0
- package/dist/restful/restful.module.d.ts.map +1 -0
- package/dist/restful/restful.module.js +26 -0
- package/dist/sequelize/index.d.ts +4 -0
- package/dist/sequelize/index.d.ts.map +1 -0
- package/dist/sequelize/index.js +19 -0
- package/dist/sequelize/sequelize.config.d.ts +24 -0
- package/dist/sequelize/sequelize.config.d.ts.map +1 -0
- package/dist/sequelize/sequelize.config.js +5 -0
- package/dist/sequelize/sequelize.module.d.ts +28 -0
- package/dist/sequelize/sequelize.module.d.ts.map +1 -0
- package/dist/sequelize/sequelize.module.js +50 -0
- package/dist/sequelize/sequelize.provider.d.ts +7 -0
- package/dist/sequelize/sequelize.provider.d.ts.map +1 -0
- package/dist/sequelize/sequelize.provider.js +154 -0
- package/dist/snowflake/index.d.ts +4 -0
- package/dist/snowflake/index.d.ts.map +1 -0
- package/dist/snowflake/index.js +19 -0
- package/dist/snowflake/snowflake.config.d.ts +30 -0
- package/dist/snowflake/snowflake.config.d.ts.map +1 -0
- package/dist/snowflake/snowflake.config.js +12 -0
- package/dist/snowflake/snowflake.module.d.ts +17 -0
- package/dist/snowflake/snowflake.module.d.ts.map +1 -0
- package/dist/snowflake/snowflake.module.js +58 -0
- package/dist/snowflake/snowflake.service.d.ts +21 -0
- package/dist/snowflake/snowflake.service.d.ts.map +1 -0
- package/dist/snowflake/snowflake.service.js +44 -0
- package/dist/swagger/index.d.ts +6 -0
- package/dist/swagger/index.d.ts.map +1 -0
- package/dist/swagger/index.js +19 -0
- package/dist/swagger/swagger.config.d.ts +45 -0
- package/dist/swagger/swagger.config.d.ts.map +1 -0
- package/dist/swagger/swagger.config.js +19 -0
- package/dist/swagger/swagger.decorators.d.ts +21 -0
- package/dist/swagger/swagger.decorators.d.ts.map +1 -0
- package/dist/swagger/swagger.decorators.js +112 -0
- package/dist/swagger/swagger.module.d.ts +15 -0
- package/dist/swagger/swagger.module.d.ts.map +1 -0
- package/dist/swagger/swagger.module.js +49 -0
- package/dist/swagger/swagger.service.d.ts +44 -0
- package/dist/swagger/swagger.service.d.ts.map +1 -0
- package/dist/swagger/swagger.service.js +202 -0
- package/package.json +75 -0
package/README.md
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# yz-web-server-shared
|
|
2
|
+
|
|
3
|
+
NestJS 共享模块库,为 YingziOS 平台提供统一的服务端基础设施。
|
|
4
|
+
|
|
5
|
+
## 功能模块
|
|
6
|
+
|
|
7
|
+
- **Sequelize** - 数据库 ORM 模块
|
|
8
|
+
- **JWT** - JSON Web Token 认证
|
|
9
|
+
- **Swagger** - API 文档生成
|
|
10
|
+
- **Logger** - 日志服务(基于 Winston)
|
|
11
|
+
- **Apollo** - Apollo 配置中心客户端
|
|
12
|
+
- **Nacos** - Nacos 服务发现与配置
|
|
13
|
+
- **Snowflake** - 分布式 ID 生成器
|
|
14
|
+
- **Cache** - 缓存服务(支持 Redis/SQLite)
|
|
15
|
+
- **Env** - 环境变量管理
|
|
16
|
+
- **RESTful** - RESTful API 工具
|
|
17
|
+
|
|
18
|
+
## 安装
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
pnpm add yz-web-server-shared
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## 使用示例
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
import { SequelizeModule } from 'yz-web-server-shared/sequelize';
|
|
28
|
+
import { JwtModule } from 'yz-web-server-shared/jwt';
|
|
29
|
+
|
|
30
|
+
@Module({
|
|
31
|
+
imports: [
|
|
32
|
+
SequelizeModule.forRoot({
|
|
33
|
+
// 配置选项
|
|
34
|
+
}),
|
|
35
|
+
JwtModule.register({
|
|
36
|
+
// JWT 配置
|
|
37
|
+
}),
|
|
38
|
+
],
|
|
39
|
+
})
|
|
40
|
+
export class AppModule {}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## 依赖要求
|
|
44
|
+
|
|
45
|
+
- Node.js >= 18
|
|
46
|
+
- NestJS >= 11
|
|
47
|
+
- TypeScript >= 5
|
|
48
|
+
|
|
49
|
+
## License
|
|
50
|
+
|
|
51
|
+
MIT
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Apollo配置接口
|
|
3
|
+
*/
|
|
4
|
+
export interface ApolloConfig {
|
|
5
|
+
/**
|
|
6
|
+
* Apollo服务地址
|
|
7
|
+
*/
|
|
8
|
+
host?: string;
|
|
9
|
+
/**
|
|
10
|
+
* 应用ID
|
|
11
|
+
*/
|
|
12
|
+
appId?: string;
|
|
13
|
+
/**
|
|
14
|
+
* 集群名称
|
|
15
|
+
*/
|
|
16
|
+
clusterName?: string;
|
|
17
|
+
/**
|
|
18
|
+
* 命名空间
|
|
19
|
+
*/
|
|
20
|
+
namespaces?: string[];
|
|
21
|
+
/**
|
|
22
|
+
* Apollo访问密钥
|
|
23
|
+
*/
|
|
24
|
+
secret?: string;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=apollo.config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apollo.config.d.ts","sourceRoot":"","sources":["../../src/apollo/apollo.config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAEtB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { DynamicModule } from '@nestjs/common';
|
|
2
|
+
import { ApolloConfig } from './apollo.config';
|
|
3
|
+
/**
|
|
4
|
+
* Apollo模块
|
|
5
|
+
*/
|
|
6
|
+
export declare class ApolloModule {
|
|
7
|
+
/**
|
|
8
|
+
* 静态方法:配置Apollo模块
|
|
9
|
+
* 用于根模块注册
|
|
10
|
+
*/
|
|
11
|
+
static forRoot(config: ApolloConfig): DynamicModule;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=apollo.module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apollo.module.d.ts","sourceRoot":"","sources":["../../src/apollo/apollo.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAkB,MAAM,gBAAgB,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C;;GAEG;AACH,qBAEa,YAAY;IACvB;;;OAGG;IACH,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,aAAa;CAuCpD"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var ApolloModule_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.ApolloModule = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
const apollo_service_1 = require("./apollo.service");
|
|
13
|
+
const apollo_client_1 = require("@vodyani/apollo-client");
|
|
14
|
+
/**
|
|
15
|
+
* Apollo模块
|
|
16
|
+
*/
|
|
17
|
+
let ApolloModule = ApolloModule_1 = class ApolloModule {
|
|
18
|
+
/**
|
|
19
|
+
* 静态方法:配置Apollo模块
|
|
20
|
+
* 用于根模块注册
|
|
21
|
+
*/
|
|
22
|
+
static forRoot(config) {
|
|
23
|
+
const apolloClient = new apollo_client_1.ApolloHttpClient({
|
|
24
|
+
appId: config.appId,
|
|
25
|
+
configServerUrl: config.host,
|
|
26
|
+
clusterName: config.clusterName,
|
|
27
|
+
secret: config.secret,
|
|
28
|
+
});
|
|
29
|
+
const namespaces = config.namespaces || ['application'];
|
|
30
|
+
return {
|
|
31
|
+
module: ApolloModule_1,
|
|
32
|
+
providers: [
|
|
33
|
+
{
|
|
34
|
+
provide: 'APOLLO_NAMESPACE_CONFIGS',
|
|
35
|
+
useFactory: async () => {
|
|
36
|
+
const configs = {};
|
|
37
|
+
const promises = namespaces.map(async (namespace) => {
|
|
38
|
+
const config = await apolloClient.getConfigByCache(namespace, 'properties');
|
|
39
|
+
return { namespace, config };
|
|
40
|
+
});
|
|
41
|
+
const results = await Promise.all(promises);
|
|
42
|
+
results.forEach(({ namespace, config }) => {
|
|
43
|
+
configs[namespace] = config;
|
|
44
|
+
});
|
|
45
|
+
return configs;
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
provide: 'APOLLO_SERVICE',
|
|
50
|
+
useClass: apollo_service_1.ApolloService,
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
exports: ['APOLLO_SERVICE'],
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
exports.ApolloModule = ApolloModule;
|
|
58
|
+
exports.ApolloModule = ApolloModule = ApolloModule_1 = __decorate([
|
|
59
|
+
(0, common_1.Global)(),
|
|
60
|
+
(0, common_1.Module)({})
|
|
61
|
+
], ApolloModule);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface IApolloService {
|
|
2
|
+
getConfig(namespace: string): Record<string, any>;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Apollo服务
|
|
6
|
+
* 实现与携程Apollo配置中心的对接
|
|
7
|
+
*/
|
|
8
|
+
export declare class ApolloService implements IApolloService {
|
|
9
|
+
protected readonly configs: {
|
|
10
|
+
[key: string]: Record<string, any>;
|
|
11
|
+
};
|
|
12
|
+
constructor(configs: {
|
|
13
|
+
[key: string]: Record<string, any>;
|
|
14
|
+
});
|
|
15
|
+
getConfig(namespace: string): Record<string, any>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=apollo.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apollo.service.d.ts","sourceRoot":"","sources":["../../src/apollo/apollo.service.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACnD;AAED;;;GAGG;AACH,qBACa,aAAc,YAAW,cAAc;IAGhD,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE;gBAA/C,OAAO,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE;IAGpE,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;CAGlD"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.ApolloService = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
/**
|
|
18
|
+
* Apollo服务
|
|
19
|
+
* 实现与携程Apollo配置中心的对接
|
|
20
|
+
*/
|
|
21
|
+
let ApolloService = class ApolloService {
|
|
22
|
+
configs;
|
|
23
|
+
constructor(configs) {
|
|
24
|
+
this.configs = configs;
|
|
25
|
+
}
|
|
26
|
+
getConfig(namespace) {
|
|
27
|
+
return this.configs[namespace];
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
exports.ApolloService = ApolloService;
|
|
31
|
+
exports.ApolloService = ApolloService = __decorate([
|
|
32
|
+
(0, common_1.Injectable)(),
|
|
33
|
+
__param(0, (0, common_1.Inject)('APOLLO_NAMESPACE_CONFIGS')),
|
|
34
|
+
__metadata("design:paramtypes", [Object])
|
|
35
|
+
], ApolloService);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/apollo/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./apollo.module"), exports);
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache 模块配置接口
|
|
3
|
+
*/
|
|
4
|
+
export interface ICacheConfig {
|
|
5
|
+
/**
|
|
6
|
+
* 缓存驱动类型
|
|
7
|
+
* - memory: 内存存储(临时测试用,Pod 重启后数据丢失)
|
|
8
|
+
* - sqlite: 本地 SQLite 文件存储(开发环境推荐)
|
|
9
|
+
* - redis: Redis 存储(生产环境推荐)
|
|
10
|
+
*/
|
|
11
|
+
driver: 'memory' | 'sqlite' | 'redis';
|
|
12
|
+
/**
|
|
13
|
+
* SQLite 配置(driver = 'sqlite' 时有效)
|
|
14
|
+
* 数据库文件路径,如 './cache.db'
|
|
15
|
+
*/
|
|
16
|
+
sqlitePath?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Redis 配置(driver = 'redis' 时有效)
|
|
19
|
+
* Redis 连接 URL,如 'redis://localhost:6379'
|
|
20
|
+
*/
|
|
21
|
+
redisUrl?: string;
|
|
22
|
+
/**
|
|
23
|
+
* 命名空间,用于隔离不同应用的缓存
|
|
24
|
+
* 默认: 'cache'
|
|
25
|
+
*/
|
|
26
|
+
namespace?: string;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=cache.config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.config.d.ts","sourceRoot":"","sources":["../../src/cache/cache.config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;OAKG;IACH,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IAEtC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { DynamicModule } from '@nestjs/common';
|
|
2
|
+
import type { ICacheConfig } from './cache.config';
|
|
3
|
+
/**
|
|
4
|
+
* 缓存模块
|
|
5
|
+
* 提供统一的 KV 缓存能力,支持 SQLite(本地开发)和 Redis(生产环境)
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // 静态配置
|
|
10
|
+
* CacheModule.forRoot({
|
|
11
|
+
* driver: 'sqlite',
|
|
12
|
+
* sqlitePath: './cache.db',
|
|
13
|
+
* })
|
|
14
|
+
*
|
|
15
|
+
* // 异步配置
|
|
16
|
+
* CacheModule.forRootAsync({
|
|
17
|
+
* useFactory: (envService: EnvService) => ({
|
|
18
|
+
* driver: envService.getItem('CACHE_DRIVER') as 'sqlite' | 'redis',
|
|
19
|
+
* sqlitePath: envService.getItem('CACHE_SQLITE_PATH'),
|
|
20
|
+
* redisUrl: envService.getItem('REDIS_URL'),
|
|
21
|
+
* }),
|
|
22
|
+
* inject: [EnvService],
|
|
23
|
+
* })
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare class CacheModule {
|
|
27
|
+
/**
|
|
28
|
+
* 静态配置
|
|
29
|
+
*/
|
|
30
|
+
static forRoot(config: ICacheConfig): DynamicModule;
|
|
31
|
+
/**
|
|
32
|
+
* 异步配置
|
|
33
|
+
*/
|
|
34
|
+
static forRootAsync(options: {
|
|
35
|
+
useFactory: (...args: any[]) => Promise<ICacheConfig> | ICacheConfig;
|
|
36
|
+
inject?: any[];
|
|
37
|
+
}): DynamicModule;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=cache.module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.module.d.ts","sourceRoot":"","sources":["../../src/cache/cache.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAkB,MAAM,gBAAgB,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGnD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAEa,WAAW;IACtB;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,aAAa;IAcnD;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE;QAC3B,UAAU,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;QACrE,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;KAChB,GAAG,aAAa;CAclB"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var CacheModule_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.CacheModule = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
const cache_service_1 = require("./cache.service");
|
|
13
|
+
/**
|
|
14
|
+
* 缓存模块
|
|
15
|
+
* 提供统一的 KV 缓存能力,支持 SQLite(本地开发)和 Redis(生产环境)
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* // 静态配置
|
|
20
|
+
* CacheModule.forRoot({
|
|
21
|
+
* driver: 'sqlite',
|
|
22
|
+
* sqlitePath: './cache.db',
|
|
23
|
+
* })
|
|
24
|
+
*
|
|
25
|
+
* // 异步配置
|
|
26
|
+
* CacheModule.forRootAsync({
|
|
27
|
+
* useFactory: (envService: EnvService) => ({
|
|
28
|
+
* driver: envService.getItem('CACHE_DRIVER') as 'sqlite' | 'redis',
|
|
29
|
+
* sqlitePath: envService.getItem('CACHE_SQLITE_PATH'),
|
|
30
|
+
* redisUrl: envService.getItem('REDIS_URL'),
|
|
31
|
+
* }),
|
|
32
|
+
* inject: [EnvService],
|
|
33
|
+
* })
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
let CacheModule = CacheModule_1 = class CacheModule {
|
|
37
|
+
/**
|
|
38
|
+
* 静态配置
|
|
39
|
+
*/
|
|
40
|
+
static forRoot(config) {
|
|
41
|
+
return {
|
|
42
|
+
module: CacheModule_1,
|
|
43
|
+
providers: [
|
|
44
|
+
{
|
|
45
|
+
provide: 'CACHE_CONFIG',
|
|
46
|
+
useValue: config,
|
|
47
|
+
},
|
|
48
|
+
cache_service_1.CacheService,
|
|
49
|
+
],
|
|
50
|
+
exports: [cache_service_1.CacheService],
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 异步配置
|
|
55
|
+
*/
|
|
56
|
+
static forRootAsync(options) {
|
|
57
|
+
return {
|
|
58
|
+
module: CacheModule_1,
|
|
59
|
+
providers: [
|
|
60
|
+
{
|
|
61
|
+
provide: 'CACHE_CONFIG',
|
|
62
|
+
useFactory: options.useFactory,
|
|
63
|
+
inject: options.inject || [],
|
|
64
|
+
},
|
|
65
|
+
cache_service_1.CacheService,
|
|
66
|
+
],
|
|
67
|
+
exports: [cache_service_1.CacheService],
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
exports.CacheModule = CacheModule;
|
|
72
|
+
exports.CacheModule = CacheModule = CacheModule_1 = __decorate([
|
|
73
|
+
(0, common_1.Global)(),
|
|
74
|
+
(0, common_1.Module)({})
|
|
75
|
+
], CacheModule);
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { OnModuleDestroy } from '@nestjs/common';
|
|
2
|
+
import type { ICacheConfig } from './cache.config';
|
|
3
|
+
/**
|
|
4
|
+
* 缓存服务
|
|
5
|
+
* 提供统一的 KV 缓存接口,支持 SQLite(本地开发)和 Redis(生产环境)
|
|
6
|
+
*/
|
|
7
|
+
export declare class CacheService implements OnModuleDestroy {
|
|
8
|
+
private readonly config;
|
|
9
|
+
private keyv;
|
|
10
|
+
private readonly logger;
|
|
11
|
+
constructor(config: ICacheConfig);
|
|
12
|
+
/**
|
|
13
|
+
* 根据配置创建 Keyv 实例
|
|
14
|
+
*/
|
|
15
|
+
private createKeyvInstance;
|
|
16
|
+
/**
|
|
17
|
+
* 设置缓存
|
|
18
|
+
* @param key 缓存键
|
|
19
|
+
* @param value 缓存值
|
|
20
|
+
* @param ttl 过期时间(毫秒),不传则永不过期
|
|
21
|
+
*/
|
|
22
|
+
set<T = any>(key: string, value: T, ttl?: number): Promise<boolean>;
|
|
23
|
+
/**
|
|
24
|
+
* 获取缓存
|
|
25
|
+
* @param key 缓存键
|
|
26
|
+
* @returns 缓存值,不存在或已过期返回 undefined
|
|
27
|
+
*/
|
|
28
|
+
get<T = any>(key: string): Promise<T | undefined>;
|
|
29
|
+
/**
|
|
30
|
+
* 删除缓存
|
|
31
|
+
* @param key 缓存键
|
|
32
|
+
* @returns 是否删除成功
|
|
33
|
+
*/
|
|
34
|
+
delete(key: string): Promise<boolean>;
|
|
35
|
+
/**
|
|
36
|
+
* 检查缓存是否存在
|
|
37
|
+
* @param key 缓存键
|
|
38
|
+
*/
|
|
39
|
+
has(key: string): Promise<boolean>;
|
|
40
|
+
/**
|
|
41
|
+
* 清空当前命名空间下的所有缓存
|
|
42
|
+
*/
|
|
43
|
+
clear(): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* 断开连接(模块销毁时调用)
|
|
46
|
+
*/
|
|
47
|
+
onModuleDestroy(): Promise<void>;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=cache.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.service.d.ts","sourceRoot":"","sources":["../../src/cache/cache.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,eAAe,EAAU,MAAM,gBAAgB,CAAC;AAK7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA6HnD;;;GAGG;AACH,qBACa,YAAa,YAAW,eAAe;IAMhD,OAAO,CAAC,QAAQ,CAAC,MAAM;IALzB,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;gBAIrC,MAAM,EAAE,YAAY;IAKvC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA8B1B;;;;;OAKG;IACG,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIzE;;;;OAIG;IACG,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAIvD;;;;OAIG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI3C;;;OAGG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIxC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;CAGvC"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
15
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
16
|
+
};
|
|
17
|
+
var CacheService_1;
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.CacheService = void 0;
|
|
20
|
+
const common_1 = require("@nestjs/common");
|
|
21
|
+
const node_fs_1 = require("node:fs");
|
|
22
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
23
|
+
const node_sqlite_1 = require("node:sqlite");
|
|
24
|
+
const keyv_1 = __importDefault(require("keyv"));
|
|
25
|
+
class SqliteBackedStore {
|
|
26
|
+
logger = new common_1.Logger(SqliteBackedStore.name);
|
|
27
|
+
db;
|
|
28
|
+
constructor(sqlitePath) {
|
|
29
|
+
const resolvedPath = node_path_1.default.resolve(process.cwd(), sqlitePath);
|
|
30
|
+
(0, node_fs_1.mkdirSync)(node_path_1.default.dirname(resolvedPath), { recursive: true });
|
|
31
|
+
this.db = new node_sqlite_1.DatabaseSync(resolvedPath, {
|
|
32
|
+
timeout: 5000,
|
|
33
|
+
enableForeignKeyConstraints: true,
|
|
34
|
+
});
|
|
35
|
+
this.db.exec(`
|
|
36
|
+
PRAGMA journal_mode = WAL;
|
|
37
|
+
PRAGMA synchronous = NORMAL;
|
|
38
|
+
CREATE TABLE IF NOT EXISTS keyv_cache (
|
|
39
|
+
key TEXT PRIMARY KEY,
|
|
40
|
+
value TEXT NOT NULL,
|
|
41
|
+
expires_at INTEGER
|
|
42
|
+
);
|
|
43
|
+
CREATE INDEX IF NOT EXISTS idx_keyv_cache_expires_at
|
|
44
|
+
ON keyv_cache(expires_at);
|
|
45
|
+
`);
|
|
46
|
+
this.logger.log(`使用 node:sqlite 缓存: ${resolvedPath}`);
|
|
47
|
+
}
|
|
48
|
+
shouldTraceKey(key) {
|
|
49
|
+
return key.startsWith('portal:auth:');
|
|
50
|
+
}
|
|
51
|
+
async get(key) {
|
|
52
|
+
this.cleanupExpired(key);
|
|
53
|
+
const row = this.db
|
|
54
|
+
.prepare('SELECT value FROM keyv_cache WHERE key = ?')
|
|
55
|
+
.get(key);
|
|
56
|
+
if (!row) {
|
|
57
|
+
if (this.shouldTraceKey(key)) {
|
|
58
|
+
this.logger.debug(`[cache:get:miss] key=${key}`);
|
|
59
|
+
}
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
if (this.shouldTraceKey(key)) {
|
|
63
|
+
this.logger.debug(`[cache:get:hit] key=${key}`);
|
|
64
|
+
}
|
|
65
|
+
return JSON.parse(row.value);
|
|
66
|
+
}
|
|
67
|
+
async set(key, value, ttl) {
|
|
68
|
+
const expiresAt = ttl ? Date.now() + ttl : null;
|
|
69
|
+
this.db
|
|
70
|
+
.prepare(`
|
|
71
|
+
INSERT INTO keyv_cache (key, value, expires_at)
|
|
72
|
+
VALUES (?, ?, ?)
|
|
73
|
+
ON CONFLICT(key) DO UPDATE SET
|
|
74
|
+
value = excluded.value,
|
|
75
|
+
expires_at = excluded.expires_at
|
|
76
|
+
`)
|
|
77
|
+
.run(key, JSON.stringify(value), expiresAt);
|
|
78
|
+
if (this.shouldTraceKey(key)) {
|
|
79
|
+
this.logger.debug(`[cache:set] key=${key} ttlMs=${ttl ?? 'none'} expiresAt=${expiresAt ?? 'none'}`);
|
|
80
|
+
}
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
async delete(key) {
|
|
84
|
+
const result = this.db
|
|
85
|
+
.prepare('DELETE FROM keyv_cache WHERE key = ?')
|
|
86
|
+
.run(key);
|
|
87
|
+
if (this.shouldTraceKey(key)) {
|
|
88
|
+
this.logger.debug(`[cache:delete] key=${key} deleted=${Number(result.changes) > 0}`);
|
|
89
|
+
}
|
|
90
|
+
return Number(result.changes) > 0;
|
|
91
|
+
}
|
|
92
|
+
async clear() {
|
|
93
|
+
this.db.exec('DELETE FROM keyv_cache');
|
|
94
|
+
this.logger.warn('[cache:clear] 已清空整个 sqlite 缓存表 keyv_cache');
|
|
95
|
+
}
|
|
96
|
+
async has(key) {
|
|
97
|
+
return (await this.get(key)) !== undefined;
|
|
98
|
+
}
|
|
99
|
+
async disconnect() {
|
|
100
|
+
if (this.db.isOpen) {
|
|
101
|
+
this.db.close();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
cleanupExpired(key) {
|
|
105
|
+
const now = Date.now();
|
|
106
|
+
if (key) {
|
|
107
|
+
this.db
|
|
108
|
+
.prepare('DELETE FROM keyv_cache WHERE key = ? AND expires_at IS NOT NULL AND expires_at <= ?')
|
|
109
|
+
.run(key, now);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
this.db
|
|
113
|
+
.prepare('DELETE FROM keyv_cache WHERE expires_at IS NOT NULL AND expires_at <= ?')
|
|
114
|
+
.run(now);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* 缓存服务
|
|
119
|
+
* 提供统一的 KV 缓存接口,支持 SQLite(本地开发)和 Redis(生产环境)
|
|
120
|
+
*/
|
|
121
|
+
let CacheService = CacheService_1 = class CacheService {
|
|
122
|
+
config;
|
|
123
|
+
keyv;
|
|
124
|
+
logger = new common_1.Logger(CacheService_1.name);
|
|
125
|
+
constructor(config) {
|
|
126
|
+
this.config = config;
|
|
127
|
+
this.keyv = this.createKeyvInstance();
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* 根据配置创建 Keyv 实例
|
|
131
|
+
*/
|
|
132
|
+
createKeyvInstance() {
|
|
133
|
+
const namespace = this.config.namespace || 'cache';
|
|
134
|
+
// 内存缓存 - 临时测试用,Pod 重启后数据丢失
|
|
135
|
+
if (this.config.driver === 'memory') {
|
|
136
|
+
this.logger.log(`使用内存缓存 (namespace=${namespace}) - 警告: Pod 重启后数据将丢失`);
|
|
137
|
+
return new keyv_1.default({ namespace });
|
|
138
|
+
}
|
|
139
|
+
if (this.config.driver === 'redis') {
|
|
140
|
+
try {
|
|
141
|
+
// Redis 驱动需要动态导入
|
|
142
|
+
const KeyvRedis = require('@keyv/redis').default;
|
|
143
|
+
const store = new KeyvRedis(this.config.redisUrl || 'redis://localhost:6379');
|
|
144
|
+
this.logger.log(`使用 Redis 缓存: ${this.config.redisUrl}`);
|
|
145
|
+
return new keyv_1.default({ store, namespace });
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
this.logger.warn(`Redis 驱动加载失败,回退到内存缓存: ${err.message}`);
|
|
149
|
+
return new keyv_1.default({ namespace });
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const sqlitePath = this.config.sqlitePath || './cache/cache.db';
|
|
153
|
+
return new keyv_1.default({
|
|
154
|
+
store: new SqliteBackedStore(sqlitePath),
|
|
155
|
+
namespace,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* 设置缓存
|
|
160
|
+
* @param key 缓存键
|
|
161
|
+
* @param value 缓存值
|
|
162
|
+
* @param ttl 过期时间(毫秒),不传则永不过期
|
|
163
|
+
*/
|
|
164
|
+
async set(key, value, ttl) {
|
|
165
|
+
return this.keyv.set(key, value, ttl);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* 获取缓存
|
|
169
|
+
* @param key 缓存键
|
|
170
|
+
* @returns 缓存值,不存在或已过期返回 undefined
|
|
171
|
+
*/
|
|
172
|
+
async get(key) {
|
|
173
|
+
return this.keyv.get(key);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* 删除缓存
|
|
177
|
+
* @param key 缓存键
|
|
178
|
+
* @returns 是否删除成功
|
|
179
|
+
*/
|
|
180
|
+
async delete(key) {
|
|
181
|
+
return this.keyv.delete(key);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* 检查缓存是否存在
|
|
185
|
+
* @param key 缓存键
|
|
186
|
+
*/
|
|
187
|
+
async has(key) {
|
|
188
|
+
return this.keyv.has(key);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* 清空当前命名空间下的所有缓存
|
|
192
|
+
*/
|
|
193
|
+
async clear() {
|
|
194
|
+
return this.keyv.clear();
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* 断开连接(模块销毁时调用)
|
|
198
|
+
*/
|
|
199
|
+
async onModuleDestroy() {
|
|
200
|
+
await this.keyv.disconnect();
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
exports.CacheService = CacheService;
|
|
204
|
+
exports.CacheService = CacheService = CacheService_1 = __decorate([
|
|
205
|
+
(0, common_1.Injectable)(),
|
|
206
|
+
__param(0, (0, common_1.Inject)('CACHE_CONFIG')),
|
|
207
|
+
__metadata("design:paramtypes", [Object])
|
|
208
|
+
], CacheService);
|