@sixbell-telco/sdk
Version:
A collection of reusable components designed for use in Sixbell Telco Angular projects
1 lines • 23.4 kB
Source Map (JSON)
{"version":3,"file":"sixbell-telco-sdk-utils-runtime-config.mjs","sources":["../../../projects/sdk/utils/runtime-config/src/http-client.ts","../../../projects/sdk/utils/runtime-config/src/runtime-config-loader.ts","../../../projects/sdk/utils/runtime-config/src/runtime-config-store.ts","../../../projects/sdk/utils/runtime-config/src/runtime-update-adapter.ts","../../../projects/sdk/utils/runtime-config/sixbell-telco-sdk-utils-runtime-config.ts"],"sourcesContent":["export interface HttpClientOptions {\n\tretries?: number;\n\tretryDelayMs?: number;\n\ttimeoutMs?: number;\n}\n\nexport class RuntimeHttpClient {\n\tconstructor(private readonly options: HttpClientOptions = {}) {}\n\n\tasync fetch(url: string, init?: RequestInit): Promise<Response> {\n\t\tconst retries = this.options.retries ?? 0;\n\t\tconst retryDelayMs = this.options.retryDelayMs ?? 0;\n\t\tconst timeoutMs = this.options.timeoutMs ?? 0;\n\t\tlet lastError: Error | null = null;\n\n\t\tfor (let attempt = 0; attempt <= retries; attempt += 1) {\n\t\t\ttry {\n\t\t\t\treturn await this.attemptFetch(url, init, timeoutMs);\n\t\t\t} catch (error) {\n\t\t\t\tlastError = error instanceof Error ? error : new Error(String(error));\n\t\t\t\tif (attempt < retries && retryDelayMs > 0) {\n\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, retryDelayMs));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthrow lastError ?? new Error('Failed to fetch');\n\t}\n\n\tprivate async attemptFetch(url: string, init: RequestInit | undefined, timeoutMs: number): Promise<Response> {\n\t\tif (!timeoutMs || timeoutMs <= 0) {\n\t\t\tconst response = await fetch(url, init);\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(`HTTP ${response.status}: ${response.statusText}`);\n\t\t\t}\n\t\t\treturn response;\n\t\t}\n\n\t\tconst controller = new AbortController();\n\t\tconst timeoutHandle = setTimeout(() => controller.abort(), timeoutMs);\n\t\ttry {\n\t\t\tconst response = await fetch(url, {\n\t\t\t\t...init,\n\t\t\t\tsignal: controller.signal,\n\t\t\t});\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(`HTTP ${response.status}: ${response.statusText}`);\n\t\t\t}\n\t\t\treturn response;\n\t\t} finally {\n\t\t\tclearTimeout(timeoutHandle);\n\t\t}\n\t}\n}\n","import { RuntimeHttpClient } from './http-client';\nimport type { RuntimeConfigCheckResult, RuntimeConfigLoadResult, RuntimeConfigLoaderOptions, RuntimeConfigMeta } from './types';\n\nconst DEFAULT_RETRIES = 2;\nconst DEFAULT_RETRY_DELAY_MS = 400;\nconst DEFAULT_TIMEOUT_MS = 8000;\n\nexport class RuntimeConfigLoader<T> {\n\tprivate readonly httpClient: RuntimeHttpClient;\n\tprivate readonly parser: (response: Response) => Promise<T>;\n\tprivate readonly cacheKey: string;\n\n\tconstructor(\n\t\tprivate readonly configPath: string,\n\t\tprivate readonly options: RuntimeConfigLoaderOptions<T>,\n\t\tprivate readonly retries = DEFAULT_RETRIES,\n\t\tprivate readonly retryDelayMs = DEFAULT_RETRY_DELAY_MS,\n\t\tprivate readonly timeoutMs = DEFAULT_TIMEOUT_MS,\n\t) {\n\t\tthis.httpClient = new RuntimeHttpClient({\n\t\t\tretries: this.retries,\n\t\t\tretryDelayMs: this.retryDelayMs,\n\t\t\ttimeoutMs: this.timeoutMs,\n\t\t});\n\t\tthis.parser = options.parser ?? (async (response: Response) => (await response.json()) as T);\n\t\tthis.cacheKey = this.buildCacheKey();\n\t}\n\n\tasync loadLatest(): Promise<RuntimeConfigLoadResult<T>> {\n\t\tconst logger = this.options.logger;\n\t\tconst cached = await this.loadFromStore();\n\t\tif (cached) {\n\t\t\tlogger?.debug('Runtime config loaded from cache', {\n\t\t\t\tcomponent: 'RuntimeConfigLoader',\n\t\t\t\taction: 'loadLatest',\n\t\t\t\tresource: this.options.resource,\n\t\t\t\tconfigPath: this.configPath,\n\t\t\t\tmeta: cached.meta,\n\t\t\t});\n\t\t\treturn { ...cached, source: 'cache' };\n\t\t}\n\t\ttry {\n\t\t\tconst response = await this.fetchNoStore();\n\t\t\tconst data = await this.parser(response);\n\t\t\tconst meta = this.extractMeta(data);\n\t\t\tconst hash = await this.resolveHash(data, meta);\n\t\t\tconst result: RuntimeConfigLoadResult<T> = { data, meta, source: 'network', hash };\n\t\t\tawait this.storeResult(result);\n\t\t\tlogger?.debug('Runtime config loaded', {\n\t\t\t\tcomponent: 'RuntimeConfigLoader',\n\t\t\t\taction: 'loadLatest',\n\t\t\t\tresource: this.options.resource,\n\t\t\t\tconfigPath: this.configPath,\n\t\t\t\tmeta,\n\t\t\t});\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tlogger?.warn('Runtime config load failed, falling back', {\n\t\t\t\tcomponent: 'RuntimeConfigLoader',\n\t\t\t\taction: 'loadLatest',\n\t\t\t\tresource: this.options.resource,\n\t\t\t\tconfigPath: this.configPath,\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t});\n\t\t\tconst fallback = this.options.fallbackData;\n\t\t\ttry {\n\t\t\t\tconst meta = this.extractMeta(fallback);\n\t\t\t\tconst hash = await this.resolveHash(fallback, meta);\n\t\t\t\treturn { data: fallback, meta, source: 'fallback', hash };\n\t\t\t} catch {\n\t\t\t\treturn { data: fallback, meta: {}, source: 'fallback', hash: '' };\n\t\t\t}\n\t\t}\n\t}\n\n\tasync checkForUpdates(currentHash: string): Promise<RuntimeConfigCheckResult> {\n\t\ttry {\n\t\t\tconst response = await this.fetchNoStore();\n\t\t\tconst data = await this.parser(response);\n\t\t\tconst meta = this.extractMeta(data);\n\t\t\tconst hash = await this.resolveHash(data, meta);\n\t\t\treturn { updated: hash !== currentHash, meta, hash };\n\t\t} catch {\n\t\t\treturn { updated: false, meta: {}, hash: currentHash };\n\t\t}\n\t}\n\n\tasync refresh(): Promise<RuntimeConfigLoadResult<T>> {\n\t\tconst response = await this.fetchNoStore();\n\t\tconst data = await this.parser(response);\n\t\tconst meta = this.extractMeta(data);\n\t\tconst hash = await this.resolveHash(data, meta);\n\t\tconst result: RuntimeConfigLoadResult<T> = { data, meta, source: 'network', hash };\n\t\tawait this.storeResult(result);\n\t\treturn result;\n\t}\n\n\tprivate async loadFromStore(): Promise<RuntimeConfigLoadResult<T> | null> {\n\t\tif (!this.options.store) {\n\t\t\treturn null;\n\t\t}\n\t\tconst cached = await this.options.store.get(this.cacheKey);\n\t\tif (!cached) {\n\t\t\treturn null;\n\t\t}\n\t\tif (this.options.schemaVersion) {\n\t\t\tconst cachedSchema = cached.meta.schemaVersion;\n\t\t\tif (cachedSchema !== this.options.schemaVersion) {\n\t\t\t\tawait this.options.store.remove(this.cacheKey);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\treturn cached;\n\t}\n\n\tprivate async storeResult(result: RuntimeConfigLoadResult<T>): Promise<void> {\n\t\tif (!this.options.store) {\n\t\t\treturn;\n\t\t}\n\t\tawait this.options.store.set(this.cacheKey, result);\n\t}\n\n\tprivate extractMeta(data: T): RuntimeConfigMeta {\n\t\tconst meta = (data as { meta?: RuntimeConfigMeta }).meta;\n\t\tif (!meta?.hash) {\n\t\t\tthrow new Error('Runtime config missing required meta.hash');\n\t\t}\n\t\treturn meta;\n\t}\n\n\tprivate async resolveHash(data: T, meta: RuntimeConfigMeta): Promise<string> {\n\t\treturn meta.hash ?? this.hashValue(data);\n\t}\n\n\tprivate async hashValue(data: T): Promise<string> {\n\t\tconst value = JSON.stringify(data);\n\t\tif (typeof crypto?.subtle?.digest === 'function') {\n\t\t\tconst encoded = new TextEncoder().encode(value);\n\t\t\tconst buffer = await crypto.subtle.digest('SHA-256', encoded);\n\t\t\treturn this.bufferToHex(buffer);\n\t\t}\n\t\tlet hash = 0;\n\t\tfor (let i = 0; i < value.length; i += 1) {\n\t\t\thash = (hash * 31 + value.charCodeAt(i)) >>> 0;\n\t\t}\n\t\treturn `fallback-${hash.toString(16)}`;\n\t}\n\n\tprivate bufferToHex(buffer: ArrayBuffer): string {\n\t\tconst bytes = new Uint8Array(buffer);\n\t\tlet hex = '';\n\t\tfor (const byte of bytes) {\n\t\t\thex += byte.toString(16).padStart(2, '0');\n\t\t}\n\t\treturn hex;\n\t}\n\n\tprivate buildCacheKey(): string {\n\t\tconst prefix = this.options.appId ? `${this.options.appId}:` : '';\n\t\tconst schema = this.options.schemaVersion ? `:schema:${this.options.schemaVersion}` : '';\n\t\treturn `${prefix}${this.options.resource}:${this.configPath}${schema}`;\n\t}\n\n\tprivate async fetchNoStore(): Promise<Response> {\n\t\treturn this.httpClient.fetch(this.configPath, { cache: 'no-store' });\n\t}\n}\n","import Dexie, { Table } from 'dexie';\nimport type { RuntimeConfigLoadResult, RuntimeConfigStoreContract } from './types';\n\nconst DEFAULT_DB_NAME = 'sixbell-runtime-config';\n\ninterface RuntimeConfigRecord<T> {\n\tkey: string;\n\tpayload: RuntimeConfigLoadResult<T>;\n\tupdatedAt: number;\n}\n\nclass RuntimeConfigDexie<T> extends Dexie {\n\tconfigs!: Table<RuntimeConfigRecord<T>, string>;\n\n\tconstructor(dbName: string) {\n\t\tsuper(dbName);\n\t\tthis.version(1).stores({\n\t\t\tconfigs: 'key,updatedAt',\n\t\t});\n\t}\n}\n\nexport class RuntimeConfigStore<T> implements RuntimeConfigStoreContract<T> {\n\tprivate readonly db?: RuntimeConfigDexie<T>;\n\tprivate readonly fallbackStore = new Map<string, RuntimeConfigLoadResult<T>>();\n\n\tconstructor(\n\t\tprivate readonly cacheName: string,\n\t\tappId?: string,\n\t\tindexedDbName: string = DEFAULT_DB_NAME,\n\t) {\n\t\tconst resolvedDbName = appId ? `${DEFAULT_DB_NAME}:${appId}` : indexedDbName;\n\t\tif (typeof indexedDB === 'undefined') {\n\t\t\tthis.db = undefined;\n\t\t\treturn;\n\t\t}\n\t\tthis.db = new RuntimeConfigDexie<T>(resolvedDbName);\n\t}\n\n\tasync get(key: string): Promise<RuntimeConfigLoadResult<T> | null> {\n\t\tif (!this.db) {\n\t\t\treturn this.fallbackStore.get(key) ?? null;\n\t\t}\n\t\tconst entry = await this.db.configs.get(this.buildKey(key));\n\t\treturn entry?.payload ?? null;\n\t}\n\n\tasync set(key: string, value: RuntimeConfigLoadResult<T>): Promise<void> {\n\t\tif (!this.db) {\n\t\t\tthis.fallbackStore.set(key, value);\n\t\t\treturn;\n\t\t}\n\t\tawait this.db.configs.put({\n\t\t\tkey: this.buildKey(key),\n\t\t\tpayload: value,\n\t\t\tupdatedAt: Date.now(),\n\t\t});\n\t}\n\n\tasync remove(key: string): Promise<void> {\n\t\tif (!this.db) {\n\t\t\tthis.fallbackStore.delete(key);\n\t\t\treturn;\n\t\t}\n\t\tawait this.db.configs.delete(this.buildKey(key));\n\t}\n\n\tprivate buildKey(key: string): string {\n\t\treturn `${this.cacheName}:${key}`;\n\t}\n}\n","import type { Observable, Subscription } from 'rxjs';\nimport type { RuntimeUpdateAdapterOptions, RuntimeUpdateEvent, RuntimeUpdateSource } from './types';\n\nexport type RuntimeUpdateHandler = (event: RuntimeUpdateEvent, source: RuntimeUpdateSource) => void;\n\nexport class RuntimeUpdateAdapter {\n\tprivate eventSource?: EventSource;\n\tprivate streamSubscription?: Subscription;\n\n\tconstructor(private readonly handler: RuntimeUpdateHandler) {}\n\n\tconnectSse(url: string, options: RuntimeUpdateAdapterOptions): void {\n\t\tthis.disconnectSse();\n\t\tthis.eventSource = new EventSource(url, { withCredentials: options.withCredentials });\n\t\tconst eventType = options.eventType ?? 'message';\n\t\tthis.eventSource.addEventListener(eventType, (event) => {\n\t\t\tconst message = event as MessageEvent;\n\t\t\tconst parsed = this.parseMessage(message, options);\n\t\t\tif (parsed) {\n\t\t\t\tthis.handler(parsed, 'sse');\n\t\t\t}\n\t\t});\n\t\tif (this.eventSource) {\n\t\t\tthis.eventSource.onerror = null;\n\t\t}\n\t\tthis.eventSource.addEventListener('error', () => {\n\t\t\toptions.logger?.debug('Runtime update stream disconnected', {\n\t\t\t\tcomponent: 'RuntimeUpdateAdapter',\n\t\t\t\taction: 'connectSse',\n\t\t\t\turl,\n\t\t\t});\n\t\t});\n\t}\n\n\tconnectStream(stream: Observable<RuntimeUpdateEvent>): void {\n\t\tthis.disconnectStream();\n\t\tthis.streamSubscription = stream.subscribe((event) => {\n\t\t\tthis.handler(event, 'stream');\n\t\t});\n\t}\n\n\tdisconnect(): void {\n\t\tthis.disconnectSse();\n\t\tthis.disconnectStream();\n\t}\n\n\tprivate disconnectSse(): void {\n\t\tif (this.eventSource) {\n\t\t\tthis.eventSource.close();\n\t\t\tthis.eventSource = undefined;\n\t\t}\n\t}\n\n\tprivate disconnectStream(): void {\n\t\tthis.streamSubscription?.unsubscribe();\n\t\tthis.streamSubscription = undefined;\n\t}\n\n\tprivate parseMessage(event: MessageEvent, options: RuntimeUpdateAdapterOptions): RuntimeUpdateEvent | null {\n\t\tif (options.transform) {\n\t\t\treturn options.transform(event);\n\t\t}\n\t\tif (!event.data) {\n\t\t\treturn { resource: options.resource } as RuntimeUpdateEvent;\n\t\t}\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(event.data as string) as RuntimeUpdateEvent;\n\t\t\treturn parsed;\n\t\t} catch {\n\t\t\toptions.logger?.warn('Failed to parse runtime update event', {\n\t\t\t\tcomponent: 'RuntimeUpdateAdapter',\n\t\t\t\taction: 'parseMessage',\n\t\t\t});\n\t\t\treturn { resource: options.resource } as RuntimeUpdateEvent;\n\t\t}\n\t}\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}