@culturefy/shared 1.0.76 → 1.0.77
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/build/cjs/middlewares/withPermissionsMw.js +73 -0
- package/build/cjs/middlewares/withPermissionsMw.js.map +1 -0
- package/build/cjs/service/tokenMapping.service.js +3 -3
- package/build/cjs/service/tokenMapping.service.js.map +1 -1
- package/build/cjs/service/user.service.js +2 -2
- package/build/cjs/service/user.service.js.map +1 -1
- package/build/cjs/utils/cache.js +4 -1
- package/build/cjs/utils/cache.js.map +1 -1
- package/build/cjs/utils/secrets.js +89 -19
- package/build/cjs/utils/secrets.js.map +1 -1
- package/build/esm/middlewares/withPermissionsMw.js +68 -0
- package/build/esm/middlewares/withPermissionsMw.js.map +1 -0
- package/build/esm/service/tokenMapping.service.js +1 -1
- package/build/esm/service/tokenMapping.service.js.map +1 -1
- package/build/esm/service/user.service.js +1 -1
- package/build/esm/service/user.service.js.map +1 -1
- package/build/esm/utils/cache.js +5 -2
- package/build/esm/utils/cache.js.map +1 -1
- package/build/esm/utils/secrets.js +88 -19
- package/build/esm/utils/secrets.js.map +1 -1
- package/build/src/schema/location.model.d.ts +1 -1
- package/build/src/service/tokenMapping.service.d.ts +1 -1
- package/build/src/service/tokenMapping.service.js +9 -9
- package/build/src/service/tokenMapping.service.js.map +1 -1
- package/build/src/service/user.service.d.ts +1 -1
- package/build/src/service/user.service.js +2 -2
- package/build/src/service/user.service.js.map +1 -1
- package/build/src/types/location.d.ts +1 -1
- package/build/src/utils/cache.js +5 -1
- package/build/src/utils/cache.js.map +1 -1
- package/build/src/utils/secrets.d.ts +12 -4
- package/build/src/utils/secrets.js +91 -18
- package/build/src/utils/secrets.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenMapping.service.js","names":["Types","
|
|
1
|
+
{"version":3,"file":"tokenMapping.service.js","names":["Types","TokenMappingModel","Initializers","WithDb","TokenMappingService","_class","constructor","context","dbUrl","schema","getModel","connection","getConnection","Error","model","modelName","createTokenMapping","tokenMappingData","create","keycloakUserId","appId","userId","ObjectId","realmId","clientId","accessToken","refreshToken","expiresAt","getTokenMappingById","tokenMappingId","findById","getTokenMappingByUserId","findOne","getTokenMappingBy","object","filter","deleteTokenMapping","findByIdAndDelete","updateTokenMapping","findByIdAndUpdate","new","deleteTokenMappingBy","deleteMany","_applyDecoratedDescriptor","prototype","Object","getOwnPropertyDescriptor"],"sources":["../../../src/service/tokenMapping.service.ts"],"sourcesContent":["import { Types } from \"mongoose\";\nimport { InvocationContext } from \"@azure/functions\";\nimport { ITokenMapping, TokenMappingModel } from \"../models/tokenMapping.model\";\nimport { ICreateTokenMapping, IFilterTokenMapping } from \"../interfaces/tokenMapping\";\nimport { Initializers, WithDb } from \"../utils\";\n\nexport class TokenMappingService extends Initializers {\n\n private readonly schema = TokenMappingModel.schema;\n constructor(context: InvocationContext, dbUrl: string) {\n super(context, dbUrl);\n }\n\n private getModel() {\n const connection = (this as any).getConnection();\n if (!connection) {\n throw new Error('Database connection not established');\n }\n return connection.model(TokenMappingModel.modelName, this.schema);\n }\n\n @WithDb\n async createTokenMapping(tokenMappingData: ICreateTokenMapping): Promise<ITokenMapping> {\n return await this.getModel().create({\n keycloakUserId: tokenMappingData.keycloakUserId,\n appId: tokenMappingData.appId,\n userId: new Types.ObjectId(tokenMappingData.userId as string),\n realmId: tokenMappingData.realmId,\n clientId: tokenMappingData.clientId,\n accessToken: tokenMappingData.accessToken,\n refreshToken: tokenMappingData.refreshToken,\n expiresAt: tokenMappingData.expiresAt,\n });\n }\n\n @WithDb\n async getTokenMappingById(tokenMappingId: string): Promise<ITokenMapping | null> {\n return await this.getModel().findById(tokenMappingId);\n }\n\n @WithDb\n async getTokenMappingByUserId(userId: string): Promise<ITokenMapping | null> {\n return await this.getModel().findOne({ userId: new Types.ObjectId(userId) });\n }\n\n @WithDb\n async getTokenMappingBy(object: Partial<IFilterTokenMapping>): Promise<ITokenMapping | null> {\n let filter: any = {};\n if('keycloakUserId' in object) {\n filter.keycloakUserId = object.keycloakUserId;\n }\n if('userId' in object) {\n filter.userId = new Types.ObjectId(object.userId as string);\n }\n if('appId' in object) {\n filter.appId = object.appId;\n }\n if('realmId' in object) {\n filter.realmId = object.realmId;\n }\n if('clientId' in object) {\n filter.clientId = object.clientId;\n }\n if('expiresAt' in object) {\n filter.expiresAt = object.expiresAt;\n }\n return await this.getModel().findOne(filter);\n }\n\n @WithDb\n async deleteTokenMapping(tokenMappingId: string): Promise<void> {\n await this.getModel().findByIdAndDelete(tokenMappingId);\n }\n\n @WithDb\n async updateTokenMapping(tokenMappingId: string, tokenMappingData: Partial<IFilterTokenMapping>): Promise<ITokenMapping | null> {\n let filter: any = {};\n if('userId' in tokenMappingData) {\n filter.userId = new Types.ObjectId(tokenMappingData.userId as string);\n }\n if('appId' in tokenMappingData) {\n filter.appId = tokenMappingData.appId;\n }\n if('realmId' in tokenMappingData) {\n filter.realmId = tokenMappingData.realmId;\n }\n if('clientId' in tokenMappingData) {\n filter.clientId = tokenMappingData.clientId;\n }\n if('accessToken' in tokenMappingData) {\n filter.accessToken = tokenMappingData.accessToken;\n }\n if('refreshToken' in tokenMappingData) {\n filter.refreshToken = tokenMappingData.refreshToken;\n }\n if('expiresAt' in tokenMappingData) {\n filter.expiresAt = tokenMappingData.expiresAt;\n }\n return await this.getModel().findByIdAndUpdate(tokenMappingId, filter, { new: true });\n }\n\n @WithDb\n async deleteTokenMappingBy(object: Partial<IFilterTokenMapping>): Promise<void> {\n let filter: any = {};\n if('keycloakUserId' in object) {\n filter.keycloakUserId = object.keycloakUserId;\n }\n if('userId' in object) {\n filter.userId = new Types.ObjectId(object.userId as string);\n }\n if('appId' in object) {\n filter.appId = object.appId;\n }\n if('realmId' in object) {\n filter.realmId = object.realmId;\n }\n if('clientId' in object) {\n filter.clientId = object.clientId;\n }\n if('expiresAt' in object) {\n filter.expiresAt = object.expiresAt;\n }\n await this.getModel().deleteMany(filter);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.service.js","names":["Initializers","UserService","constructor","context","dbUrl"],"sources":["../../../src/service/user.service.ts"],"sourcesContent":["import { Types } from \"mongoose\";\nimport { InvocationContext } from \"@azure/functions\";\nimport
|
|
1
|
+
{"version":3,"file":"user.service.js","names":["Initializers","UserService","constructor","context","dbUrl"],"sources":["../../../src/service/user.service.ts"],"sourcesContent":["import { Types } from \"mongoose\";\nimport { InvocationContext } from \"@azure/functions\";\nimport { Initializers } from \"../utils\";\n\nexport class UserService extends Initializers {\n\n // private readonly schema = UserModel.schema;\n constructor(context: InvocationContext, dbUrl:string) {\n super(context, dbUrl);\n }\n\n // private getModel() {\n // const connection = (this as any).getConnection();\n // if (!connection) {\n // throw new Error('Database connection not established');\n // }\n // return connection.model(UserModel.modelName, this.schema);\n // }\n\n // @WithDb\n // async getUserById(userId: string): Promise<IUser | null> {\n // try {\n // let model = this.getModel();\n // this.context.log(\"UserId:\", JSON.stringify(userId));\n \n // // Handle both string and SchemaObjectId inputs\n // let objectId: Types.ObjectId;\n // if (typeof userId === 'string') {\n // objectId = new Types.ObjectId(userId);\n // } else {\n // // If it's already a SchemaObjectId, extract the string value\n // const userIdString = (userId as any).path || (userId as any).toString();\n // objectId = new Types.ObjectId(userIdString);\n // }\n \n // this.context.log(\"ObjectId:\", JSON.stringify(objectId));\n // const user = await model.findById(objectId);\n // this.context.log(\"User:\", JSON.stringify(user));\n // return user;\n // } catch (error) {\n // this.context.error(\"Error in getUserById\", error);\n // throw error;\n // }\n // }\n\n // @WithDb\n // async getUserByBusinessId(businessId: string, email: string): Promise<IUser | null> {\n // try {\n // let model = this.getModel();\n // this.context.log(\"BusinessId:\", JSON.stringify(businessId));\n // this.context.log(\"Email:\", JSON.stringify(email));\n\n // if(!businessId) return null;\n // if(!email) return null;\n\n // businessId = businessId.toLowerCase();\n // businessId = businessId.trim();\n\n // email = email.toLowerCase();\n // email = email.trim();\n\n // // Handle both string and SchemaObjectId inputs\n // let objectId: Types.ObjectId;\n // if (typeof businessId === 'string') {\n // objectId = new Types.ObjectId(businessId);\n // } else {\n // // If it's already a SchemaObjectId, extract the string value\n // const businessIdString = (businessId as any).path || (businessId as any).toString();\n // objectId = new Types.ObjectId(businessIdString);\n // }\n \n // this.context.log(\"ObjectId:\", JSON.stringify(objectId));\n // const user = await model.findOne({ businessId: objectId, email: email });\n // this.context.log(\"User:\", JSON.stringify(user));\n // return user;\n // } catch (error) {\n // this.context.error(\"Error in getUserByBusinessId\", error);\n // throw error;\n // }\n // }\n\n // @WithDb\n // async getUserByEmail(email: string) {\n // try {\n // let model = this.getModel();\n // this.context.log(\"Email:\", JSON.stringify(email));\n\n // email = email.toLowerCase();\n // email = email.trim();\n // const user = await model.findOne({ email: email });\n // this.context.log(\"User:\", JSON.stringify(user));\n // return user;\n // } catch (error) {\n // this.context.error(\"Error in getUserByEmail\", error);\n // throw error;\n // }\n // }\n}\n"],"mappings":"AAEA,SAASA,YAAY,QAAQ,UAAU;AAEvC,OAAO,MAAMC,WAAW,SAASD,YAAY,CAAC;EAE1C;EACAE,WAAWA,CAACC,OAA0B,EAAEC,KAAY,EAAE;IAClD,KAAK,CAACD,OAAO,EAAEC,KAAK,CAAC;EACzB;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;;EAEA;EACA;;EAEA;EACA;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACJ","ignoreList":[]}
|
package/build/esm/utils/cache.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import Redis from "ioredis";
|
|
2
2
|
import { AzureSecretKeysEnum } from "../enums";
|
|
3
|
-
import { getAzureVaultSecretByKey } from "./secrets";
|
|
3
|
+
import { getAzureVaultSecretByKey, registerSecretsRedis } from "./secrets";
|
|
4
4
|
let redis = null;
|
|
5
5
|
let redisOptionsCache = null;
|
|
6
6
|
let redisOptionsPromise = null;
|
|
@@ -55,7 +55,10 @@ export const getRedisClient = async ctx => {
|
|
|
55
55
|
const options = await buildRedisOptions(ctx);
|
|
56
56
|
redis = new Redis(options);
|
|
57
57
|
redis.on("error", err => ctx == null || ctx.error == null ? void 0 : ctx.error("Redis error", err));
|
|
58
|
-
redis.on("connect", () =>
|
|
58
|
+
redis.on("connect", () => {
|
|
59
|
+
registerSecretsRedis(redis);
|
|
60
|
+
ctx == null || ctx.info == null || ctx.info("Redis connected");
|
|
61
|
+
});
|
|
59
62
|
return redis;
|
|
60
63
|
};
|
|
61
64
|
const buildKey = (namespace, parts) => [namespace, ...parts.map(part => part != null ? part : "_")].join(":");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","names":["Redis","AzureSecretKeysEnum","getAzureVaultSecretByKey","redis","redisOptionsCache","redisOptionsPromise","resolveRedisConfig","ctx","vaultName","process","env","AZURE_KEY_VAULT_NAME","Error","redisHost","redisKey","redisPortSecret","Promise","all","REDIS_HOST","REDIS_KEY","REDIS_PORT","redisPort","Number","host","key","port","buildRedisOptions","password","tls","servername","maxRetriesPerRequest","enableReadyCheck","then","options","finally","getRedisClient","on","err","error","info","buildKey","namespace","parts","map","part","join","createCache","ttlSeconds","get","client","set","value","getOrSet","fetcher","cached","delete","del","Cacheable","_target","_propertyKey","descriptor","originalMethod","args","_options$getContext","getContext","context","keyParts","cache","apply"],"sources":["../../../src/utils/cache.ts"],"sourcesContent":["import Redis, { RedisOptions } from \"ioredis\";\nimport { InvocationContext } from \"@azure/functions\";\nimport { AzureSecretKeysEnum } from \"../enums\";\nimport { getAzureVaultSecretByKey } from \"./secrets\";\n\nlet redis: Redis | null = null;\nlet redisOptionsCache: RedisOptions | string | null = null;\nlet redisOptionsPromise: Promise<RedisOptions | string> | null = null;\n\ntype RedisConfig = {\n host: string;\n key: string;\n port: number;\n};\n\nconst resolveRedisConfig = async (\n ctx?: InvocationContext,\n): Promise<RedisConfig> => {\n const vaultName = process.env.AZURE_KEY_VAULT_NAME || \"\";\n if (!vaultName) {\n throw new Error(\"AZURE_KEY_VAULT_NAME is required to fetch Redis secrets\");\n }\n if (!ctx) {\n throw new Error(\"InvocationContext is required to fetch Redis secrets\");\n }\n\n const [redisHost, redisKey, redisPortSecret] = await Promise.all([\n getAzureVaultSecretByKey(ctx, vaultName, AzureSecretKeysEnum.REDIS_HOST),\n getAzureVaultSecretByKey(ctx, vaultName, AzureSecretKeysEnum.REDIS_KEY),\n getAzureVaultSecretByKey(ctx, vaultName, AzureSecretKeysEnum.REDIS_PORT),\n ]);\n\n const redisPort = redisPortSecret ? Number(redisPortSecret) : 6380;\n\n if (!redisHost || !redisKey) {\n throw new Error(\"Redis configuration missing in Key Vault\");\n }\n\n return {\n host: redisHost,\n key: redisKey,\n port: redisPort,\n };\n};\n\nconst buildRedisOptions = async (\n ctx?: InvocationContext,\n): Promise<RedisOptions | string> => {\n if (redisOptionsCache) return redisOptionsCache;\n if (redisOptionsPromise) return redisOptionsPromise;\n\n redisOptionsPromise = (async () => {\n const { host, key, port } = await resolveRedisConfig(ctx);\n\n return {\n host,\n port,\n password: key,\n tls: { servername: host },\n maxRetriesPerRequest: 3,\n enableReadyCheck: false,\n };\n })()\n .then((options) => {\n redisOptionsCache = options;\n return options;\n })\n .finally(() => {\n redisOptionsPromise = null;\n });\n\n return redisOptionsPromise;\n};\n\nexport const getRedisClient = async (ctx?: InvocationContext): Promise<Redis> => {\n if (redis) return redis;\n\n const options = await buildRedisOptions(ctx);\n\n redis = new Redis(options as RedisOptions);\n redis.on(\"error\", (err) => ctx?.error?.(\"Redis error\", err));\n redis.on(\"connect\", () => ctx?.info?.(\"Redis connected\"));\n return redis;\n};\n\nconst buildKey = (namespace: string, parts: Array<string | number | undefined>) =>\n [namespace, ...parts.map((part) => part ?? \"_\")].join(\":\");\n\nexport const createCache = (namespace: string, ttlSeconds: number) => {\n return {\n key: (...parts: Array<string | number | undefined>) =>\n buildKey(namespace, parts),\n get: async (\n ctx: InvocationContext | undefined,\n ...parts: Array<string | number | undefined>\n ) => {\n const client = await getRedisClient(ctx);\n try {\n return await client.get(buildKey(namespace, parts));\n } catch (error) {\n ctx?.error?.(\"Redis get failed\", error);\n return null;\n }\n },\n set: async (\n ctx: InvocationContext | undefined,\n value: string,\n ...parts: Array<string | number | undefined>\n ) => {\n const client = await getRedisClient(ctx);\n try {\n await client.set(buildKey(namespace, parts), value, \"EX\", ttlSeconds);\n } catch (error) {\n ctx?.error?.(\"Redis set failed\", error);\n }\n },\n getOrSet: async (\n ctx: InvocationContext | undefined,\n parts: Array<string | number | undefined>,\n fetcher: () => Promise<string>,\n ) => {\n const cached = await (async () => {\n const client = await getRedisClient(ctx);\n try {\n return await client.get(buildKey(namespace, parts));\n } catch (error) {\n ctx?.error?.(\"Redis get failed\", error);\n return null;\n }\n })();\n\n if (cached) return cached;\n const value = await fetcher();\n await (async () => {\n const client = await getRedisClient(ctx);\n try {\n await client.set(buildKey(namespace, parts), value, \"EX\", ttlSeconds);\n } catch (error) {\n ctx?.error?.(\"Redis set failed\", error);\n }\n })();\n return value;\n },\n delete: async (\n ctx: InvocationContext | undefined,\n ...parts: Array<string | number | undefined>\n ) => {\n const client = await getRedisClient(ctx);\n try {\n await client.del(buildKey(namespace, parts));\n } catch (error) {\n ctx?.error?.(\"Redis delete failed\", error);\n }\n },\n };\n};\n\ntype CacheableOptions<TArgs extends unknown[]> = {\n cache: ReturnType<typeof createCache>;\n key: (...args: TArgs) => Array<unknown>;\n getContext?: (instance: unknown) => InvocationContext | undefined;\n};\n\nexport const Cacheable = <TArgs extends unknown[]>(\n options: CacheableOptions<TArgs>,\n): MethodDecorator => {\n return (\n _target,\n _propertyKey,\n descriptor: PropertyDescriptor,\n ): void => {\n const originalMethod = descriptor.value as\n | ((...args: TArgs) => Promise<string>)\n | undefined;\n if (!originalMethod) return;\n descriptor.value = async function (...args: TArgs) {\n const ctx =\n options.getContext?.(this) ??\n (this as { context?: InvocationContext }).context;\n const keyParts = options.key(...args) as Array<string | number | undefined>;\n return options.cache.getOrSet(ctx, keyParts, () =>\n originalMethod.apply(this, args),\n );\n };\n };\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"cache.js","names":["Redis","AzureSecretKeysEnum","getAzureVaultSecretByKey","registerSecretsRedis","redis","redisOptionsCache","redisOptionsPromise","resolveRedisConfig","ctx","vaultName","process","env","AZURE_KEY_VAULT_NAME","Error","redisHost","redisKey","redisPortSecret","Promise","all","REDIS_HOST","REDIS_KEY","REDIS_PORT","redisPort","Number","host","key","port","buildRedisOptions","password","tls","servername","maxRetriesPerRequest","enableReadyCheck","then","options","finally","getRedisClient","on","err","error","info","buildKey","namespace","parts","map","part","join","createCache","ttlSeconds","get","client","set","value","getOrSet","fetcher","cached","delete","del","Cacheable","_target","_propertyKey","descriptor","originalMethod","args","_options$getContext","getContext","context","keyParts","cache","apply"],"sources":["../../../src/utils/cache.ts"],"sourcesContent":["import Redis, { RedisOptions } from \"ioredis\";\nimport { InvocationContext } from \"@azure/functions\";\nimport { AzureSecretKeysEnum } from \"../enums\";\nimport { getAzureVaultSecretByKey, registerSecretsRedis } from \"./secrets\";\n\nlet redis: Redis | null = null;\nlet redisOptionsCache: RedisOptions | string | null = null;\nlet redisOptionsPromise: Promise<RedisOptions | string> | null = null;\n\ntype RedisConfig = {\n host: string;\n key: string;\n port: number;\n};\n\nconst resolveRedisConfig = async (\n ctx?: InvocationContext,\n): Promise<RedisConfig> => {\n const vaultName = process.env.AZURE_KEY_VAULT_NAME || \"\";\n if (!vaultName) {\n throw new Error(\"AZURE_KEY_VAULT_NAME is required to fetch Redis secrets\");\n }\n if (!ctx) {\n throw new Error(\"InvocationContext is required to fetch Redis secrets\");\n }\n\n const [redisHost, redisKey, redisPortSecret] = await Promise.all([\n getAzureVaultSecretByKey(ctx, vaultName, AzureSecretKeysEnum.REDIS_HOST),\n getAzureVaultSecretByKey(ctx, vaultName, AzureSecretKeysEnum.REDIS_KEY),\n getAzureVaultSecretByKey(ctx, vaultName, AzureSecretKeysEnum.REDIS_PORT),\n ]);\n\n const redisPort = redisPortSecret ? Number(redisPortSecret) : 6380;\n\n if (!redisHost || !redisKey) {\n throw new Error(\"Redis configuration missing in Key Vault\");\n }\n\n return {\n host: redisHost,\n key: redisKey,\n port: redisPort,\n };\n};\n\nconst buildRedisOptions = async (\n ctx?: InvocationContext,\n): Promise<RedisOptions | string> => {\n if (redisOptionsCache) return redisOptionsCache;\n if (redisOptionsPromise) return redisOptionsPromise;\n\n redisOptionsPromise = (async () => {\n const { host, key, port } = await resolveRedisConfig(ctx);\n\n return {\n host,\n port,\n password: key,\n tls: { servername: host },\n maxRetriesPerRequest: 3,\n enableReadyCheck: false,\n };\n })()\n .then((options) => {\n redisOptionsCache = options;\n return options;\n })\n .finally(() => {\n redisOptionsPromise = null;\n });\n\n return redisOptionsPromise;\n};\n\nexport const getRedisClient = async (ctx?: InvocationContext): Promise<Redis> => {\n if (redis) return redis;\n\n const options = await buildRedisOptions(ctx);\n\n redis = new Redis(options as RedisOptions);\n redis.on(\"error\", (err) => ctx?.error?.(\"Redis error\", err));\n redis.on(\"connect\", () => {\n registerSecretsRedis(redis!);\n ctx?.info?.(\"Redis connected\");\n });\n return redis;\n};\n\nconst buildKey = (namespace: string, parts: Array<string | number | undefined>) =>\n [namespace, ...parts.map((part) => part ?? \"_\")].join(\":\");\n\nexport const createCache = (namespace: string, ttlSeconds: number) => {\n return {\n key: (...parts: Array<string | number | undefined>) =>\n buildKey(namespace, parts),\n get: async (\n ctx: InvocationContext | undefined,\n ...parts: Array<string | number | undefined>\n ) => {\n const client = await getRedisClient(ctx);\n try {\n return await client.get(buildKey(namespace, parts));\n } catch (error) {\n ctx?.error?.(\"Redis get failed\", error);\n return null;\n }\n },\n set: async (\n ctx: InvocationContext | undefined,\n value: string,\n ...parts: Array<string | number | undefined>\n ) => {\n const client = await getRedisClient(ctx);\n try {\n await client.set(buildKey(namespace, parts), value, \"EX\", ttlSeconds);\n } catch (error) {\n ctx?.error?.(\"Redis set failed\", error);\n }\n },\n getOrSet: async (\n ctx: InvocationContext | undefined,\n parts: Array<string | number | undefined>,\n fetcher: () => Promise<string>,\n ) => {\n const cached = await (async () => {\n const client = await getRedisClient(ctx);\n try {\n return await client.get(buildKey(namespace, parts));\n } catch (error) {\n ctx?.error?.(\"Redis get failed\", error);\n return null;\n }\n })();\n\n if (cached) return cached;\n const value = await fetcher();\n await (async () => {\n const client = await getRedisClient(ctx);\n try {\n await client.set(buildKey(namespace, parts), value, \"EX\", ttlSeconds);\n } catch (error) {\n ctx?.error?.(\"Redis set failed\", error);\n }\n })();\n return value;\n },\n delete: async (\n ctx: InvocationContext | undefined,\n ...parts: Array<string | number | undefined>\n ) => {\n const client = await getRedisClient(ctx);\n try {\n await client.del(buildKey(namespace, parts));\n } catch (error) {\n ctx?.error?.(\"Redis delete failed\", error);\n }\n },\n };\n};\n\ntype CacheableOptions<TArgs extends unknown[]> = {\n cache: ReturnType<typeof createCache>;\n key: (...args: TArgs) => Array<unknown>;\n getContext?: (instance: unknown) => InvocationContext | undefined;\n};\n\nexport const Cacheable = <TArgs extends unknown[]>(\n options: CacheableOptions<TArgs>,\n): MethodDecorator => {\n return (\n _target,\n _propertyKey,\n descriptor: PropertyDescriptor,\n ): void => {\n const originalMethod = descriptor.value as\n | ((...args: TArgs) => Promise<string>)\n | undefined;\n if (!originalMethod) return;\n descriptor.value = async function (...args: TArgs) {\n const ctx =\n options.getContext?.(this) ??\n (this as { context?: InvocationContext }).context;\n const keyParts = options.key(...args) as Array<string | number | undefined>;\n return options.cache.getOrSet(ctx, keyParts, () =>\n originalMethod.apply(this, args),\n );\n };\n };\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,37 +3,106 @@ import { SecretClient } from "@azure/keyvault-secrets";
|
|
|
3
3
|
import { AzureSecretKeysEnum } from "../enums";
|
|
4
4
|
import { enumMapper } from "./mapper";
|
|
5
5
|
|
|
6
|
+
// L1: in-memory cache — permanent for the lifetime of the Function host instance
|
|
7
|
+
const secretCache = new Map();
|
|
8
|
+
// Deduplicate concurrent in-flight fetches for the same key
|
|
9
|
+
const secretInflight = new Map();
|
|
10
|
+
|
|
11
|
+
// Singleton SecretClient per vault URL
|
|
12
|
+
const secretClients = new Map();
|
|
13
|
+
|
|
14
|
+
// L2: Redis cache — injected by cache.ts after Redis connects (avoids circular import)
|
|
15
|
+
const SECRET_REDIS_TTL = 60; // seconds
|
|
16
|
+
const SECRET_REDIS_NS = "kv-secret";
|
|
17
|
+
let _redis = null;
|
|
18
|
+
|
|
19
|
+
// These secrets are needed to bootstrap the Redis connection itself —
|
|
20
|
+
// they must never be looked up via Redis to prevent infinite recursion.
|
|
21
|
+
const BOOTSTRAP_KEYS = new Set([AzureSecretKeysEnum.REDIS_HOST, AzureSecretKeysEnum.REDIS_KEY, AzureSecretKeysEnum.REDIS_PORT]);
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Called by cache.ts after the Redis client successfully connects.
|
|
25
|
+
* Enables L2 Redis caching for Key Vault secrets without a circular import.
|
|
26
|
+
*/
|
|
27
|
+
export function registerSecretsRedis(client) {
|
|
28
|
+
_redis = client;
|
|
29
|
+
}
|
|
30
|
+
function getSecretClient(vaultName) {
|
|
31
|
+
const vaultUrl = `https://${vaultName}.vault.azure.net`;
|
|
32
|
+
if (!secretClients.has(vaultUrl)) {
|
|
33
|
+
secretClients.set(vaultUrl, new SecretClient(vaultUrl, new DefaultAzureCredential()));
|
|
34
|
+
}
|
|
35
|
+
return secretClients.get(vaultUrl);
|
|
36
|
+
}
|
|
37
|
+
|
|
6
38
|
/**
|
|
7
39
|
* Fetches a secret value from Azure Key Vault by key.
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
|
|
40
|
+
*
|
|
41
|
+
* Lookup order (fastest to slowest):
|
|
42
|
+
* L1 in-memory → L2 Redis (60s TTL) → Azure Key Vault
|
|
43
|
+
*
|
|
44
|
+
* Bootstrap secrets (REDIS_HOST/KEY/PORT) skip Redis to avoid circular calls.
|
|
45
|
+
*/
|
|
12
46
|
export async function getAzureVaultSecretByKey(context, vaultName, key) {
|
|
13
|
-
// Build the list of valid enum values once
|
|
14
47
|
const validKeys = enumMapper(AzureSecretKeysEnum);
|
|
15
|
-
|
|
16
|
-
// Validate
|
|
17
48
|
if (!validKeys.includes(key)) {
|
|
18
49
|
const msg = `Invalid secret key requested: ${key}`;
|
|
19
50
|
context.error(msg);
|
|
20
51
|
throw new Error(msg);
|
|
21
52
|
}
|
|
53
|
+
const cacheKey = `${vaultName}:${key}`;
|
|
22
54
|
|
|
23
|
-
//
|
|
24
|
-
const
|
|
55
|
+
// L1 — in-memory
|
|
56
|
+
const l1 = secretCache.get(cacheKey);
|
|
57
|
+
if (l1 !== undefined) return l1;
|
|
25
58
|
|
|
26
|
-
//
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
59
|
+
// L2 — Redis (skipped for bootstrap keys)
|
|
60
|
+
const useRedis = _redis !== null && !BOOTSTRAP_KEYS.has(key);
|
|
61
|
+
if (useRedis) {
|
|
62
|
+
try {
|
|
63
|
+
const l2 = await _redis.get(`${SECRET_REDIS_NS}:${cacheKey}`);
|
|
64
|
+
if (l2 !== null) {
|
|
65
|
+
secretCache.set(cacheKey, l2);
|
|
66
|
+
return l2;
|
|
67
|
+
}
|
|
68
|
+
} catch (err) {
|
|
69
|
+
context.warn == null || context.warn(`Redis L2 secret cache read failed for "${key}", falling through to Key Vault`, err);
|
|
70
|
+
}
|
|
36
71
|
}
|
|
72
|
+
|
|
73
|
+
// Deduplicate concurrent fetches for the same key
|
|
74
|
+
const inflight = secretInflight.get(cacheKey);
|
|
75
|
+
if (inflight) return inflight;
|
|
76
|
+
const fetchPromise = (async () => {
|
|
77
|
+
const client = getSecretClient(vaultName);
|
|
78
|
+
try {
|
|
79
|
+
var _secret$value;
|
|
80
|
+
const secret = await client.getSecret(key);
|
|
81
|
+
const value = (_secret$value = secret.value) != null ? _secret$value : "";
|
|
82
|
+
|
|
83
|
+
// Populate L1
|
|
84
|
+
secretCache.set(cacheKey, value);
|
|
85
|
+
|
|
86
|
+
// Populate L2 — re-check _redis at write time in case Redis connected
|
|
87
|
+
// during the Key Vault round-trip (cold-start race)
|
|
88
|
+
const redisForWrite = !BOOTSTRAP_KEYS.has(key) ? _redis : null;
|
|
89
|
+
if (redisForWrite) {
|
|
90
|
+
try {
|
|
91
|
+
await redisForWrite.set(`${SECRET_REDIS_NS}:${cacheKey}`, value, "EX", SECRET_REDIS_TTL);
|
|
92
|
+
} catch (err) {
|
|
93
|
+
context.warn == null || context.warn(`Redis L2 secret cache write failed for "${key}"`, err);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return value;
|
|
97
|
+
} catch (err) {
|
|
98
|
+
context.error(`Error fetching secret "${key}" from vault "${vaultName}"`, err);
|
|
99
|
+
throw new Error(`Failed to fetch secret "${key}": ${err.message}`);
|
|
100
|
+
} finally {
|
|
101
|
+
secretInflight.delete(cacheKey);
|
|
102
|
+
}
|
|
103
|
+
})();
|
|
104
|
+
secretInflight.set(cacheKey, fetchPromise);
|
|
105
|
+
return fetchPromise;
|
|
37
106
|
}
|
|
38
107
|
export async function getInterservicesCommunicationKey(context) {
|
|
39
108
|
var _process$env$INTERSER;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secrets.js","names":["DefaultAzureCredential","SecretClient","AzureSecretKeysEnum","enumMapper","
|
|
1
|
+
{"version":3,"file":"secrets.js","names":["DefaultAzureCredential","SecretClient","AzureSecretKeysEnum","enumMapper","secretCache","Map","secretInflight","secretClients","SECRET_REDIS_TTL","SECRET_REDIS_NS","_redis","BOOTSTRAP_KEYS","Set","REDIS_HOST","REDIS_KEY","REDIS_PORT","registerSecretsRedis","client","getSecretClient","vaultName","vaultUrl","has","set","get","getAzureVaultSecretByKey","context","key","validKeys","includes","msg","error","Error","cacheKey","l1","undefined","useRedis","l2","err","warn","inflight","fetchPromise","_secret$value","secret","getSecret","value","redisForWrite","message","delete","getInterservicesCommunicationKey","_process$env$INTERSER","localKey","process","env","INTERSERVICES_COMMUNICATION_KEY","trim","AZURE_KEY_VAULT_NAME"],"sources":["../../../src/utils/secrets.ts"],"sourcesContent":["import type Redis from \"ioredis\";\nimport { DefaultAzureCredential } from \"@azure/identity\";\nimport { SecretClient } from \"@azure/keyvault-secrets\";\nimport { InvocationContext } from \"@azure/functions\";\nimport { AzureSecretKeysEnum } from \"../enums\";\nimport { enumMapper } from \"./mapper\";\n\n// L1: in-memory cache — permanent for the lifetime of the Function host instance\nconst secretCache = new Map<string, string>();\n// Deduplicate concurrent in-flight fetches for the same key\nconst secretInflight = new Map<string, Promise<string>>();\n\n// Singleton SecretClient per vault URL\nconst secretClients = new Map<string, SecretClient>();\n\n// L2: Redis cache — injected by cache.ts after Redis connects (avoids circular import)\nconst SECRET_REDIS_TTL = 60; // seconds\nconst SECRET_REDIS_NS = \"kv-secret\";\nlet _redis: Redis | null = null;\n\n// These secrets are needed to bootstrap the Redis connection itself —\n// they must never be looked up via Redis to prevent infinite recursion.\nconst BOOTSTRAP_KEYS = new Set<AzureSecretKeysEnum>([\n AzureSecretKeysEnum.REDIS_HOST,\n AzureSecretKeysEnum.REDIS_KEY,\n AzureSecretKeysEnum.REDIS_PORT,\n]);\n\n/**\n * Called by cache.ts after the Redis client successfully connects.\n * Enables L2 Redis caching for Key Vault secrets without a circular import.\n */\nexport function registerSecretsRedis(client: Redis): void {\n _redis = client;\n}\n\nfunction getSecretClient(vaultName: string): SecretClient {\n const vaultUrl = `https://${vaultName}.vault.azure.net`;\n if (!secretClients.has(vaultUrl)) {\n secretClients.set(vaultUrl, new SecretClient(vaultUrl, new DefaultAzureCredential()));\n }\n return secretClients.get(vaultUrl)!;\n}\n\n/**\n * Fetches a secret value from Azure Key Vault by key.\n *\n * Lookup order (fastest to slowest):\n * L1 in-memory → L2 Redis (60s TTL) → Azure Key Vault\n *\n * Bootstrap secrets (REDIS_HOST/KEY/PORT) skip Redis to avoid circular calls.\n */\nexport async function getAzureVaultSecretByKey(\n context: InvocationContext,\n vaultName: string,\n key: AzureSecretKeysEnum\n): Promise<string> {\n const validKeys = enumMapper(AzureSecretKeysEnum);\n\n if (!validKeys.includes(key)) {\n const msg = `Invalid secret key requested: ${key}`;\n context.error(msg);\n throw new Error(msg);\n }\n\n const cacheKey = `${vaultName}:${key}`;\n\n // L1 — in-memory\n const l1 = secretCache.get(cacheKey);\n if (l1 !== undefined) return l1;\n\n // L2 — Redis (skipped for bootstrap keys)\n const useRedis = _redis !== null && !BOOTSTRAP_KEYS.has(key);\n if (useRedis) {\n try {\n const l2 = await _redis!.get(`${SECRET_REDIS_NS}:${cacheKey}`);\n if (l2 !== null) {\n secretCache.set(cacheKey, l2);\n return l2;\n }\n } catch (err) {\n context.warn?.(`Redis L2 secret cache read failed for \"${key}\", falling through to Key Vault`, err);\n }\n }\n\n // Deduplicate concurrent fetches for the same key\n const inflight = secretInflight.get(cacheKey);\n if (inflight) return inflight;\n\n const fetchPromise = (async () => {\n const client = getSecretClient(vaultName);\n try {\n const secret = await client.getSecret(key);\n const value = secret.value ?? \"\";\n\n // Populate L1\n secretCache.set(cacheKey, value);\n\n // Populate L2 — re-check _redis at write time in case Redis connected\n // during the Key Vault round-trip (cold-start race)\n const redisForWrite = !BOOTSTRAP_KEYS.has(key) ? _redis : null;\n if (redisForWrite) {\n try {\n await redisForWrite.set(`${SECRET_REDIS_NS}:${cacheKey}`, value, \"EX\", SECRET_REDIS_TTL);\n } catch (err) {\n context.warn?.(`Redis L2 secret cache write failed for \"${key}\"`, err);\n }\n }\n\n return value;\n } catch (err: any) {\n context.error(`Error fetching secret \"${key}\" from vault \"${vaultName}\"`, err);\n throw new Error(`Failed to fetch secret \"${key}\": ${err.message}`);\n } finally {\n secretInflight.delete(cacheKey);\n }\n })();\n\n secretInflight.set(cacheKey, fetchPromise);\n return fetchPromise;\n}\n\nexport async function getInterservicesCommunicationKey(\n context: InvocationContext\n): Promise<string> {\n const localKey = process.env.INTERSERVICES_COMMUNICATION_KEY?.trim();\n if (localKey) {\n return localKey;\n }\n\n const vaultName = process.env.AZURE_KEY_VAULT_NAME || \"\";\n if (!vaultName) {\n throw new Error(\"AZURE_KEY_VAULT_NAME is required to fetch interservices key\");\n }\n\n const key = await getAzureVaultSecretByKey(\n context,\n vaultName,\n AzureSecretKeysEnum.INTERSERVICES_COMMUNICATION_KEY\n );\n\n if (!key) {\n throw new Error(\"Interservices communication key not found\");\n }\n\n return key;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -20,7 +20,7 @@ export declare const LocationSchema: Schema<any, import("mongoose").Model<any, a
|
|
|
20
20
|
city?: string | null | undefined;
|
|
21
21
|
state?: string | null | undefined;
|
|
22
22
|
country?: string | null | undefined;
|
|
23
|
-
}>, {}, import("mongoose").
|
|
23
|
+
}>, {}, import("mongoose").MergeType<import("mongoose").DefaultSchemaOptions, {
|
|
24
24
|
_id: false;
|
|
25
25
|
}>> & import("mongoose").FlatRecord<{
|
|
26
26
|
type: GeoJSONObjectTypes;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { InvocationContext } from "@azure/functions";
|
|
2
|
-
import { Initializers } from "@culturefy/shared";
|
|
3
2
|
import { ITokenMapping } from "../models/tokenMapping.model";
|
|
4
3
|
import { ICreateTokenMapping, IFilterTokenMapping } from "../interfaces/tokenMapping";
|
|
4
|
+
import { Initializers } from "../utils";
|
|
5
5
|
export declare class TokenMappingService extends Initializers {
|
|
6
6
|
private readonly schema;
|
|
7
7
|
constructor(context: InvocationContext, dbUrl: string);
|
|
@@ -3,9 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.TokenMappingService = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const mongoose_1 = require("mongoose");
|
|
6
|
-
const shared_1 = require("@culturefy/shared");
|
|
7
6
|
const tokenMapping_model_1 = require("../models/tokenMapping.model");
|
|
8
|
-
|
|
7
|
+
const utils_1 = require("../utils");
|
|
8
|
+
class TokenMappingService extends utils_1.Initializers {
|
|
9
9
|
constructor(context, dbUrl) {
|
|
10
10
|
super(context, dbUrl);
|
|
11
11
|
this.schema = tokenMapping_model_1.TokenMappingModel.schema;
|
|
@@ -124,43 +124,43 @@ class TokenMappingService extends shared_1.Initializers {
|
|
|
124
124
|
}
|
|
125
125
|
exports.TokenMappingService = TokenMappingService;
|
|
126
126
|
tslib_1.__decorate([
|
|
127
|
-
|
|
127
|
+
utils_1.WithDb,
|
|
128
128
|
tslib_1.__metadata("design:type", Function),
|
|
129
129
|
tslib_1.__metadata("design:paramtypes", [Object]),
|
|
130
130
|
tslib_1.__metadata("design:returntype", Promise)
|
|
131
131
|
], TokenMappingService.prototype, "createTokenMapping", null);
|
|
132
132
|
tslib_1.__decorate([
|
|
133
|
-
|
|
133
|
+
utils_1.WithDb,
|
|
134
134
|
tslib_1.__metadata("design:type", Function),
|
|
135
135
|
tslib_1.__metadata("design:paramtypes", [String]),
|
|
136
136
|
tslib_1.__metadata("design:returntype", Promise)
|
|
137
137
|
], TokenMappingService.prototype, "getTokenMappingById", null);
|
|
138
138
|
tslib_1.__decorate([
|
|
139
|
-
|
|
139
|
+
utils_1.WithDb,
|
|
140
140
|
tslib_1.__metadata("design:type", Function),
|
|
141
141
|
tslib_1.__metadata("design:paramtypes", [String]),
|
|
142
142
|
tslib_1.__metadata("design:returntype", Promise)
|
|
143
143
|
], TokenMappingService.prototype, "getTokenMappingByUserId", null);
|
|
144
144
|
tslib_1.__decorate([
|
|
145
|
-
|
|
145
|
+
utils_1.WithDb,
|
|
146
146
|
tslib_1.__metadata("design:type", Function),
|
|
147
147
|
tslib_1.__metadata("design:paramtypes", [Object]),
|
|
148
148
|
tslib_1.__metadata("design:returntype", Promise)
|
|
149
149
|
], TokenMappingService.prototype, "getTokenMappingBy", null);
|
|
150
150
|
tslib_1.__decorate([
|
|
151
|
-
|
|
151
|
+
utils_1.WithDb,
|
|
152
152
|
tslib_1.__metadata("design:type", Function),
|
|
153
153
|
tslib_1.__metadata("design:paramtypes", [String]),
|
|
154
154
|
tslib_1.__metadata("design:returntype", Promise)
|
|
155
155
|
], TokenMappingService.prototype, "deleteTokenMapping", null);
|
|
156
156
|
tslib_1.__decorate([
|
|
157
|
-
|
|
157
|
+
utils_1.WithDb,
|
|
158
158
|
tslib_1.__metadata("design:type", Function),
|
|
159
159
|
tslib_1.__metadata("design:paramtypes", [String, Object]),
|
|
160
160
|
tslib_1.__metadata("design:returntype", Promise)
|
|
161
161
|
], TokenMappingService.prototype, "updateTokenMapping", null);
|
|
162
162
|
tslib_1.__decorate([
|
|
163
|
-
|
|
163
|
+
utils_1.WithDb,
|
|
164
164
|
tslib_1.__metadata("design:type", Function),
|
|
165
165
|
tslib_1.__metadata("design:paramtypes", [Object]),
|
|
166
166
|
tslib_1.__metadata("design:returntype", Promise)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenMapping.service.js","sourceRoot":"","sources":["../../../src/service/tokenMapping.service.ts"],"names":[],"mappings":";;;;AAAA,uCAAiC;AAEjC,
|
|
1
|
+
{"version":3,"file":"tokenMapping.service.js","sourceRoot":"","sources":["../../../src/service/tokenMapping.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.UserService = void 0;
|
|
4
|
-
const
|
|
5
|
-
class UserService extends
|
|
4
|
+
const utils_1 = require("../utils");
|
|
5
|
+
class UserService extends utils_1.Initializers {
|
|
6
6
|
// private readonly schema = UserModel.schema;
|
|
7
7
|
constructor(context, dbUrl) {
|
|
8
8
|
super(context, dbUrl);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.service.js","sourceRoot":"","sources":["../../../src/service/user.service.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"user.service.js","sourceRoot":"","sources":["../../../src/service/user.service.ts"],"names":[],"mappings":";;;AAEA,oCAAwC;AAExC,MAAa,WAAY,SAAQ,oBAAY;IAEzC,8CAA8C;IAC9C,YAAY,OAA0B,EAAE,KAAY;QAChD,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC1B,CAAC;CAwFJ;AA7FD,kCA6FC"}
|
|
@@ -20,7 +20,7 @@ export declare const LocationSchema: Schema<any, import("mongoose").Model<any, a
|
|
|
20
20
|
city?: string | null | undefined;
|
|
21
21
|
state?: string | null | undefined;
|
|
22
22
|
country?: string | null | undefined;
|
|
23
|
-
}>, {}, import("mongoose").
|
|
23
|
+
}>, {}, import("mongoose").MergeType<import("mongoose").DefaultSchemaOptions, {
|
|
24
24
|
_id: false;
|
|
25
25
|
}>> & import("mongoose").FlatRecord<{
|
|
26
26
|
type: GeoJSONObjectTypes;
|
package/build/src/utils/cache.js
CHANGED
|
@@ -62,7 +62,11 @@ const getRedisClient = (ctx) => tslib_1.__awaiter(void 0, void 0, void 0, functi
|
|
|
62
62
|
const options = yield buildRedisOptions(ctx);
|
|
63
63
|
redis = new ioredis_1.default(options);
|
|
64
64
|
redis.on("error", (err) => { var _a; return (_a = ctx === null || ctx === void 0 ? void 0 : ctx.error) === null || _a === void 0 ? void 0 : _a.call(ctx, "Redis error", err); });
|
|
65
|
-
redis.on("connect", () => {
|
|
65
|
+
redis.on("connect", () => {
|
|
66
|
+
var _a;
|
|
67
|
+
(0, secrets_1.registerSecretsRedis)(redis);
|
|
68
|
+
(_a = ctx === null || ctx === void 0 ? void 0 : ctx.info) === null || _a === void 0 ? void 0 : _a.call(ctx, "Redis connected");
|
|
69
|
+
});
|
|
66
70
|
return redis;
|
|
67
71
|
});
|
|
68
72
|
exports.getRedisClient = getRedisClient;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/utils/cache.ts"],"names":[],"mappings":";;;;AAAA,8DAA8C;AAE9C,oCAA+C;AAC/C,
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/utils/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,18 @@
|
|
|
1
|
+
import type Redis from "ioredis";
|
|
1
2
|
import { InvocationContext } from "@azure/functions";
|
|
2
3
|
import { AzureSecretKeysEnum } from "../enums";
|
|
4
|
+
/**
|
|
5
|
+
* Called by cache.ts after the Redis client successfully connects.
|
|
6
|
+
* Enables L2 Redis caching for Key Vault secrets without a circular import.
|
|
7
|
+
*/
|
|
8
|
+
export declare function registerSecretsRedis(client: Redis): void;
|
|
3
9
|
/**
|
|
4
10
|
* Fetches a secret value from Azure Key Vault by key.
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
|
|
11
|
+
*
|
|
12
|
+
* Lookup order (fastest to slowest):
|
|
13
|
+
* L1 in-memory → L2 Redis (60s TTL) → Azure Key Vault
|
|
14
|
+
*
|
|
15
|
+
* Bootstrap secrets (REDIS_HOST/KEY/PORT) skip Redis to avoid circular calls.
|
|
16
|
+
*/
|
|
9
17
|
export declare function getAzureVaultSecretByKey(context: InvocationContext, vaultName: string, key: AzureSecretKeysEnum): Promise<string>;
|
|
10
18
|
export declare function getInterservicesCommunicationKey(context: InvocationContext): Promise<string>;
|