service-call-library-dev 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1122 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +92 -0
- package/dist/index.d.ts +92 -0
- package/dist/index.js +1094 -0
- package/dist/index.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/logging/logger.service.ts","../src/utils/zookeeperConfig.ts","../src/utils/zookeeperCrypto.ts","../src/utils/zookeeper.ts","../src/index.ts","../src/inversify.container.ts","../src/configs/redis-client.ts","../src/modules/cache/cacheService.ts","../src/modules/cache/cacheController.ts","../src/inversify.types.ts","../src/types/cache.types.ts","../src/modules/sso/sso.controller.ts","../src/modules/sso/sso.service.ts","../src/service-call-library.ts"],"sourcesContent":["import winston from 'winston'\r\n\r\nexport class LoggerService {\r\n private static logger = winston.createLogger({\r\n level: process.env.LOG_LEVEL ?? 'info',\r\n format: winston.format.combine(\r\n winston.format.timestamp(),\r\n winston.format.errors({ stack: true }),\r\n winston.format.json()\r\n ),\r\n transports: [new winston.transports.Console()]\r\n })\r\n\r\n public static info(message: string, meta?: unknown): void {\r\n this.logger.info(message, meta)\r\n }\r\n\r\n public static error(message: string, meta?: unknown): void {\r\n this.logger.error(message, meta)\r\n }\r\n\r\n public static warn(message: string, meta?: unknown): void {\r\n this.logger.warn(message, meta)\r\n }\r\n\r\n public static debug(message: string, meta?: unknown): void {\r\n this.logger.debug(message, meta)\r\n }\r\n}\r\n","export interface ZooKeeperConfig {\r\n connectionString?: string\r\n infraPath?: string\r\n servicePath?: string\r\n user?: string\r\n password?: string\r\n}\r\n\r\nexport const getZooKeeperConfig = (): ZooKeeperConfig => {\r\n const config: ZooKeeperConfig = {\r\n connectionString: process.env.ZOOKEEPER_CONNECTION_STRING,\r\n infraPath: process.env.ZOOKEEPER_INFRA_PATH,\r\n servicePath: process.env.ZOOKEEPER_SERVICE_PATH,\r\n user: process.env.ZOOKEEPER_USER,\r\n password: process.env.ZOOKEEPER_PASSWORD\r\n }\r\n\r\n if (!config.connectionString) {\r\n throw new Error('ZOOKEEPER_CONNECTION_STRING is required')\r\n }\r\n\r\n return config\r\n}\r\n","import crypto from 'crypto'\r\nimport * as fs from 'fs'\r\nimport * as path from 'path'\r\nimport { LoggerService } from '../logging/logger.service'\r\n\r\nconst LOG_PREFIX = '[ZK] '\r\n\r\nexport interface EncryptedValue {\r\n prefix: string\r\n encryptedData: string\r\n alias: string\r\n}\r\n\r\nconst INFRA_VALUE_REGEX = /^devEnc:([A-Za-z0-9+/=_-]+):([A-Za-z0-9-_]+)$/\r\n\r\nexport const parseInfraValue = (value: string): EncryptedValue | null => {\r\n const match = value.match(INFRA_VALUE_REGEX)\r\n if (!match) return null\r\n\r\n return {\r\n prefix: 'devEnc',\r\n encryptedData: match[1] as string,\r\n alias: match[2] as string\r\n }\r\n}\r\n\r\nconst getPrivateKeyPath = (alias: string): string => {\r\n const baseDir =\r\n process.env.PRIVATE_KEY_DIR || path.join(process.cwd(), 'keys')\r\n return path.join(baseDir, `private_key_${alias}.pem`)\r\n}\r\n\r\nexport const decryptWithAlias = (encryptedData: string, alias: string): string => {\r\n try {\r\n const privateKeyPath = getPrivateKeyPath(alias)\r\n\r\n if (!fs.existsSync(privateKeyPath)) {\r\n throw new Error(`Private key file not found for alias '${alias}': ${privateKeyPath}`)\r\n }\r\n\r\n const privateKey = fs.readFileSync(privateKeyPath, 'utf8')\r\n const buffer = Buffer.from(encryptedData, 'base64')\r\n\r\n const attempts: Array<crypto.RsaPrivateKey> = [\r\n {\r\n key: privateKey,\r\n padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,\r\n oaepHash: 'sha256'\r\n },\r\n {\r\n key: privateKey,\r\n padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,\r\n oaepHash: 'sha1'\r\n },\r\n {\r\n key: privateKey,\r\n padding: crypto.constants.RSA_PKCS1_PADDING\r\n }\r\n ]\r\n\r\n let lastError: unknown = null\r\n\r\n for (const options of attempts) {\r\n try {\r\n const out = crypto.privateDecrypt(options, buffer)\r\n return out.toString('utf-8')\r\n } catch (error) {\r\n lastError = error\r\n }\r\n }\r\n\r\n LoggerService.error(`${LOG_PREFIX}RSA decryption failed with alias '${alias}'`, {\r\n error: lastError\r\n })\r\n\r\n throw new Error(`Decryption failed for alias '${alias}'`)\r\n } catch (error: any) {\r\n LoggerService.error(`${LOG_PREFIX}failed to decrypt with alias '${alias}'`, {\r\n error: error?.message || error\r\n })\r\n throw new Error(`Decryption failed for alias '${alias}': ${error.message}`)\r\n }\r\n}\r\n\r\nconst getServicePrivateKeyPath = (): string => {\r\n const baseDir =\r\n process.env.PRIVATE_KEY_DIR || path.join(process.cwd(), 'keys')\r\n return path.join(baseDir, 'private.pem')\r\n}\r\n\r\nexport const decryptWithPrivateKey = (encryptedData: string): string => {\r\n try {\r\n const privateKeyPath = getServicePrivateKeyPath()\r\n\r\n if (!fs.existsSync(privateKeyPath)) {\r\n throw new Error(`Private key file not found: ${privateKeyPath}`)\r\n }\r\n\r\n const privateKey = fs.readFileSync(privateKeyPath, 'utf8')\r\n const buffer = Buffer.from(encryptedData, 'base64')\r\n\r\n const attempts: Array<crypto.RsaPrivateKey> = [\r\n {\r\n key: privateKey,\r\n padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,\r\n oaepHash: 'sha256'\r\n },\r\n {\r\n key: privateKey,\r\n padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,\r\n oaepHash: 'sha1'\r\n },\r\n {\r\n key: privateKey,\r\n padding: crypto.constants.RSA_PKCS1_PADDING\r\n }\r\n ]\r\n\r\n let lastError: unknown = null\r\n\r\n for (const options of attempts) {\r\n try {\r\n const out = crypto.privateDecrypt(options, buffer)\r\n return out.toString('utf-8')\r\n } catch (error) {\r\n lastError = error\r\n }\r\n }\r\n\r\n LoggerService.error(`${LOG_PREFIX}RSA decryption failed with private.pem`, {\r\n error: lastError\r\n })\r\n\r\n throw new Error('All decryption attempts failed')\r\n } catch (error: any) {\r\n LoggerService.error(`${LOG_PREFIX}failed to decrypt with private.pem`, {\r\n error: error?.message || error\r\n })\r\n throw new Error(`Decryption failed: ${error.message}`)\r\n }\r\n}\r\n","// Simplified ZooKeeper Client Implementation\r\nimport zookeeper from 'node-zookeeper-client';\r\nimport * as process from 'node:process';\r\n\r\n// Import our modular components\r\nimport { getZooKeeperConfig } from './zookeeperConfig';\r\nimport {\r\n parseInfraValue,\r\n decryptWithAlias,\r\n decryptWithPrivateKey,\r\n} from './zookeeperCrypto';\r\n\r\nconst SESSION_TIMEOUT = 30000000;\r\nconst CONNECT_TIMEOUT = 10000000;\r\nconst LOG_PREFIX = '[ZK] ';\r\n\r\nlet isInfraDataBeingProcessed = false;\r\nlet isServiceDataBeingProcessed = false;\r\nlet hasLoadedInfraOnce = false;\r\nlet hasLoadedServiceOnce = false;\r\nlet currentClient: any | null = null;\r\nlet connectWatchdog: NodeJS.Timeout | null = null;\r\nlet hasInfraPath = false;\r\nlet hasServicePath = false;\r\n\r\nlet restartCallback: (() => Promise<void>) | null = null;\r\n\r\nexport const registerRestartCallback = (\r\n callback: () => Promise<void>,\r\n): void => {\r\n restartCallback = callback;\r\n};\r\n\r\nconst processEnvironmentData = (data: string, isInfraPath: boolean): void => {\r\n const pathType = isInfraPath ? 'infra' : 'service';\r\n const lines = data.split('\\n');\r\n let processedCount = 0;\r\n let encryptedCount = 0;\r\n let errorCount = 0;\r\n const errors: Array<{ key: string; error: string }> = [];\r\n\r\n for (const line of lines) {\r\n if (!line.trim()) continue;\r\n\r\n // Use the first '=' only to split key from the rest of the value\r\n const firstEqualIndex = line.indexOf('=');\r\n if (firstEqualIndex === -1) continue;\r\n\r\n const key = line.slice(0, firstEqualIndex).trim();\r\n const value = line.slice(firstEqualIndex + 1).trim();\r\n\r\n if (!key || value.length === 0) continue;\r\n\r\n try {\r\n // Check if the value matches the encrypted format\r\n if (value.startsWith('devEnc:') && isInfraPath) {\r\n encryptedCount++;\r\n let decryptedValue = decryptInfraValue(value);\r\n decryptedValue = decryptedValue.replace(/(\\r?\\n)$/, '');\r\n process.env[key] = decryptedValue;\r\n } else if (value.startsWith('devEnc:')) {\r\n encryptedCount++;\r\n let decryptedValue = decryptServiceValue(value);\r\n decryptedValue = decryptedValue.replace(/(\\r?\\n)$/, '');\r\n process.env[key] = decryptedValue;\r\n } else {\r\n process.env[key] = value;\r\n }\r\n\r\n processedCount++; \r\n } catch (error: any) {\r\n errorCount++;\r\n errors.push({\r\n key,\r\n error: error?.message || 'Unknown decryption error',\r\n });\r\n }\r\n }\r\n\r\n if (errorCount > 0) {\r\n console.log(\r\n JSON.stringify({\r\n type: 'ZK',\r\n message: `${LOG_PREFIX}errors processing environment variables`,\r\n pathType,\r\n processedCount,\r\n encryptedCount,\r\n errorCount,\r\n errors: errors.slice(0, 10),\r\n totalErrors: errors.length,\r\n timestamp: new Date().toISOString(),\r\n }),\r\n );\r\n }\r\n};\r\n\r\nconst decryptInfraValue = (value: string): string => {\r\n const encryptedValue = parseInfraValue(value);\r\n if (!encryptedValue) {\r\n throw new Error('Invalid encrypted value format');\r\n }\r\n const decryptedValue = decryptWithAlias(\r\n encryptedValue.encryptedData,\r\n encryptedValue.alias,\r\n );\r\n return decryptedValue;\r\n};\r\n\r\nconst decryptServiceValue = (value: string): string => {\r\n const cleanValue = value.replace('devEnc:', '');\r\n const encryptedValue = decryptWithPrivateKey(cleanValue);\r\n return encryptedValue;\r\n};\r\n\r\nconst handleZooKeeperData = (\r\n client: any,\r\n zkPath: string,\r\n isInfraPath: boolean,\r\n resolve: () => void,\r\n reject: (error: Error) => void,\r\n): void => {\r\n const pathType = isInfraPath ? 'infra' : 'service';\r\n const isBeingProcessed = isInfraPath\r\n ? isInfraDataBeingProcessed\r\n : isServiceDataBeingProcessed;\r\n if (isBeingProcessed) return;\r\n\r\n if (isInfraPath) {\r\n isInfraDataBeingProcessed = true;\r\n } else {\r\n isServiceDataBeingProcessed = true;\r\n }\r\n\r\n client.getData(\r\n zkPath,\r\n (event: any) => {\r\n if (event.type === zookeeper.Event.NODE_DATA_CHANGED) {\r\n console.log(\r\n JSON.stringify({\r\n type: 'ZK',\r\n message: `${LOG_PREFIX}Config changed detected, restarting application`,\r\n pathType: isInfraPath ? 'infra' : 'service',\r\n path: zkPath,\r\n timestamp: new Date().toISOString(),\r\n }),\r\n );\r\n\r\n if (restartCallback) {\r\n restartCallback().catch((error: any) => {\r\n console.log(\r\n JSON.stringify({\r\n type: 'ZK',\r\n message: `${LOG_PREFIX}Error during restart`,\r\n error: {\r\n message: error?.message || 'Unknown error',\r\n stack: error?.stack,\r\n },\r\n timestamp: new Date().toISOString(),\r\n }),\r\n );\r\n process.exit(0);\r\n });\r\n } else {\r\n console.log(\r\n JSON.stringify({\r\n type: 'ZK',\r\n message: `${LOG_PREFIX}No restart callback registered, exiting process`,\r\n timestamp: new Date().toISOString(),\r\n }),\r\n );\r\n process.exit(0);\r\n }\r\n }\r\n },\r\n (error: any, data: Buffer) => {\r\n if (isInfraPath) {\r\n isInfraDataBeingProcessed = false;\r\n } else {\r\n isServiceDataBeingProcessed = false;\r\n }\r\n\r\n if (error) {\r\n const errorMsg = `${LOG_PREFIX}getData failed for ${pathType} path: ${zkPath}`;\r\n console.log(\r\n JSON.stringify({\r\n type: 'ZK',\r\n message: errorMsg,\r\n pathType,\r\n path: zkPath,\r\n error: {\r\n message: error?.message || 'Unknown error',\r\n code: error?.code,\r\n name: error?.name,\r\n stack: error?.stack,\r\n errno: error?.errno,\r\n },\r\n timestamp: new Date().toISOString(),\r\n }),\r\n );\r\n reject(new Error(errorMsg));\r\n return;\r\n }\r\n\r\n if (!data) {\r\n reject(\r\n new Error(\r\n `${LOG_PREFIX}No data received for ${pathType} path: ${zkPath}`,\r\n ),\r\n );\r\n return;\r\n }\r\n\r\n try {\r\n const rawData = data.toString('utf8');\r\n processEnvironmentData(rawData, isInfraPath);\r\n\r\n if (isInfraPath) {\r\n hasInfraPath = true;\r\n } else {\r\n hasServicePath = true;\r\n }\r\n\r\n \r\n\r\n if (isInfraPath) {\r\n if (!hasLoadedInfraOnce) {\r\n hasLoadedInfraOnce = true;\r\n console.log(\r\n JSON.stringify({\r\n type: 'ZK',\r\n message: `${LOG_PREFIX}loaded infra environment variables`,\r\n path: zkPath,\r\n }),\r\n );\r\n }\r\n } else {\r\n if (!hasLoadedServiceOnce) {\r\n hasLoadedServiceOnce = true;\r\n console.log(\r\n JSON.stringify({\r\n type: 'ZK',\r\n message: `${LOG_PREFIX}loaded service environment variables`,\r\n path: zkPath,\r\n }),\r\n );\r\n }\r\n }\r\n\r\n if (hasInfraPath && hasServicePath) {\r\n resolve();\r\n }\r\n } catch (error: any) {\r\n const errorMsg = `${LOG_PREFIX}error processing data for ${pathType} path: ${zkPath}`;\r\n console.log(\r\n JSON.stringify({\r\n type: 'ZK',\r\n message: errorMsg,\r\n pathType,\r\n path: zkPath,\r\n error: {\r\n message: error?.message || 'Unknown error',\r\n code: error?.code,\r\n name: error?.name,\r\n stack: error?.stack,\r\n },\r\n timestamp: new Date().toISOString(),\r\n }),\r\n );\r\n reject(new Error(errorMsg));\r\n }\r\n },\r\n );\r\n};\r\n\r\nconst connectToPath = (\r\n client: any,\r\n zkPath: string,\r\n isInfraPath: boolean,\r\n resolve: () => void,\r\n reject: (error: Error) => void,\r\n): void => {\r\n const pathType = isInfraPath ? 'infra' : 'service';\r\n\r\n client.exists(\r\n zkPath,\r\n () => { }, \r\n (error: any, stat: any) => {\r\n if (error) {\r\n const errorMsg = `${LOG_PREFIX}exists check failed for ${pathType} path: ${zkPath}`;\r\n console.log(\r\n JSON.stringify({\r\n type: 'ZK',\r\n message: errorMsg,\r\n pathType,\r\n path: zkPath,\r\n error: {\r\n message: error?.message || 'Unknown error',\r\n code: error?.code,\r\n name: error?.name,\r\n stack: error?.stack,\r\n errno: error?.errno,\r\n },\r\n timestamp: new Date().toISOString(),\r\n }),\r\n );\r\n reject(new Error(errorMsg));\r\n return;\r\n }\r\n\r\n if (stat) {\r\n handleZooKeeperData(client, zkPath, isInfraPath, resolve, reject);\r\n } else {\r\n const errorMsg = `${LOG_PREFIX}path does not exist: ${zkPath}`;\r\n console.log(\r\n JSON.stringify({\r\n type: 'ZK',\r\n message: errorMsg,\r\n pathType,\r\n path: zkPath,\r\n timestamp: new Date().toISOString(),\r\n }),\r\n );\r\n reject(new Error(errorMsg));\r\n }\r\n },\r\n );\r\n};\r\n\r\nconst cleanupClient = (): void => {\r\n try {\r\n if (currentClient?.close) currentClient.close();\r\n } catch (e: any) {\r\n if (e?.message) {\r\n console.log(\r\n JSON.stringify({\r\n type: 'ZK',\r\n message: `${LOG_PREFIX}error closing client`,\r\n error: {\r\n message: e?.message,\r\n stack: e?.stack,\r\n },\r\n timestamp: new Date().toISOString(),\r\n }),\r\n );\r\n }\r\n }\r\n currentClient = null;\r\n if (connectWatchdog) {\r\n clearTimeout(connectWatchdog);\r\n connectWatchdog = null;\r\n }\r\n};\r\n\r\nconst startZooKeeperClient = (): Promise<void> => {\r\n return new Promise((resolve, reject) => {\r\n let resolved = false;\r\n const safeResolve = () => {\r\n if (!resolved) {\r\n resolved = true;\r\n resolve();\r\n }\r\n };\r\n\r\n try {\r\n const config = getZooKeeperConfig();\r\n console.log(\r\n JSON.stringify({\r\n type: 'ZK',\r\n message: `${LOG_PREFIX}initializing`,\r\n config: {\r\n connectionString: config.connectionString,\r\n infraPath: config.infraPath,\r\n servicePath: config.servicePath,\r\n hasAuth: !!(config.user && config.password),\r\n user: config.user || null,\r\n sessionTimeout: SESSION_TIMEOUT,\r\n },\r\n }),\r\n );\r\n\r\n cleanupClient();\r\n\r\n hasInfraPath = false;\r\n hasServicePath = false;\r\n hasLoadedInfraOnce = false;\r\n hasLoadedServiceOnce = false;\r\n isInfraDataBeingProcessed = false;\r\n isServiceDataBeingProcessed = false;\r\n\r\n const client = zookeeper.createClient(config.connectionString as string, {\r\n sessionTimeout: SESSION_TIMEOUT,\r\n retries: 0, // No retries - fail fast\r\n });\r\n currentClient = client;\r\n\r\n if (config.user && config.password) {\r\n client.addAuthInfo(\r\n 'digest',\r\n Buffer.from(`${config.user}:${config.password}`),\r\n );\r\n }\r\n\r\n connectWatchdog = setTimeout(() => {\r\n if (currentClient === client) {\r\n cleanupClient();\r\n const errorMsg = `${LOG_PREFIX}Connection timeout after ${CONNECT_TIMEOUT}ms`;\r\n console.log(\r\n JSON.stringify({\r\n type: 'ZK',\r\n message: errorMsg,\r\n config: {\r\n connectionString: config.connectionString,\r\n },\r\n timestamp: new Date().toISOString(),\r\n }),\r\n );\r\n reject(new Error(errorMsg));\r\n }\r\n }, CONNECT_TIMEOUT);\r\n\r\n \r\n client.on('connected', () => {\r\n console.log(\r\n JSON.stringify({\r\n type: 'ZK',\r\n message: `${LOG_PREFIX}connected`,\r\n config: {\r\n connectionString: config.connectionString,\r\n infraPath: config.infraPath,\r\n servicePath: config.servicePath,\r\n user: config.user,\r\n password: config.password,\r\n },\r\n }),\r\n );\r\n if (connectWatchdog) {\r\n clearTimeout(connectWatchdog);\r\n connectWatchdog = null;\r\n }\r\n\r\n connectToPath(client, config.infraPath as string, true, safeResolve, reject);\r\n connectToPath(client, config.servicePath as string, false, safeResolve, reject);\r\n });\r\n\r\n client.on('disconnected', () => {\r\n console.log(\r\n JSON.stringify({\r\n type: 'ZK',\r\n message: `${LOG_PREFIX}disconnected`,\r\n config: {\r\n connectionString: config.connectionString,\r\n },\r\n }),\r\n );\r\n cleanupClient();\r\n reject(new Error(`${LOG_PREFIX}Disconnected from ZooKeeper`));\r\n });\r\n\r\n client.on('expired', () => {\r\n console.log(\r\n JSON.stringify({\r\n type: 'ZK',\r\n message: `${LOG_PREFIX}session expired`,\r\n config: {\r\n connectionString: config.connectionString,\r\n },\r\n }),\r\n );\r\n cleanupClient();\r\n reject(new Error(`${LOG_PREFIX}ZooKeeper session expired`));\r\n });\r\n\r\n (client as any).on('error', (error: any) => {\r\n console.log(\r\n JSON.stringify({\r\n type: 'ZK',\r\n message: `${LOG_PREFIX}error`,\r\n error: {\r\n message: error?.message || 'Unknown error',\r\n code: error?.code,\r\n name: error?.name,\r\n stack: error?.stack,\r\n errno: error?.errno,\r\n syscall: error?.syscall,\r\n address: error?.address,\r\n port: error?.port,\r\n },\r\n config: {\r\n connectionString: config.connectionString,\r\n },\r\n timestamp: new Date().toISOString(),\r\n }),\r\n );\r\n\r\n cleanupClient();\r\n reject(\r\n new Error(\r\n `${LOG_PREFIX}ZooKeeper error: ${error?.message || 'Unknown error'}`,\r\n ),\r\n );\r\n });\r\n client.connect();\r\n } catch (error: any) {\r\n const config = getZooKeeperConfig();\r\n console.log(\r\n JSON.stringify({\r\n type: 'ZK',\r\n message: `${LOG_PREFIX}initialization failed`,\r\n error: {\r\n message: error?.message || 'Unknown error',\r\n code: error?.code,\r\n name: error?.name,\r\n stack: error?.stack,\r\n errno: error?.errno,\r\n syscall: error?.syscall,\r\n },\r\n config: {\r\n connectionString: config.connectionString,\r\n infraPath: config.infraPath,\r\n servicePath: config.servicePath,\r\n hasAuth: !!(config.user && config.password),\r\n },\r\n timestamp: new Date().toISOString(),\r\n }),\r\n );\r\n cleanupClient();\r\n reject(\r\n new Error(\r\n `${LOG_PREFIX}Initialization exception: ${error?.message || 'Unknown error'}`,\r\n ),\r\n );\r\n }\r\n });\r\n};\r\n\r\nexport default startZooKeeperClient;\r\n","import 'reflect-metadata'\r\n\r\nexport { ServiceCallLibrary } from './service-call-library'\r\nexport { TYPES } from './inversify.types'\r\n\r\nexport type { LibraryOptions } from './types/library.types'\r\nexport type { ScriptCacheRecordDTO, BinName } from './types/cache.types'\r\n","import { Container } from 'inversify'\r\nimport { CacheService } from './modules/cache/cacheService'\r\nimport { CacheController } from './modules/cache/cacheController'\r\nimport { SsoController } from './modules/sso/sso.controller'\r\nimport { TYPES } from './inversify.types'\r\nimport type { LibraryOptions } from './types/library.types'\r\nimport { SsoService } from './modules/sso/sso.service'\r\n\r\nexport function createContainer(_options: LibraryOptions = {}): Container {\r\n const container = new Container()\r\n\r\n container.bind<CacheService>(TYPES.CacheService).to(CacheService).inSingletonScope()\r\n container.bind<SsoService>(TYPES.SsoService).to(SsoService).inSingletonScope()\r\n container.bind<CacheController>(TYPES.CacheController).to(CacheController).inSingletonScope()\r\n container.bind<SsoController>(TYPES.SsoController).to(SsoController).inSingletonScope()\r\n\r\n return container\r\n}\r\n","import { createClient, type RedisClientType } from 'redis'\r\nimport { LoggerService } from '../logging/logger.service'\r\n\r\nclass RedisClient {\r\n private static instance: RedisClient\r\n private client: RedisClientType\r\n private reconnectAttempts = 0\r\n private readonly maxReconnectAttempts = 2\r\n private connectPromise: Promise<RedisClientType> | null = null\r\n\r\n private constructor() {\r\n this.client = createClient({\r\n socket: {\r\n host: process.env.REDIS_HOST ?? '127.0.0.1',\r\n port: Number(process.env.REDIS_PORT) || 6379,\r\n reconnectStrategy: (retries) => {\r\n this.reconnectAttempts = retries\r\n\r\n if (retries > this.maxReconnectAttempts) {\r\n LoggerService.error('Redis reconnect attempts exceeded', {\r\n retries,\r\n host: process.env.REDIS_HOST ?? '127.0.0.1',\r\n port: Number(process.env.REDIS_PORT) || 6379\r\n })\r\n\r\n return new Error('Redis reconnect attempts exceeded')\r\n }\r\n\r\n return 1000\r\n }\r\n },\r\n password: process.env.REDIS_PASSWORD || undefined\r\n })\r\n\r\n this.client.on('error', (err: Error) => {\r\n LoggerService.error('Redis error', {\r\n error: err?.message || err,\r\n reconnectAttempts: this.reconnectAttempts\r\n })\r\n })\r\n\r\n this.client.on('connect', () => {\r\n LoggerService.info('Redis connected', {\r\n host: process.env.REDIS_HOST ?? '127.0.0.1',\r\n port: Number(process.env.REDIS_PORT) || 6379\r\n })\r\n })\r\n }\r\n\r\n public static getInstance(): RedisClient {\r\n if (!RedisClient.instance) {\r\n RedisClient.instance = new RedisClient()\r\n }\r\n return RedisClient.instance\r\n }\r\n\r\n public async connect(): Promise<RedisClientType> {\r\n if (this.client.isOpen) {\r\n return this.client\r\n }\r\n\r\n if (!this.connectPromise) {\r\n this.connectPromise = this.client.connect().catch((err) => {\r\n LoggerService.error('Redis initial connect error', {\r\n error: err?.message || err\r\n })\r\n this.connectPromise = null\r\n throw err\r\n })\r\n }\r\n\r\n return await this.connectPromise\r\n }\r\n\r\n public getClient(): RedisClientType {\r\n return this.client\r\n }\r\n\r\n public async disconnect(): Promise<void> {\r\n if (this.client.isOpen) {\r\n await this.client.quit()\r\n LoggerService.info('Redis disconnected')\r\n }\r\n }\r\n\r\n public isConnected(): boolean {\r\n return this.client.isOpen\r\n }\r\n}\r\n\r\nexport default RedisClient.getInstance()","import type { RedisClientType } from 'redis'\r\nimport redisClient from '../../configs/redis-client'\r\nimport { injectable } from 'inversify'\r\n\r\ntype AtLeastOne<T> = [T, ...T[]]\r\n\r\n@injectable()\r\nexport class CacheService {\r\n private readonly client: RedisClientType\r\n\r\n constructor() {\r\n this.client = redisClient.getClient()\r\n }\r\n\r\n public async setValue<T>(\r\n key: string,\r\n value: T,\r\n ttlInSeconds?: number | null\r\n ): Promise<void | string> {\r\n const payload = JSON.stringify(value)\r\n\r\n if (ttlInSeconds && ttlInSeconds > 0) {\r\n await this.client.setEx(key, ttlInSeconds, payload)\r\n return\r\n }\r\n\r\n // Fix TS2322: handle null return and convert to undefined to match void return type\r\n const result = await this.client.set(key, payload)\r\n return result === null ? undefined : result\r\n }\r\n\r\n public async getValue<T = unknown>(key: string): Promise<T | null> {\r\n const result = await this.client.get(key)\r\n return result ? (JSON.parse(result) as T) : null\r\n }\r\n\r\n public async deleteValue(key: string): Promise<void> {\r\n await this.client.del(key)\r\n }\r\n\r\n public async hSet(key: string, hash: Record<string, string>): Promise<number> {\r\n return this.client.hSet(key, hash)\r\n }\r\n\r\n public async hmGet(\r\n key: string,\r\n ...fields: AtLeastOne<string>\r\n ): Promise<(string | null)[]> {\r\n return this.client.hmGet(key, fields as string[])\r\n }\r\n\r\n public async hGetAll(key: string): Promise<Record<string, string>> {\r\n return this.client.hGetAll(key)\r\n }\r\n\r\n public async expire(key: string, ttlSeconds: number): Promise<boolean> {\r\n return this.client.expire(key, ttlSeconds)\r\n }\r\n\r\n public async sAdd(key: string, ...members: AtLeastOne<string>): Promise<number> {\r\n return this.client.sAdd(key, members as string[])\r\n }\r\n\r\n public async sMembers(key: string): Promise<string[]> {\r\n return this.client.sMembers(key)\r\n }\r\n\r\n public async sRem(key: string, ...members: AtLeastOne<string>): Promise<number> {\r\n return this.client.sRem(key, members as string[])\r\n }\r\n\r\n public async sCard(key: string): Promise<number> {\r\n return this.client.sCard(key)\r\n }\r\n\r\n public async del(...keys: AtLeastOne<string>): Promise<number> {\r\n return this.client.del(keys as string[])\r\n }\r\n\r\n public multi(): ReturnType<RedisClientType['multi']> {\r\n return this.client.multi()\r\n }\r\n}\r\n","import { inject, injectable } from 'inversify'\r\nimport { TYPES } from '../../inversify.types'\r\nimport { CacheService } from './cacheService'\r\nimport {\r\n REQUIRED_BIN_NAMES,\r\n type BinName,\r\n type PutScriptRecordResult,\r\n type ScriptCacheRecordDTO\r\n} from '../../types/cache.types'\r\n\r\nconst SET_NAME_PREFIX = process.env.SCRIPT_SET_NAME_PREFIX ?? 'scriptSet'\r\nconst DUMMY_VALUE = 'DUMMY'\r\nconst DEFAULT_EXPIRE_TIME_MS = Number(\r\n process.env.SCRIPT_PUT_CACHE_EXPIRE_TIME_MS ?? 600_000\r\n)\r\n\r\n@injectable()\r\nexport class CacheController {\r\n constructor(\r\n @inject(TYPES.CacheService)\r\n private readonly cacheService: CacheService\r\n ) {}\r\n\r\n public async putScriptRecord(\r\n setName: string,\r\n key: string,\r\n record: ScriptCacheRecordDTO,\r\n ttlSeconds?: number\r\n ): Promise<PutScriptRecordResult> {\r\n for (const bin of REQUIRED_BIN_NAMES) {\r\n if (typeof record[bin] === 'undefined') {\r\n throw new Error(`Field ${bin} is required`)\r\n }\r\n }\r\n\r\n const safeRecord: Record<string, string> = {}\r\n\r\n for (const bin of REQUIRED_BIN_NAMES) {\r\n const value = record[bin]\r\n\r\n if (typeof value !== 'string') {\r\n throw new Error(`Invalid value for ${bin}`)\r\n }\r\n\r\n safeRecord[bin] = value\r\n }\r\n\r\n const redisKey = `${setName}:${key}`\r\n\r\n const ttl =\r\n typeof ttlSeconds === 'number'\r\n ? ttlSeconds\r\n : Math.floor(DEFAULT_EXPIRE_TIME_MS / 1000)\r\n\r\n const multi = this.cacheService.multi()\r\n const entries: [string, string][] = Object.entries(safeRecord)\r\n\r\n if (!entries.length) {\r\n throw new Error('No record found to store in Redis')\r\n }\r\n\r\n for (const [field, value] of entries) {\r\n multi.hSet(redisKey, field, value)\r\n }\r\n\r\n if (ttl > 0) {\r\n multi.expire(redisKey, ttl)\r\n }\r\n\r\n for (const bin of REQUIRED_BIN_NAMES) {\r\n const value = safeRecord[bin]\r\n if (value) {\r\n multi.sAdd(`index:${setName}:${bin}:${value}`, redisKey)\r\n }\r\n }\r\n\r\n multi.sAdd(`set:${setName}:keys`, redisKey)\r\n\r\n await multi.exec()\r\n\r\n return { redisKey, ttl }\r\n }\r\n\r\n public async getScriptRecord(\r\n setName: string,\r\n key: string\r\n ): Promise<Record<string, string | null> | null> {\r\n const redisKey = `${setName}:${key}`\r\n const values = await this.cacheService.hmGet(redisKey, ...REQUIRED_BIN_NAMES)\r\n\r\n if (!values || values.every((v) => v === null)) {\r\n return null\r\n }\r\n\r\n const record: Record<string, string | null> = {}\r\n\r\n REQUIRED_BIN_NAMES.forEach((bin, i) => {\r\n record[bin] = values[i]\r\n })\r\n\r\n return record\r\n }\r\n\r\n public async equalScriptRecordsWithIndex(\r\n setName: string,\r\n binName: BinName,\r\n value: string\r\n ): Promise<Array<{ redisKey: string; record: Record<string, string | null> }>> {\r\n const indexKey = this.buildIndexKey(setName, binName, value)\r\n const redisKeys = await this.cacheService.sMembers(indexKey)\r\n\r\n if (!redisKeys.length) {\r\n return []\r\n }\r\n\r\n const multi = this.cacheService.multi()\r\n\r\n for (const key of redisKeys) {\r\n multi.hGetAll(key)\r\n }\r\n\r\n // Fix TS2352: cast to unknown first\r\n const responses = (await multi.exec()) as unknown as Array<Record<string, string>>\r\n\r\n if (!responses) {\r\n throw new Error('Pipeline execution failed')\r\n }\r\n\r\n return responses.map((record, idx) => {\r\n const formattedRecord: Record<string, string | null> = {}\r\n\r\n REQUIRED_BIN_NAMES.forEach((bin) => {\r\n formattedRecord[bin] = record[bin] ?? null\r\n })\r\n\r\n return {\r\n redisKey: redisKeys[idx] as string,\r\n record: formattedRecord\r\n }\r\n })\r\n }\r\n\r\n public async countScriptRecordsWithIndex(\r\n setName: string,\r\n binName: BinName,\r\n value: string\r\n ): Promise<number> {\r\n return this.cacheService.sCard(this.buildIndexKey(setName, binName, value))\r\n }\r\n\r\n public async deleteScriptRecord(setName: string, key: string): Promise<boolean> {\r\n const redisKey = `${setName}:${key}`\r\n const hash = await this.cacheService.hGetAll(redisKey)\r\n\r\n if (!hash || !Object.keys(hash).length) {\r\n return false\r\n }\r\n\r\n const multi = this.cacheService.multi()\r\n\r\n multi.del(redisKey)\r\n\r\n for (const bin of REQUIRED_BIN_NAMES) {\r\n const value = hash[bin]\r\n if (value) {\r\n multi.sRem(this.buildIndexKey(setName, bin, value), redisKey)\r\n }\r\n }\r\n\r\n multi.sRem(`set:${setName}:keys`, redisKey)\r\n\r\n await multi.exec()\r\n\r\n return true\r\n }\r\n\r\n public async createBaseStructureForScript(totalSets = 5): Promise<void> {\r\n const multi = this.cacheService.multi()\r\n\r\n for (let s = 1; s <= totalSets; s++) {\r\n const setName = `${SET_NAME_PREFIX}${s}`\r\n const keyStr = `${setName}_key`\r\n const redisKey = `${setName}:${keyStr}`\r\n\r\n const hashMap: Record<string, string> = {}\r\n\r\n for (const bin of REQUIRED_BIN_NAMES) {\r\n hashMap[bin] = 'DUMMY'\r\n }\r\n\r\n for (const [field, val] of Object.entries(hashMap)) {\r\n multi.hSet(redisKey, field, val)\r\n }\r\n\r\n multi.sAdd(`set:${setName}:keys`, redisKey)\r\n\r\n for (const bin of REQUIRED_BIN_NAMES) {\r\n multi.sAdd(this.buildIndexKey(setName, bin, hashMap[bin] as string), redisKey)\r\n }\r\n }\r\n\r\n await multi.exec()\r\n }\r\n\r\n public async setValue<T>(\r\n key: string,\r\n value: T,\r\n ttlInSeconds?: number | null\r\n ): Promise<void | string> {\r\n return this.cacheService.setValue(key, value, ttlInSeconds)\r\n }\r\n\r\n public async getValue<T = unknown>(key: string): Promise<T | null> {\r\n return this.cacheService.getValue<T>(key)\r\n }\r\n\r\n public async deleteValue(key: string): Promise<void> {\r\n await this.cacheService.deleteValue(key)\r\n }\r\n\r\n private buildIndexKey(setName: string, binName: BinName, value: string): string {\r\n return `index:${setName}:${binName}:${value}`\r\n }\r\n}\r\n","export const TYPES = {\r\n CacheService: Symbol.for('CacheService'),\r\n CacheController: Symbol.for('CacheController'),\r\n SsoController: Symbol.for('SsoController'),\r\n SsoService: Symbol.for('SsoService'),\r\n}\r\n","export const REQUIRED_BIN_NAMES = ['bin1', 'bin2', 'bin3', 'bin4', 'bin5'] as const\r\n\r\nexport type BinName = (typeof REQUIRED_BIN_NAMES)[number]\r\n\r\nexport type ScriptCacheRecordDTO = Record<BinName, string>\r\n\r\nexport interface PutScriptRecordResult {\r\n redisKey: string\r\n ttl: number\r\n}\r\n\r\nexport interface ScriptRecordResult {\r\n [key: string]: string | null\r\n}\r\n","import { inject, injectable } from \"inversify\";\r\nimport { TYPES } from \"../../inversify.types\";\r\nimport { SsoService } from \"./sso.service\";\r\nimport { response } from \"./types\";\r\n\r\n\r\n@injectable()\r\nexport class SsoController {\r\n constructor(\r\n @inject(TYPES.SsoService) private ssoService: SsoService\r\n ) { }\r\n\r\n public async getUserByAccesstoken(AccessToken: string): Promise<response> {\r\n const getData = await this.ssoService.getUserByAccesstoken(AccessToken);\r\n return getData;\r\n }\r\n\r\n public async getUserByIdentity(identity: number | string, identityType: string): Promise<response> {\r\n return await this.ssoService.getUserByIdentity(identity, identityType);\r\n }\r\n}\r\n","import { injectable } from 'inversify';\r\nimport { response } from './types';\r\n\r\n@injectable()\r\nexport class SsoService {\r\n\r\n\r\n\r\n async getUserByAccesstoken(AccessToken: string): Promise<response> {\r\n let data: any = null;\r\n\r\n try {\r\n const response = await fetch(`${process.env.SsoUrl}/users`, {\r\n method: 'GET',\r\n headers: {\r\n 'accept': 'application/json',\r\n 'Accept-Language': 'en',\r\n 'Authorization': `Bearer ${AccessToken}`\r\n }\r\n });\r\n\r\n data = await response.json();\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`);\r\n }\r\n\r\n return {\r\n data,\r\n error: false,\r\n errorMessage: ''\r\n };\r\n\r\n } catch (error: any) {\r\n return {\r\n data, \r\n error: true,\r\n errorMessage: error.message\r\n };\r\n }\r\n }\r\n\r\n\r\n async getUserByIdentity(identity: number | string, identityType: string): Promise<response> {\r\n const url = `http://sso-sandbox.sandpod.ir/social/POD/users/${identity}?identityType=${identityType}`;\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: {\r\n 'accept': 'application/json',\r\n 'Accept-Language': 'en',\r\n 'Authorization': `Bearer ${process.env.AuthToken}`\r\n }\r\n });\r\n const data = JSON.parse(await response.text());\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status} and error is ${data}`);\r\n }\r\n\r\n return {\r\n data,\r\n error: false,\r\n errorMessage: ''\r\n }\r\n } catch (error) {\r\n return {\r\n data: null,\r\n error: true,\r\n errorMessage: error\r\n }\r\n }\r\n }\r\n}\r\n","import { Container } from 'inversify'\r\nimport { createContainer } from './inversify.container'\r\nimport { TYPES } from './inversify.types'\r\nimport { SsoController } from './modules/sso/sso.controller'\r\nimport { CacheController } from './modules/cache/cacheController'\r\nimport type { LibraryOptions } from './types/library.types'\r\nimport redisClient from './configs/redis-client'\r\n\r\nexport class ServiceCallLibrary {\r\n private readonly container: Container\r\n private readonly ssoController: SsoController\r\n private readonly cacheController: CacheController\r\n private ready: Promise<void> | null = null\r\n\r\n constructor(options: LibraryOptions = {}) {\r\n this.container = createContainer(options)\r\n this.ssoController = this.container.get<SsoController>(TYPES.SsoController)\r\n this.cacheController = this.container.get<CacheController>(TYPES.CacheController)\r\n }\r\n\r\n public async init(): Promise<void> {\r\n if (!this.ready) {\r\n this.ready = this.bootstrap()\r\n }\r\n\r\n await this.ready\r\n }\r\n\r\n private async bootstrap(): Promise<void> {\r\n await redisClient.connect()\r\n\r\n const { default: initZookeeper } = await import('./utils/zookeeper')\r\n await initZookeeper()\r\n }\r\n\r\n public get sso(): SsoController {\r\n return this.ssoController\r\n }\r\n\r\n public get cache(): CacheController {\r\n return this.cacheController\r\n }\r\n}\r\n"],"mappings":"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","names":["winston","crypto","process","LOG_PREFIX","zookeeper","error","import_inversify","import_inversify","import_inversify","import_inversify"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { RedisClientType } from 'redis';
|
|
2
|
+
|
|
3
|
+
type response = {
|
|
4
|
+
data: object | null;
|
|
5
|
+
error: boolean;
|
|
6
|
+
errorMessage: any;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
declare class SsoService {
|
|
10
|
+
getUserByAccesstoken(AccessToken: string): Promise<response>;
|
|
11
|
+
getUserByIdentity(identity: number | string, identityType: string): Promise<response>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
declare class SsoController {
|
|
15
|
+
private ssoService;
|
|
16
|
+
constructor(ssoService: SsoService);
|
|
17
|
+
getUserByAccesstoken(AccessToken: string): Promise<response>;
|
|
18
|
+
getUserByIdentity(identity: number | string, identityType: string): Promise<response>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
type AtLeastOne<T> = [T, ...T[]];
|
|
22
|
+
declare class CacheService {
|
|
23
|
+
private readonly client;
|
|
24
|
+
constructor();
|
|
25
|
+
setValue<T>(key: string, value: T, ttlInSeconds?: number | null): Promise<void | string>;
|
|
26
|
+
getValue<T = unknown>(key: string): Promise<T | null>;
|
|
27
|
+
deleteValue(key: string): Promise<void>;
|
|
28
|
+
hSet(key: string, hash: Record<string, string>): Promise<number>;
|
|
29
|
+
hmGet(key: string, ...fields: AtLeastOne<string>): Promise<(string | null)[]>;
|
|
30
|
+
hGetAll(key: string): Promise<Record<string, string>>;
|
|
31
|
+
expire(key: string, ttlSeconds: number): Promise<boolean>;
|
|
32
|
+
sAdd(key: string, ...members: AtLeastOne<string>): Promise<number>;
|
|
33
|
+
sMembers(key: string): Promise<string[]>;
|
|
34
|
+
sRem(key: string, ...members: AtLeastOne<string>): Promise<number>;
|
|
35
|
+
sCard(key: string): Promise<number>;
|
|
36
|
+
del(...keys: AtLeastOne<string>): Promise<number>;
|
|
37
|
+
multi(): ReturnType<RedisClientType['multi']>;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
declare const REQUIRED_BIN_NAMES: readonly ["bin1", "bin2", "bin3", "bin4", "bin5"];
|
|
41
|
+
type BinName = (typeof REQUIRED_BIN_NAMES)[number];
|
|
42
|
+
type ScriptCacheRecordDTO = Record<BinName, string>;
|
|
43
|
+
interface PutScriptRecordResult {
|
|
44
|
+
redisKey: string;
|
|
45
|
+
ttl: number;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
declare class CacheController {
|
|
49
|
+
private readonly cacheService;
|
|
50
|
+
constructor(cacheService: CacheService);
|
|
51
|
+
putScriptRecord(setName: string, key: string, record: ScriptCacheRecordDTO, ttlSeconds?: number): Promise<PutScriptRecordResult>;
|
|
52
|
+
getScriptRecord(setName: string, key: string): Promise<Record<string, string | null> | null>;
|
|
53
|
+
equalScriptRecordsWithIndex(setName: string, binName: BinName, value: string): Promise<Array<{
|
|
54
|
+
redisKey: string;
|
|
55
|
+
record: Record<string, string | null>;
|
|
56
|
+
}>>;
|
|
57
|
+
countScriptRecordsWithIndex(setName: string, binName: BinName, value: string): Promise<number>;
|
|
58
|
+
deleteScriptRecord(setName: string, key: string): Promise<boolean>;
|
|
59
|
+
createBaseStructureForScript(totalSets?: number): Promise<void>;
|
|
60
|
+
setValue<T>(key: string, value: T, ttlInSeconds?: number | null): Promise<void | string>;
|
|
61
|
+
getValue<T = unknown>(key: string): Promise<T | null>;
|
|
62
|
+
deleteValue(key: string): Promise<void>;
|
|
63
|
+
private buildIndexKey;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
declare enum LibraryMode {
|
|
67
|
+
STANDALONE = "STANDALONE"
|
|
68
|
+
}
|
|
69
|
+
interface LibraryOptions {
|
|
70
|
+
mode?: LibraryMode;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
declare class ServiceCallLibrary {
|
|
74
|
+
private readonly container;
|
|
75
|
+
private readonly ssoController;
|
|
76
|
+
private readonly cacheController;
|
|
77
|
+
private ready;
|
|
78
|
+
constructor(options?: LibraryOptions);
|
|
79
|
+
init(): Promise<void>;
|
|
80
|
+
private bootstrap;
|
|
81
|
+
get sso(): SsoController;
|
|
82
|
+
get cache(): CacheController;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
declare const TYPES: {
|
|
86
|
+
CacheService: symbol;
|
|
87
|
+
CacheController: symbol;
|
|
88
|
+
SsoController: symbol;
|
|
89
|
+
SsoService: symbol;
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
export { type BinName, type LibraryOptions, type ScriptCacheRecordDTO, ServiceCallLibrary, TYPES };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { RedisClientType } from 'redis';
|
|
2
|
+
|
|
3
|
+
type response = {
|
|
4
|
+
data: object | null;
|
|
5
|
+
error: boolean;
|
|
6
|
+
errorMessage: any;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
declare class SsoService {
|
|
10
|
+
getUserByAccesstoken(AccessToken: string): Promise<response>;
|
|
11
|
+
getUserByIdentity(identity: number | string, identityType: string): Promise<response>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
declare class SsoController {
|
|
15
|
+
private ssoService;
|
|
16
|
+
constructor(ssoService: SsoService);
|
|
17
|
+
getUserByAccesstoken(AccessToken: string): Promise<response>;
|
|
18
|
+
getUserByIdentity(identity: number | string, identityType: string): Promise<response>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
type AtLeastOne<T> = [T, ...T[]];
|
|
22
|
+
declare class CacheService {
|
|
23
|
+
private readonly client;
|
|
24
|
+
constructor();
|
|
25
|
+
setValue<T>(key: string, value: T, ttlInSeconds?: number | null): Promise<void | string>;
|
|
26
|
+
getValue<T = unknown>(key: string): Promise<T | null>;
|
|
27
|
+
deleteValue(key: string): Promise<void>;
|
|
28
|
+
hSet(key: string, hash: Record<string, string>): Promise<number>;
|
|
29
|
+
hmGet(key: string, ...fields: AtLeastOne<string>): Promise<(string | null)[]>;
|
|
30
|
+
hGetAll(key: string): Promise<Record<string, string>>;
|
|
31
|
+
expire(key: string, ttlSeconds: number): Promise<boolean>;
|
|
32
|
+
sAdd(key: string, ...members: AtLeastOne<string>): Promise<number>;
|
|
33
|
+
sMembers(key: string): Promise<string[]>;
|
|
34
|
+
sRem(key: string, ...members: AtLeastOne<string>): Promise<number>;
|
|
35
|
+
sCard(key: string): Promise<number>;
|
|
36
|
+
del(...keys: AtLeastOne<string>): Promise<number>;
|
|
37
|
+
multi(): ReturnType<RedisClientType['multi']>;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
declare const REQUIRED_BIN_NAMES: readonly ["bin1", "bin2", "bin3", "bin4", "bin5"];
|
|
41
|
+
type BinName = (typeof REQUIRED_BIN_NAMES)[number];
|
|
42
|
+
type ScriptCacheRecordDTO = Record<BinName, string>;
|
|
43
|
+
interface PutScriptRecordResult {
|
|
44
|
+
redisKey: string;
|
|
45
|
+
ttl: number;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
declare class CacheController {
|
|
49
|
+
private readonly cacheService;
|
|
50
|
+
constructor(cacheService: CacheService);
|
|
51
|
+
putScriptRecord(setName: string, key: string, record: ScriptCacheRecordDTO, ttlSeconds?: number): Promise<PutScriptRecordResult>;
|
|
52
|
+
getScriptRecord(setName: string, key: string): Promise<Record<string, string | null> | null>;
|
|
53
|
+
equalScriptRecordsWithIndex(setName: string, binName: BinName, value: string): Promise<Array<{
|
|
54
|
+
redisKey: string;
|
|
55
|
+
record: Record<string, string | null>;
|
|
56
|
+
}>>;
|
|
57
|
+
countScriptRecordsWithIndex(setName: string, binName: BinName, value: string): Promise<number>;
|
|
58
|
+
deleteScriptRecord(setName: string, key: string): Promise<boolean>;
|
|
59
|
+
createBaseStructureForScript(totalSets?: number): Promise<void>;
|
|
60
|
+
setValue<T>(key: string, value: T, ttlInSeconds?: number | null): Promise<void | string>;
|
|
61
|
+
getValue<T = unknown>(key: string): Promise<T | null>;
|
|
62
|
+
deleteValue(key: string): Promise<void>;
|
|
63
|
+
private buildIndexKey;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
declare enum LibraryMode {
|
|
67
|
+
STANDALONE = "STANDALONE"
|
|
68
|
+
}
|
|
69
|
+
interface LibraryOptions {
|
|
70
|
+
mode?: LibraryMode;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
declare class ServiceCallLibrary {
|
|
74
|
+
private readonly container;
|
|
75
|
+
private readonly ssoController;
|
|
76
|
+
private readonly cacheController;
|
|
77
|
+
private ready;
|
|
78
|
+
constructor(options?: LibraryOptions);
|
|
79
|
+
init(): Promise<void>;
|
|
80
|
+
private bootstrap;
|
|
81
|
+
get sso(): SsoController;
|
|
82
|
+
get cache(): CacheController;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
declare const TYPES: {
|
|
86
|
+
CacheService: symbol;
|
|
87
|
+
CacheController: symbol;
|
|
88
|
+
SsoController: symbol;
|
|
89
|
+
SsoService: symbol;
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
export { type BinName, type LibraryOptions, type ScriptCacheRecordDTO, ServiceCallLibrary, TYPES };
|