@campxdev/server-shared 2.0.5 → 2.0.7
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/dist/domain/entities/institution-config.entity.d.ts +42 -0
- package/dist/domain/entities/institution-config.entity.d.ts.map +1 -0
- package/dist/domain/entities/institution-config.entity.js +195 -0
- package/dist/domain/entities/institution-config.entity.js.map +1 -0
- package/dist/domain/modules/shared-domain.module.d.ts.map +1 -1
- package/dist/domain/modules/shared-domain.module.js +6 -0
- package/dist/domain/modules/shared-domain.module.js.map +1 -1
- package/dist/domain/mysql-repositories/mysql-institution-config.repository.d.ts +12 -0
- package/dist/domain/mysql-repositories/mysql-institution-config.repository.d.ts.map +1 -0
- package/dist/domain/mysql-repositories/mysql-institution-config.repository.js +47 -0
- package/dist/domain/mysql-repositories/mysql-institution-config.repository.js.map +1 -0
- package/dist/domain/repositories/institution-config.repository.d.ts +11 -0
- package/dist/domain/repositories/institution-config.repository.d.ts.map +1 -0
- package/dist/domain/repositories/institution-config.repository.js +7 -0
- package/dist/domain/repositories/institution-config.repository.js.map +1 -0
- package/dist/media/index.d.ts +6 -0
- package/dist/media/index.d.ts.map +1 -1
- package/dist/media/index.js +6 -0
- package/dist/media/index.js.map +1 -1
- package/dist/media/interfaces/s3-client.interfaces.d.ts +44 -0
- package/dist/media/interfaces/s3-client.interfaces.d.ts.map +1 -0
- package/dist/media/interfaces/s3-client.interfaces.js +3 -0
- package/dist/media/interfaces/s3-client.interfaces.js.map +1 -0
- package/dist/media/interfaces/sts.interfaces.d.ts +7 -0
- package/dist/media/interfaces/sts.interfaces.d.ts.map +1 -0
- package/dist/media/interfaces/sts.interfaces.js +3 -0
- package/dist/media/interfaces/sts.interfaces.js.map +1 -0
- package/dist/media/managers/aws.manager.d.ts +7 -1
- package/dist/media/managers/aws.manager.d.ts.map +1 -1
- package/dist/media/managers/aws.manager.js +9 -0
- package/dist/media/managers/aws.manager.js.map +1 -1
- package/dist/media/managers/media-object-manager.d.ts +17 -3
- package/dist/media/managers/media-object-manager.d.ts.map +1 -1
- package/dist/media/managers/media-object-manager.js +24 -8
- package/dist/media/managers/media-object-manager.js.map +1 -1
- package/dist/media/managers/media-records-manager.d.ts +18 -3
- package/dist/media/managers/media-records-manager.d.ts.map +1 -1
- package/dist/media/managers/media-records-manager.js +26 -9
- package/dist/media/managers/media-records-manager.js.map +1 -1
- package/dist/media/media.module.d.ts.map +1 -1
- package/dist/media/media.module.js +5 -2
- package/dist/media/media.module.js.map +1 -1
- package/dist/media/services/s3-client-factory.service.d.ts +13 -0
- package/dist/media/services/s3-client-factory.service.d.ts.map +1 -0
- package/dist/media/services/s3-client-factory.service.js +132 -0
- package/dist/media/services/s3-client-factory.service.js.map +1 -0
- package/dist/media/services/s3-client-store.service.d.ts +41 -0
- package/dist/media/services/s3-client-store.service.d.ts.map +1 -0
- package/dist/media/services/s3-client-store.service.js +129 -0
- package/dist/media/services/s3-client-store.service.js.map +1 -0
- package/dist/media/services/sts.service.d.ts +16 -0
- package/dist/media/services/sts.service.d.ts.map +1 -0
- package/dist/media/services/sts.service.js +69 -0
- package/dist/media/services/sts.service.js.map +1 -0
- package/dist/media/utils/simple-cache.d.ts +20 -0
- package/dist/media/utils/simple-cache.d.ts.map +1 -0
- package/dist/media/utils/simple-cache.js +80 -0
- package/dist/media/utils/simple-cache.js.map +1 -0
- package/package.json +5 -3
|
@@ -0,0 +1,129 @@
|
|
|
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 S3ClientStoreService_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.S3ClientStoreService = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const config_1 = require("@nestjs/config");
|
|
16
|
+
const institution_config_repository_1 = require("../../domain/repositories/institution-config.repository");
|
|
17
|
+
const request_store_1 = require("../../request-store");
|
|
18
|
+
const aws_manager_1 = require("../managers/aws.manager");
|
|
19
|
+
const simple_cache_1 = require("../utils/simple-cache");
|
|
20
|
+
const s3_client_factory_service_1 = require("./s3-client-factory.service");
|
|
21
|
+
const sts_service_1 = require("./sts.service");
|
|
22
|
+
let S3ClientStoreService = S3ClientStoreService_1 = class S3ClientStoreService {
|
|
23
|
+
stsService;
|
|
24
|
+
configService;
|
|
25
|
+
s3ClientFactory;
|
|
26
|
+
institutionConfigRepository;
|
|
27
|
+
logger = new common_1.Logger(S3ClientStoreService_1.name);
|
|
28
|
+
s3ClientCache;
|
|
29
|
+
defaultAWSManager;
|
|
30
|
+
constructor(stsService, configService, s3ClientFactory, institutionConfigRepository, defaultAWSManager) {
|
|
31
|
+
this.stsService = stsService;
|
|
32
|
+
this.configService = configService;
|
|
33
|
+
this.s3ClientFactory = s3ClientFactory;
|
|
34
|
+
this.institutionConfigRepository = institutionConfigRepository;
|
|
35
|
+
this.defaultAWSManager = defaultAWSManager;
|
|
36
|
+
this.s3ClientCache = new simple_cache_1.SimpleCache({
|
|
37
|
+
defaultTtlMs: 30 * 60 * 1000, // 30 minutes
|
|
38
|
+
maxSize: 50,
|
|
39
|
+
createFn: async (key, config) => {
|
|
40
|
+
return await this.createCachedS3Client(key, config);
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get AWS manager with expiry checking
|
|
46
|
+
*/
|
|
47
|
+
async getAWSManager(useInstitutionS3Client) {
|
|
48
|
+
if (!useInstitutionS3Client) {
|
|
49
|
+
return this.defaultAWSManager;
|
|
50
|
+
}
|
|
51
|
+
// Get data from request store internally
|
|
52
|
+
const tenant = (0, request_store_1.getTenantDetails)();
|
|
53
|
+
const institution = (0, request_store_1.getInstitution)();
|
|
54
|
+
// TODO: Get institution credentials from database using institution.uniqueId
|
|
55
|
+
// For now, use placeholder credentials
|
|
56
|
+
const institutionConfig = await this.institutionConfigRepository.findByInstitutionId(institution.uniqueId);
|
|
57
|
+
const institutionCredentials = {
|
|
58
|
+
institutionId: institutionConfig.institutionId,
|
|
59
|
+
bucketConfigured: institutionConfig?.bucketConfigured || false,
|
|
60
|
+
iamRoleArn: institutionConfig?.iamRoleArn,
|
|
61
|
+
roleSessionDuration: institutionConfig?.roleSessionDuration || 3600,
|
|
62
|
+
};
|
|
63
|
+
const bucketName = institutionConfig?.bucketName;
|
|
64
|
+
const config = {
|
|
65
|
+
tenantSubDomain: tenant.subDomain,
|
|
66
|
+
institutionCode: institution.code,
|
|
67
|
+
institutionCredentials,
|
|
68
|
+
bucketName,
|
|
69
|
+
};
|
|
70
|
+
return await this.getS3Client(config);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get institution-specific S3 client
|
|
74
|
+
*/
|
|
75
|
+
async getInstitutionS3Client(tenantSubDomain, institutionCode, institutionCredentials, bucketName) {
|
|
76
|
+
const config = {
|
|
77
|
+
tenantSubDomain,
|
|
78
|
+
institutionCode,
|
|
79
|
+
institutionCredentials,
|
|
80
|
+
bucketName,
|
|
81
|
+
};
|
|
82
|
+
return await this.getS3Client(config);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get S3 client with configuration
|
|
86
|
+
*/
|
|
87
|
+
async getS3Client(config) {
|
|
88
|
+
const key = this.generateClientKey(config.tenantSubDomain, config.institutionCode);
|
|
89
|
+
const cachedClient = await this.s3ClientCache.get(key, config);
|
|
90
|
+
return cachedClient.client;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Invalidate cached S3 client for an institution
|
|
94
|
+
*/
|
|
95
|
+
invalidateInstitutionClient(tenantSubDomain, institutionCode) {
|
|
96
|
+
const key = this.generateClientKey(tenantSubDomain, institutionCode);
|
|
97
|
+
this.s3ClientCache.remove(key);
|
|
98
|
+
this.logger.log(`Invalidated S3 client for key: ${key}`);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Create cached S3 client
|
|
102
|
+
*/
|
|
103
|
+
async createCachedS3Client(_key, config) {
|
|
104
|
+
this.logger.log(`Creating S3 client for tenant: ${config.tenantSubDomain}, institution: ${config.institutionCode}`);
|
|
105
|
+
// Create S3 client using factory
|
|
106
|
+
const s3Client = await this.s3ClientFactory.createS3Client(config);
|
|
107
|
+
return {
|
|
108
|
+
client: s3Client,
|
|
109
|
+
institutionId: config.institutionCredentials.institutionId,
|
|
110
|
+
cachedAt: new Date(),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Generate cache key for S3 client using tenant subdomain and institution code
|
|
115
|
+
*/
|
|
116
|
+
generateClientKey(tenantSubDomain, institutionCode) {
|
|
117
|
+
return `${tenantSubDomain}-${institutionCode}`;
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
exports.S3ClientStoreService = S3ClientStoreService;
|
|
121
|
+
exports.S3ClientStoreService = S3ClientStoreService = S3ClientStoreService_1 = __decorate([
|
|
122
|
+
(0, common_1.Injectable)(),
|
|
123
|
+
__metadata("design:paramtypes", [sts_service_1.STSService,
|
|
124
|
+
config_1.ConfigService,
|
|
125
|
+
s3_client_factory_service_1.S3ClientFactory,
|
|
126
|
+
institution_config_repository_1.InstitutionConfigRepository,
|
|
127
|
+
aws_manager_1.AWSManager])
|
|
128
|
+
], S3ClientStoreService);
|
|
129
|
+
//# sourceMappingURL=s3-client-store.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3-client-store.service.js","sourceRoot":"","sources":["../../../src/media/services/s3-client-store.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ConfigService } from '@nestjs/config';
|
|
2
|
+
export declare class STSService {
|
|
3
|
+
private readonly configService;
|
|
4
|
+
private readonly logger;
|
|
5
|
+
private readonly stsClient;
|
|
6
|
+
constructor(configService: ConfigService);
|
|
7
|
+
/**
|
|
8
|
+
* Assume role and return AWS credentials for S3Client
|
|
9
|
+
*/
|
|
10
|
+
assumeRole(roleArn: string, sessionName?: string): Promise<{
|
|
11
|
+
accessKeyId: string;
|
|
12
|
+
secretAccessKey: string;
|
|
13
|
+
sessionToken: string;
|
|
14
|
+
}>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=sts.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sts.service.d.ts","sourceRoot":"","sources":["../../../src/media/services/sts.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,qBACa,UAAU;IAIT,OAAO,CAAC,QAAQ,CAAC,aAAa;IAH1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+B;IACtD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;gBAET,aAAa,EAAE,aAAa;IAczD;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;;;;;CA8BvD"}
|
|
@@ -0,0 +1,69 @@
|
|
|
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 STSService_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.STSService = void 0;
|
|
14
|
+
const client_sts_1 = require("@aws-sdk/client-sts");
|
|
15
|
+
const common_1 = require("@nestjs/common");
|
|
16
|
+
const config_1 = require("@nestjs/config");
|
|
17
|
+
let STSService = STSService_1 = class STSService {
|
|
18
|
+
configService;
|
|
19
|
+
logger = new common_1.Logger(STSService_1.name);
|
|
20
|
+
stsClient;
|
|
21
|
+
constructor(configService) {
|
|
22
|
+
this.configService = configService;
|
|
23
|
+
const isLocal = process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'local';
|
|
24
|
+
this.logger.log(`STSService initialized with isLocal: ${isLocal}`);
|
|
25
|
+
this.stsClient = new client_sts_1.STSClient({
|
|
26
|
+
region: this.configService.get('AWS_REGION'),
|
|
27
|
+
...(isLocal && {
|
|
28
|
+
credentials: {
|
|
29
|
+
accessKeyId: this.configService.get('AWS_ACCESS_KEY_ID'),
|
|
30
|
+
secretAccessKey: this.configService.get('AWS_SECRET_ACCESS_KEY'),
|
|
31
|
+
},
|
|
32
|
+
}),
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Assume role and return AWS credentials for S3Client
|
|
37
|
+
*/
|
|
38
|
+
async assumeRole(roleArn, sessionName) {
|
|
39
|
+
const defaultSessionName = sessionName || `campx-session-${Date.now()}`;
|
|
40
|
+
const roleSessionDuration = Number(this.configService.get('roleSessionDuration')) || 3600;
|
|
41
|
+
try {
|
|
42
|
+
const response = await this.stsClient.send(new client_sts_1.AssumeRoleCommand({
|
|
43
|
+
RoleArn: roleArn,
|
|
44
|
+
RoleSessionName: defaultSessionName,
|
|
45
|
+
DurationSeconds: roleSessionDuration,
|
|
46
|
+
}));
|
|
47
|
+
if (!response.Credentials) {
|
|
48
|
+
throw new Error('Failed to obtain temporary credentials from STS');
|
|
49
|
+
}
|
|
50
|
+
this.logger.log(`Successfully assumed role: ${roleArn}`);
|
|
51
|
+
return {
|
|
52
|
+
accessKeyId: response.Credentials.AccessKeyId,
|
|
53
|
+
secretAccessKey: response.Credentials.SecretAccessKey,
|
|
54
|
+
sessionToken: response.Credentials.SessionToken,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
59
|
+
this.logger.error(`Failed to assume role ${roleArn}: ${errorMessage}`);
|
|
60
|
+
throw new Error(`Failed to assume role ${roleArn}: ${errorMessage}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
exports.STSService = STSService;
|
|
65
|
+
exports.STSService = STSService = STSService_1 = __decorate([
|
|
66
|
+
(0, common_1.Injectable)(),
|
|
67
|
+
__metadata("design:paramtypes", [config_1.ConfigService])
|
|
68
|
+
], STSService);
|
|
69
|
+
//# sourceMappingURL=sts.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sts.service.js","sourceRoot":"","sources":["../../../src/media/services/sts.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,oDAAmE;AACnE,2CAAoD;AACpD,2CAA+C;AAGxC,IAAM,UAAU,kBAAhB,MAAM,UAAU;IAIQ;IAHZ,MAAM,GAAG,IAAI,eAAM,CAAC,YAAU,CAAC,IAAI,CAAC,CAAC;IACrC,SAAS,CAAY;IAEtC,YAA6B,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;QACvD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAC;QAC3F,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,wCAAwC,OAAO,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,SAAS,GAAG,IAAI,sBAAS,CAAC;YAC7B,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC;YAC5C,GAAG,CAAC,OAAO,IAAI;gBACb,WAAW,EAAE;oBACX,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,mBAAmB,CAAC;oBACxD,eAAe,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,uBAAuB,CAAC;iBACjE;aACF,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,OAAe,EAAE,WAAoB;QACpD,MAAM,kBAAkB,GAAG,WAAW,IAAI,iBAAiB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACxE,MAAM,mBAAmB,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,IAAI,IAAI,CAAC;QAE1F,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CACxC,IAAI,8BAAiB,CAAC;gBACpB,OAAO,EAAE,OAAO;gBAChB,eAAe,EAAE,kBAAkB;gBACnC,eAAe,EAAE,mBAAmB;aACrC,CAAC,CACH,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;YACrE,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC;YAEzD,OAAO;gBACL,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,WAAY;gBAC9C,eAAe,EAAE,QAAQ,CAAC,WAAW,CAAC,eAAgB;gBACtD,YAAY,EAAE,QAAQ,CAAC,WAAW,CAAC,YAAa;aACjD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YAC9E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,OAAO,KAAK,YAAY,EAAE,CAAC,CAAC;YACvE,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,KAAK,YAAY,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;CACF,CAAA;AAnDY,gCAAU;qBAAV,UAAU;IADtB,IAAA,mBAAU,GAAE;qCAKiC,sBAAa;GAJ9C,UAAU,CAmDtB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
interface SimpleCacheOptions<T, P = any> {
|
|
2
|
+
defaultTtlMs?: number;
|
|
3
|
+
maxSize?: number;
|
|
4
|
+
createFn?: (key: string, params?: P) => Promise<T>;
|
|
5
|
+
}
|
|
6
|
+
export declare class SimpleCache<T, P = any> {
|
|
7
|
+
private readonly cache;
|
|
8
|
+
private readonly options;
|
|
9
|
+
constructor(options?: SimpleCacheOptions<T, P>);
|
|
10
|
+
get(key: string, params?: P): Promise<T>;
|
|
11
|
+
set(key: string, value: T, ttlMs?: number): void;
|
|
12
|
+
has(key: string): boolean;
|
|
13
|
+
remove(key: string): boolean;
|
|
14
|
+
clear(): void;
|
|
15
|
+
size(): number;
|
|
16
|
+
private evictIfNeeded;
|
|
17
|
+
private cleanupExpired;
|
|
18
|
+
}
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=simple-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simple-cache.d.ts","sourceRoot":"","sources":["../../../src/media/utils/simple-cache.ts"],"names":[],"mappings":"AAKA,UAAU,kBAAkB,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;CACpD;AAED,qBAAa,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoC;IAC1D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;gBAEjD,OAAO,GAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAM;IAQ5C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAkB9C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAQhD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAYzB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,MAAM;IAKd,OAAO,CAAC,aAAa;IAoBrB,OAAO,CAAC,cAAc;CAQvB"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SimpleCache = void 0;
|
|
4
|
+
class SimpleCache {
|
|
5
|
+
cache = new Map();
|
|
6
|
+
options;
|
|
7
|
+
constructor(options = {}) {
|
|
8
|
+
this.options = {
|
|
9
|
+
defaultTtlMs: options.defaultTtlMs ?? 60 * 60 * 1000, // 1 hour default
|
|
10
|
+
maxSize: options.maxSize ?? 1000,
|
|
11
|
+
createFn: options.createFn ?? (() => Promise.reject(new Error('No create function provided'))),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
async get(key, params) {
|
|
15
|
+
const entry = this.cache.get(key);
|
|
16
|
+
if (entry && Date.now() < entry.expiresAt) {
|
|
17
|
+
return entry.value;
|
|
18
|
+
}
|
|
19
|
+
// Remove expired entry
|
|
20
|
+
if (entry) {
|
|
21
|
+
this.cache.delete(key);
|
|
22
|
+
}
|
|
23
|
+
// Create new value using factory function
|
|
24
|
+
const value = await this.options.createFn(key, params);
|
|
25
|
+
this.set(key, value);
|
|
26
|
+
return value;
|
|
27
|
+
}
|
|
28
|
+
set(key, value, ttlMs) {
|
|
29
|
+
const actualTtl = ttlMs ?? this.options.defaultTtlMs;
|
|
30
|
+
const expiresAt = Date.now() + actualTtl;
|
|
31
|
+
this.cache.set(key, { value, expiresAt });
|
|
32
|
+
this.evictIfNeeded();
|
|
33
|
+
}
|
|
34
|
+
has(key) {
|
|
35
|
+
const entry = this.cache.get(key);
|
|
36
|
+
if (!entry)
|
|
37
|
+
return false;
|
|
38
|
+
if (Date.now() >= entry.expiresAt) {
|
|
39
|
+
this.cache.delete(key);
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
remove(key) {
|
|
45
|
+
return this.cache.delete(key);
|
|
46
|
+
}
|
|
47
|
+
clear() {
|
|
48
|
+
this.cache.clear();
|
|
49
|
+
}
|
|
50
|
+
size() {
|
|
51
|
+
this.cleanupExpired();
|
|
52
|
+
return this.cache.size;
|
|
53
|
+
}
|
|
54
|
+
evictIfNeeded() {
|
|
55
|
+
if (this.cache.size <= this.options.maxSize) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
// Remove expired entries first
|
|
59
|
+
this.cleanupExpired();
|
|
60
|
+
// If still over limit, remove oldest entries
|
|
61
|
+
if (this.cache.size > this.options.maxSize) {
|
|
62
|
+
const entries = Array.from(this.cache.entries())
|
|
63
|
+
.sort(([, a], [, b]) => a.expiresAt - b.expiresAt);
|
|
64
|
+
const toRemove = this.cache.size - this.options.maxSize;
|
|
65
|
+
for (let i = 0; i < toRemove; i++) {
|
|
66
|
+
this.cache.delete(entries[i][0]);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
cleanupExpired() {
|
|
71
|
+
const now = Date.now();
|
|
72
|
+
for (const [key, entry] of this.cache.entries()) {
|
|
73
|
+
if (now >= entry.expiresAt) {
|
|
74
|
+
this.cache.delete(key);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.SimpleCache = SimpleCache;
|
|
80
|
+
//# sourceMappingURL=simple-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simple-cache.js","sourceRoot":"","sources":["../../../src/media/utils/simple-cache.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@campxdev/server-shared",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.7",
|
|
4
4
|
"description": "Campx server shared files",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"license": "MIT",
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
"test:cov": "jest --coverage",
|
|
18
18
|
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
|
|
19
19
|
"test:e2e": "jest --config ./test/jest-e2e.json",
|
|
20
|
-
"local": "
|
|
21
|
-
"start": "
|
|
20
|
+
"local": "yarn build && yalc push",
|
|
21
|
+
"start": "yarn build && node dist/index.js"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"@aws-sdk/client-cloudfront": "^3.699.0",
|
|
@@ -27,6 +27,8 @@
|
|
|
27
27
|
"@aws-sdk/client-s3": "^3.490.0",
|
|
28
28
|
"@aws-sdk/client-secrets-manager": "^3.734.0",
|
|
29
29
|
"@aws-sdk/client-sqs": "^3.693.0",
|
|
30
|
+
"@aws-sdk/client-sts": "^3.490.0",
|
|
31
|
+
"@aws-sdk/s3-request-presigner": "^3.873.0",
|
|
30
32
|
"@azure/msal-node": "^3.6.3",
|
|
31
33
|
"@golevelup/nestjs-discovery": "^4.0.1",
|
|
32
34
|
"@microsoft/microsoft-graph-client": "^3.0.7",
|