{"version":3,"file":"http-request-manager.mjs","sources":["../../../projects/http-request-manager/src/lib/services/local-storage-manager-service/models/storage-type.enum.ts","../../../projects/http-request-manager/src/lib/services/local-storage-manager-service/models/setting-options.model.ts","../../../projects/http-request-manager/src/lib/services/local-storage-manager-service/models/storage-option.model.ts","../../../projects/http-request-manager/src/lib/services/local-storage-manager-service/models/global-store-options.model.ts","../../../projects/http-request-manager/src/lib/services/local-storage-manager-service/models/storage-data.model.ts","../../../projects/http-request-manager/src/lib/services/utils/utils.service.ts","../../../projects/http-request-manager/src/lib/models/config-token.model.ts","../../../projects/http-request-manager/src/lib/models/retry-options.model.ts","../../../projects/http-request-manager/src/lib/services/request-manager-state-service/models/stream-type.enum.ts","../../../projects/http-request-manager/src/lib/services/request-manager-state-service/models/api-request.model.ts","../../../projects/http-request-manager/src/lib/services/request-manager-state-service/models/request-options.model.ts","../../../projects/http-request-manager/src/lib/services/request-manager-state-service/models/ws-options.model.ts","../../../projects/http-request-manager/src/lib/services/request-manager-state-service/models/operation-result.model.ts","../../../projects/http-request-manager/src/lib/services/request-manager-state-service/models/stream-config.model.ts","../../../projects/http-request-manager/src/lib/services/request-manager-state-service/models/stream-progress.model.ts","../../../projects/http-request-manager/src/lib/services/request-manager-state-service/models/stream-output.model.ts","../../../projects/http-request-manager/src/lib/services/request-manager-state-service/models/stream-event-metadata.model.ts","../../../projects/http-request-manager/src/lib/services/request-manager-state-service/models/stream-event.model.ts","../../../projects/http-request-manager/src/lib/services/request-manager-state-service/models/parsing-result.model.ts","../../../projects/http-request-manager/src/lib/models/config-http-options.model.ts","../../../projects/http-request-manager/src/lib/models/config-local-storage-options.model.ts","../../../projects/http-request-manager/src/lib/models/config-options.model.ts","../../../projects/http-request-manager/src/lib/services/utils/object-merger.service.ts","../../../projects/http-request-manager/src/lib/services/local-storage-manager-service/local-storage-manager.service.ts","../../../projects/http-request-manager/src/lib/services/utils/headers.service.ts","../../../projects/http-request-manager/src/lib/services/utils/path-query.service.ts","../../../projects/http-request-manager/src/lib/services/utils/random-color.utils.ts","../../../projects/http-request-manager/src/lib/services/utils/sync-observable.util.ts","../../../projects/http-request-manager/src/lib/services/utils/logger.service.ts","../../../projects/http-request-manager/src/lib/services/request-manager-services/rxjs-operators/request-streaming.ts","../../../projects/http-request-manager/src/lib/models/database-storage.model.ts","../../../projects/http-request-manager/src/lib/models/batch-options.model.ts","../../../projects/http-request-manager/src/lib/models/batch-result.model.ts","../../../projects/http-request-manager/src/lib/models/batch-request-state.model.ts","../../../projects/http-request-manager/src/lib/models/batch-progress.model.ts","../../../projects/http-request-manager/src/lib/models/data-type.enum.ts","../../../projects/http-request-manager/src/lib/models/upload-validation-error.model.ts","../../../projects/http-request-manager/src/lib/interceptors/models/error-settings.model.ts","../../../projects/http-request-manager/src/lib/interceptors/models/error-display-context.model.ts","../../../projects/http-request-manager/src/lib/services/request-manager-services/request.service.ts","../../../projects/http-request-manager/src/lib/services/request-manager-services/rxjs-operators/countdown.ts","../../../projects/http-request-manager/src/lib/services/request-manager-services/rxjs-operators/delay-retry.ts","../../../projects/http-request-manager/src/lib/services/request-manager-services/rxjs-operators/request-polling.ts","../../../projects/http-request-manager/src/lib/services/ws-manager-service/connection/websocket-manager.service.ts","../../../projects/http-request-manager/src/lib/services/ws-manager-service/messaging/message-tracker.service.ts","../../../projects/http-request-manager/src/lib/services/request-manager-services/http-manager.service.ts","../../../projects/http-request-manager/src/lib/services/ws-manager-service/models/channel-info.model.ts","../../../projects/http-request-manager/src/lib/services/ws-manager-service/models/ws-user.model.ts","../../../projects/http-request-manager/src/lib/services/ws-manager-service/models/communication-type.enum.ts","../../../projects/http-request-manager/src/lib/services/ws-manager-service/models/channel-type.enum.ts","../../../projects/http-request-manager/src/lib/services/ws-manager-service/models/state-message.model.ts","../../../projects/http-request-manager/src/lib/services/ws-manager-service/models/public-message.model.ts","../../../projects/http-request-manager/src/lib/services/ws-manager-service/models/notification-message.model.ts","../../../projects/http-request-manager/src/lib/services/database-manager-service/models/table-schema.ts","../../../projects/http-request-manager/src/lib/services/database-manager-service/db.storage.service.ts","../../../projects/http-request-manager/src/lib/services/database-manager-service/database.manager.service.ts","../../../projects/http-request-manager/src/lib/services/ws-manager-service/models/channel-message.model.ts","../../../projects/http-request-manager/src/lib/services/request-manager-state-service/http-manager-state.store.ts","../../../projects/http-request-manager/src/lib/services/ws-manager-service/messaging/websocket-message.service.ts","../../../projects/http-request-manager/src/lib/services/ws-manager-service/index.ts","../../../projects/http-request-manager/src/lib/services/store-state-manager-service/models/state-storage-options.model.ts","../../../projects/http-request-manager/src/lib/services/store-state-manager-service/models/state-operation-result.model.ts","../../../projects/http-request-manager/src/lib/services/store-state-manager-service/store-state-manager.service.ts","../../../projects/http-request-manager/src/lib/services/SQL-DixieJS service/models/sql-errors.model.ts","../../../projects/http-request-manager/src/lib/services/SQL-DixieJS service/core/sql-parser.ts","../../../projects/http-request-manager/src/lib/services/SQL-DixieJS service/core/schema-validator.ts","../../../projects/http-request-manager/src/lib/services/SQL-DixieJS service/models/execution-plan.model.ts","../../../projects/http-request-manager/src/lib/services/SQL-DixieJS service/core/query-planner.ts","../../../projects/http-request-manager/src/lib/services/SQL-DixieJS service/core/dexie-query-executor.ts","../../../projects/http-request-manager/src/lib/services/SQL-DixieJS service/dexie-sql.service.ts","../../../projects/http-request-manager/src/lib/services/index.ts","../../../projects/http-request-manager/src/lib/interceptors/credentials.interceptor.ts","../../../projects/http-request-manager/src/lib/interceptors/request-header.interceptor.ts","../../../projects/http-request-manager/src/lib/interceptors/request-error.interceptor.ts","../../../projects/http-request-manager/src/lib/interceptors/proxy-debugger.interceptor.ts","../../../projects/http-request-manager/src/lib/interceptors/functional-interceptors.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.html","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.html","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.html","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.ts","../../../projects/http-request-manager/src/lib/message-display/models/display-config.model.ts","../../../projects/http-request-manager/src/lib/message-display/models/display-rule.interface.ts","../../../projects/http-request-manager/src/lib/message-display/models/slide.model.ts","../../../projects/http-request-manager/src/lib/message-display/models/action.model.ts","../../../projects/http-request-manager/src/lib/message-display/models/communication-message.model.ts","../../../projects/http-request-manager/src/lib/message-display/rules/default-display-rules.ts","../../../projects/http-request-manager/src/lib/message-display/strategies/snackbar.strategy.ts","../../../projects/http-request-manager/src/lib/message-display/services/message-display-router.service.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.html","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.html","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.html","../../../projects/http-request-manager/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.html","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-ws-demo/models/oidc-client.model.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-ws-demo/services/state-service-demo.service.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-ws-demo/services/message-service-demo.service.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-ws-demo/services/notification-service-demo.service.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-ws-demo/models/user-data.model.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-ws-demo/components/services/state-data-request.service.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.html","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.html","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.html","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.html","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.html","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.html","../../../projects/http-request-manager/src/lib/http-request-services-demo/store-state-manager-demo/models/settings.model.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/store-state-manager-demo/services/settings-state.service.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/store-state-manager-demo/models/counter-state.model.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/store-state-manager-demo/services/counter-state.service.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/store-state-manager-demo/models/todo-list-state.model.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/store-state-manager-demo/services/todo-list-state.service.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.html","../../../projects/http-request-manager/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.html","../../../projects/http-request-manager/src/lib/http-request-services-demo/upload-demo/models/upload-state.model.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/upload-demo/upload-demo.component.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/upload-demo/upload-demo.component.html","../../../projects/http-request-manager/src/lib/http-request-services-demo/download-demo/models/download-queue-item.model.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/download-demo/download-demo.component.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/download-demo/download-demo.component.html","../../../projects/http-request-manager/src/lib/http-request-services-demo/http-request-services-demo.component.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/http-request-services-demo.component.html","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-info.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-mapper-client-info.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-ai-prompt.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.ts","../../../projects/http-request-manager/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.html","../../../projects/http-request-manager/src/lib/http-request-manager.module.ts","../../../projects/http-request-manager/src/public-api.ts","../../../projects/http-request-manager/src/http-request-manager.ts"],"sourcesContent":["export enum StorageType {\n  GLOBAL,\n  SESSION,\n  DB\n}\n","import { StorageType } from \"./storage-type.enum\"\n\nexport interface SettingOptionsInterface {\n  storage?: StorageType\n  expires?: number\n  expiresIn?: string\n  encrypted?: boolean\n}\n\nexport class SettingOptions implements SettingOptionsInterface {\n\n  constructor(\n    public storage?: StorageType,\n    public expires?: number,\n    public expiresIn?: string,\n    public encrypted?: boolean,\n  ) {}\n\n  static adapt(item?: any): SettingOptions {\n\n    const storage = (typeof item?.storage !== 'undefined' && item?.storage !== null) ? Number(item.storage) : StorageType.GLOBAL;\n    const expires = (typeof item?.expires !== 'undefined' && item?.expires !== null) ? Number(item.expires) : 0;\n    const expiresIn = (typeof item?.expiresIn !== 'undefined' && item?.expiresIn !== null) ? item.expiresIn : '';\n    const encrypted = (typeof item?.encrypted !== 'undefined' && item?.encrypted !== null) ? Boolean(item.encrypted) : false;\n\n    return new SettingOptions(\n      storage,\n      expires,\n      expiresIn,\n      encrypted,\n    )\n\n  }\n\n}\n","import { SettingOptions } from \"./setting-options.model\"\nimport { StorageType } from \"./storage-type.enum\"\n\nexport interface StorageOptionInterface {\n  id?: string\n  name: string\n  data?: any\n  options?: SettingOptions\n}\n\nexport class StorageOption implements StorageOptionInterface {\n\n  constructor(\n    public id?: string,\n    public name: string = 'untitled',\n    public data?: any,\n    public options?: SettingOptions,\n  ) {}\n\n  static deriveStableId(name: string, storage?: StorageType): string {\n    const key = `${name}:${storage ?? StorageType.GLOBAL}`\n    let hash = 5381\n    for (let i = 0; i < key.length; i++) {\n      hash = ((hash << 5) + hash + key.charCodeAt(i)) >>> 0\n    }\n    return 'sid-' + hash.toString(36)\n  }\n\n  static adapt(item?: any): StorageOption {\n\n    const name = (item?.name) ? item.name.toLowerCase() : 'untitled'\n    const options = (item?.options) ? SettingOptions.adapt(item.options) : SettingOptions.adapt()\n\n    return new StorageOption(\n      (item?.id) ? item.id : StorageOption.deriveStableId(name, options.storage),\n      name,\n      item?.data,\n      options,\n    )\n\n  }\n\n}\n\n\n","import { StorageOption } from \"./storage-option.model\"\n\nexport interface GlobalStoreOptionsInterface {\n  encryption?: boolean\n  expiresIn?: string\n  expires?: number\n  stores: StorageOption[]|null\n}\n\nexport class GlobalStoreOptions implements GlobalStoreOptionsInterface {\n\n  constructor(\n    public encryption = false,\n    public expiresIn?: string,\n    public expires?: number,\n    public stores: StorageOption[]|null = [],\n  ) {}\n\n  static adapt(item?: any): GlobalStoreOptions {\n\n    return new GlobalStoreOptions(\n      (item?.encryption) ? item.encryption : false,\n      (item?.expiresIn) ? item.expiresIn : '',\n      (item?.expires) ? item.expires : 0,\n      (item?.stores) ? item.stores.map((item: any) => StorageOption.adapt(item)) : []\n    )\n\n  }\n\n}\n","export interface StorageDataInterface {\n  id?: string\n  data?: any\n}\n\nexport class StorageData implements StorageDataInterface {\n\n  constructor(\n    public id?: string,\n    public data?: any,\n  ) {}\n\n  static adapt(item?: any): StorageData {\n\n    return new StorageData(\n      (item?.id) ? item.id : crypto.randomUUID(),\n      (item?.data) ? item.data : null\n    )\n\n  }\n\n}\n\n\n","\nimport { HttpClient } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class UtilsService {\n\n  http = inject(HttpClient)\n\n  constructor() { }\n\n  isString(x: string | number) {\n    return Object.prototype.toString.call(x) === '[object String]'\n  }\n\n  isObject(obj: any) {\n    return Object.prototype.toString.call(obj) === '[object Object]'\n  }\n\n  JSONToString(value: any) {\n    return (this.isObject(value)) ? JSON.stringify(value) : value\n  }\n\n  stringToJSON(value: string) {\n    return (this.isJSON(value)) ? JSON.parse(value) : value\n  }\n\n  isJSON(str: any) {\n    try {\n      JSON.parse(str)\n    } catch (e) {\n      return false\n    }\n    return true\n  }\n\n  getValueByProp(obj: any, prop: string) {\n    if (typeof obj === 'undefined' || obj === null) return false\n    return obj[prop]\n  }\n\n  objectsEqual(x: any, y: any, seen = new Set()): boolean {\n    const ok = Object.keys, tx = typeof x, ty = typeof y\n\n    if (!(x && y && tx === 'object' && tx === ty)) return x === y\n\n    // Cycle guard: a back-edge to an already-visited object is treated as equal so that\n    // circular structures compare without recursing forever (design.md item 9).\n    if (seen.has(x) || seen.has(y)) return true\n    seen.add(x)\n    seen.add(y)\n\n    return ok(x).length === ok(y).length &&\n      ok(x).every((key: any) => this.objectsEqual(x[key], y[key], seen))\n  }\n\n  getJSON(file: string) {\n    return this.http.get(`assets/data/${file}`)\n  }\n\n  get today() {\n    return Math.floor(Date.now() / 1000)\n  }\n\n  base32ToHex(base32: string): string {\n\n    const base32chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567\"\n\n    const charToValue = (char: string) => base32chars.indexOf(char.toUpperCase())\n\n    let bits = ''\n    let hex = ''\n\n    for (let i = 0; i < base32.length; i++) {\n      const char = base32.charAt(i)\n      if (char === '=') continue // strip RFC 4648 '=' padding (design.md item 4)\n      const val = charToValue(char)\n      if (val === -1) continue // skip any other non-alphabet characters\n      bits += val.toString(2).padStart(5, '0')\n    }\n\n    for (let i = 0; i + 4 <= bits.length; i += 4) {\n      const chunk = bits.substr(i, 4)\n      hex += parseInt(chunk, 2).toString(16)\n    }\n\n    return hex.toUpperCase()\n  }\n\n  binaryToHex(binary: string): string {\n    let hex = '';\n    for (let i = 0; i < binary.length; i += 8) {\n      const byte = binary.substr(i, 8);\n      const decimal = parseInt(byte, 2);\n      hex += decimal.toString(16).padStart(2, '0');\n    }\n    return hex.padStart(32, '0');\n  }\n\n  // y = years, m = months, w = weeks, d = days, hr = hours, mn = minutes else seconds\n  // returns epoch time corresponding to the expiry type\n  expires(str?: string) {\n\n    if(!str) return undefined\n\n    const match = str.match(/[^0-9]+$/)\n\n    let type: any = (match) ? str.slice(-match[0].length).toLowerCase() : 0\n    if (type === 'hrs') type = 'hr' // plural forms (design.md item 10)\n    if (type === 'mins') type = 'mn'\n\n    const now = Math.floor(new Date().getTime() / 1000)\n\n    let value = 0;\n\n    switch (type) {\n      case\n      'y':\n        const years = parseInt(str.slice(0, -1))\n        const dateY = new Date()\n        dateY.setFullYear(dateY.getFullYear() + years, 0, 1)\n        dateY.setHours(0, 0, 0, 0)\n        value = Math.floor(dateY.getTime() / 1000)\n        break;\n      case\n      'm':\n        const months = parseInt(str.slice(0, -1))\n        const dateM = new Date()\n        dateM.setMonth(dateM.getMonth() + months, 1)\n        dateM.setHours(0, 0, 0, 0)\n        value = Math.floor(dateM.getTime() / 1000)\n        break;\n      case\n      'w':\n        const weeks = parseInt(str.slice(0, -1))\n        const dateW = new Date()\n        const daysUntilSunday = (7 - dateW.getDay()) % 7\n        dateW.setDate(dateW.getDate() + daysUntilSunday + 1 + (weeks - 1) * 7)\n        dateW.setHours(0, 0, 0, 0)\n        value = Math.floor(dateW.getTime() / 1000)\n        break;\n      case\n      'd':\n        const days = parseInt(str.slice(0, -1))\n        const dateD = new Date()\n        dateD.setDate(dateD.getDate() + days)\n        dateD.setHours(0, 0, 0, 0)\n        value = Math.floor(dateD.getTime() / 1000)\n        break;\n      case\n      'hr':\n        const hrs = parseInt(str.slice(0, -2))\n        value = now + (hrs * 3600)\n        break;\n      case\n      'mn':\n        const min = parseInt(str.slice(0, -2))\n        value = now + (min * 60)\n        break;\n      default: //seconds (incl. bare numeric strings with no unit suffix)\n        const sec = (type) ? parseInt(str.slice(0, -1)) : parseInt(str)\n        value = now + sec\n        break;\n    }\n    return value;\n  }\n\n  hasExpired(expiryDate: number): boolean {\n    if (!expiryDate || expiryDate === 0) return false\n    const currentTime = Math.floor(new Date().getTime() / 1000)\n    return expiryDate < currentTime\n  }\n\n  hasExpiry(setting: any) {\n    return (setting?.expires) ? true : false\n  }\n\n  expiresIn(expiryDate: number) {\n\n    if (!expiryDate) return;\n\n    const now = Math.floor(new Date().getTime() / 1000);\n    let diff = expiryDate - now;\n\n    if (diff <= 0) return \"Expired\";\n\n    const units = [\n        { label: 'y', s: 31536000 },\n        { label: 'm', s: 2592000 },\n        { label: 'w', s: 604800 },\n        { label: 'd', s: 86400 },\n        { label: 'h', s: 3600 },\n        { label: 'min', s: 60 },\n        { label: 's', s: 1 },\n    ];\n\n    let result = [];\n\n    for (const unit of units) {\n        if (diff >= unit.s) {\n            const value = Math.floor(diff / unit.s);\n            diff %= unit.s;\n            result.push(`${value}${unit.label}`);\n        }\n    }\n\n    return result.join(', ');\n  }\n\n  lc = (str: string) => str.trim().toLowerCase().replace(/[^\\w\\s]/g, '').replace(/\\s+/g, '_')\n\n}\n","import { InjectionToken } from \"@angular/core\";\nimport { ConfigOptions } from \"./config-options.model\";\n\n/**\n * An injection token that provides the configuration settings for the application.\n * This token can be used to inject the `ConfigSettings` instance into components or services\n * that require access to the application configuration.\n */\nexport const CONFIG_SETTINGS_TOKEN = new InjectionToken<ConfigOptions>('http.config');\n","export interface RetryOptionsInterface {\n  times?: number // total request to be made including initial request\n  delay?: number // seconds (<= 3 default 3 seconds)\n}\n\nexport class RetryOptions implements RetryOptionsInterface {\n\n  constructor(\n    public times = 0,\n    public delay = 3,\n  ) {}\n\n  static adapt(item?: any): RetryOptions {\n\n    return new RetryOptions(\n      item?.times,\n      item?.delay\n    )\n\n  }\n\n}\n","/**\n * Enum representing valid streaming format types\n * \n * This enum defines all supported streaming formats for HTTP requests.\n * Each enum value corresponds to a specific data format and parsing strategy.\n */\nexport enum StreamType {\n  JSON = 'json',\n  NDJSON = 'ndjson', \n  AI_STREAMING = 'ai_streaming',\n  EVENT_STREAM = 'event_stream',\n  AUTO = 'auto'\n}\n","import { RetryOptions } from \"../../../models/retry-options.model\"\nimport { WSOptions } from \"./ws-options.model\"\nimport { StreamType } from \"./stream-type.enum\"\n\nexport interface ApiRequestInterface {\n  server: string\n  path?: any[]\n  headers?: any\n  adapter?: any\n  mapper?: any\n  polling?: number // seconds (undefined | 0 = none)\n  retry?: RetryOptions\n  stream?: boolean\n  streamType?: StreamType\n  displayError?: boolean\n  displaySuccess?: boolean\n  successMessage?: string\n  errorMessage?: string\n  saveAs?: string\n  fileContentHeader?: string\n  ws?: WSOptions // Websocket Options\n  env?: string // Environment for WebSocket channel naming\n  uploadFiles?: File | File[]\n  uploadFieldName?: string\n  uploadHttpMethod?: 'POST' | 'PUT'\n  allowedTypes?: string[]\n  maxFileSize?: number\n  maxTotalSize?: number\n  selector?: string\n  suppressToastStatuses?: number[]\n}\n\nexport class ApiRequest implements ApiRequestInterface {\n  constructor(\n    public server = '',\n    public path?: any[],\n    public headers?: any,\n    public adapter?: any,\n    public mapper?: any,\n    public polling?: number,\n    public retry?: RetryOptions,\n    public stream?: boolean,\n    public streamType?: StreamType,\n    public displayError?: boolean,\n    public displaySuccess?: boolean,\n    public successMessage?: string,\n    public errorMessage?: string,\n    public saveAs?: string,\n    public fileContentHeader?: string,\n    public ws?: WSOptions,\n    public env?: string,\n    public uploadFiles?: File | File[],\n    public uploadFieldName?: string,\n    public uploadHttpMethod?: 'POST' | 'PUT',\n    public allowedTypes?: string[],\n    public maxFileSize?: number,\n    public maxTotalSize?: number,\n    public selector?: string,\n    public suppressToastStatuses?: number[],\n  ) {}\n\n  static adapt(item?: any): ApiRequest {\n    const server = Array.isArray(item?.server) ? item.server.join('/') : item?.server || '';\n    return new ApiRequest(\n      server,\n      item?.path ? item.path : [],\n      item?.headers ? item.headers : {},\n      item?.adapter,\n      item?.mapper,\n      item?.polling ? Math.floor(item.polling) : 0,\n      item?.retry ? RetryOptions.adapt(item.retry) : RetryOptions.adapt(),\n      item?.stream ? item.stream : false,\n      item?.streamType || StreamType.AI_STREAMING,\n      item?.displayError ? item.displayError : false,\n      item?.displaySuccess ? item.displaySuccess : false,\n      item?.successMessage,\n      item?.errorMessage,\n      item?.saveAs,\n      item?.fileContentHeader,\n      item?.ws,\n      item?.env || 'dev',\n      item?.uploadFiles,\n      item?.uploadFieldName,\n      item?.uploadHttpMethod,\n      Array.isArray(item?.allowedTypes) ? item.allowedTypes : [],\n      item?.maxFileSize,\n      item?.maxTotalSize,\n      item?.selector,\n      Array.isArray(item?.suppressToastStatuses) ? item.suppressToastStatuses : [],\n    );\n  }\n}\n","export interface RequestOptionsInterface {\n    path: any[],\n    headers: any,\n  forceRefresh?: boolean,\n  ignoreQueryParams?: string[],\n  queryParamsExpiresIn?: string | number,\n  selector?: string,\n}\n\nexport class RequestOptions implements RequestOptionsInterface {\n\n  constructor(\n    public path: any[] = [],\n    public headers = {},\n    public forceRefresh?: boolean,\n    public ignoreQueryParams?: string[],\n    public queryParamsExpiresIn?: string | number,\n    public selector?: string,\n  ) {}\n\n  static adapt(item?: any): RequestOptions {\n\n    return new RequestOptions(\n      item?.path,\n      item?.headers,\n      item?.forceRefresh,\n      Array.isArray(item?.ignoreQueryParams) ? item.ignoreQueryParams : [],\n      item?.queryParamsExpiresIn,\n      item?.selector,\n    )\n\n  }\n\n}\n","import { RetryOptions } from \"../../../models/retry-options.model\"\n\nexport interface WSOptionsInterface {\n    id: string,\n    wsServer: string,\n    jwtToken: string,\n    permissions?: string[],\n    channels?: string[],\n    wsUpdateChannels?: string[],\n    user?: any,\n    retry?: RetryOptions\n}\n\nexport class WSOptions implements WSOptionsInterface {\n\n  constructor(\n    public id: string = '',\n    public wsServer: string = '',\n    public jwtToken: string = '',\n    public permissions?: string[],\n    public channels?: string[],\n    public wsUpdateChannels?: string[],\n    public user?: any,\n    public retry?: RetryOptions\n  ) {}\n\n  static adapt(item?: any): WSOptions {\n\n    return new WSOptions(\n      item?.id,\n      item?.wsServer,\n      item?.jwtToken,\n      (item?.permissions) ? item.permissions.split(',').map((p: string) => p.trim()) : [],\n      item?.channels,\n      item?.wsUpdateChannels,\n      item?.user,\n      item?.retry\n    )\n\n  }\n\n}\n","export interface OperationResultInterface {\n  success: boolean;\n  operation: 'CREATE' | 'UPDATE' | 'DELETE' | 'PATCH';\n}\n\nexport class OperationResultModel implements OperationResultInterface {\n  constructor(\n    public success: boolean = false,\n    public operation: 'CREATE' | 'UPDATE' | 'DELETE' | 'PATCH' = 'UPDATE',\n  ) {}\n\n  static adapt(item?: any): OperationResultModel {\n    return new OperationResultModel(\n      item?.success ?? false,\n      item?.operation || 'UPDATE',\n    );\n  }\n}\n","import { StreamType } from './stream-type.enum';\n\nexport interface StreamConfigInterface {\n  streamType: StreamType;\n  totalHeader?: string;\n}\n\nexport class StreamConfigModel implements StreamConfigInterface {\n  constructor(\n    public streamType: StreamType = StreamType.AI_STREAMING,\n    public totalHeader: string = 'X-Total-Count'\n  ) {}\n\n  static adapt(item?: any): StreamConfigModel {\n    return new StreamConfigModel(\n      item?.streamType,\n      item?.totalHeader\n    );\n  }\n}\n","export interface StreamProgressInterface {\n  received: number;\n  total?: number;\n  percent: number;\n  stage: 'connecting' | 'streaming' | 'complete' | 'error';\n}\n\nexport class StreamProgressModel implements StreamProgressInterface {\n  constructor(\n    public received: number = 0,\n    public total?: number,\n    public percent: number = 0,\n    public stage: 'connecting' | 'streaming' | 'complete' | 'error' = 'connecting'\n  ) {}\n\n  static adapt(item?: any): StreamProgressModel {\n    return new StreamProgressModel(\n      item?.received,\n      item?.total,\n      item?.percent,\n      item?.stage\n    );\n  }\n}\n","import { StreamProgressModel } from './stream-progress.model';\n\nexport interface StreamOutputInterface<T = any> {\n  data: T[];\n  progress: StreamProgressModel;\n  endpoint?: string;\n}\n\nexport class StreamOutputModel<T = any> implements StreamOutputInterface<T> {\n  constructor(\n    public data: T[] = [],\n    public progress: StreamProgressModel = new StreamProgressModel(),\n    public endpoint?: string\n  ) {}\n\n  static adapt<T = any>(item?: any): StreamOutputModel<T> {\n    return new StreamOutputModel<T>(\n      Array.isArray(item?.data) ? item.data : [],\n      item?.progress ? StreamProgressModel.adapt(item.progress) : new StreamProgressModel(),\n      item?.endpoint\n    );\n  }\n}\n","import { StreamType } from './stream-type.enum';\n\nexport interface StreamEventMetadataInterface {\n  timestamp: Date;\n  streamType: StreamType;\n  contentLength?: number;\n}\n\nexport class StreamEventMetadataModel implements StreamEventMetadataInterface {\n  constructor(\n    public timestamp: Date = new Date(),\n    public streamType: StreamType = StreamType.AI_STREAMING,\n    public contentLength?: number\n  ) {}\n\n  static adapt(item?: any): StreamEventMetadataModel {\n    return new StreamEventMetadataModel(\n      item?.timestamp,\n      item?.streamType,\n      item?.contentLength\n    );\n  }\n}\n","import { StreamEventMetadataModel } from './stream-event-metadata.model';\n\nexport interface StreamEventInterface<T = any> {\n  type: 'progress' | 'complete' | 'data';\n  data: T;\n  metadata?: StreamEventMetadataModel;\n}\n\nexport class StreamEventModel<T = any> implements StreamEventInterface<T> {\n  constructor(\n    public type: 'progress' | 'complete' | 'data' = 'data',\n    public data: T = null as any,\n    public metadata?: StreamEventMetadataModel\n  ) {}\n\n  static adapt<T = any>(item?: any): StreamEventModel<T> {\n    return new StreamEventModel<T>(\n      item?.type,\n      item?.data,\n      item?.metadata ? StreamEventMetadataModel.adapt(item.metadata) : undefined\n    );\n  }\n}\n","export interface ParsingResultInterface<T = any> {\n  success: boolean;\n  data?: T[];\n  error?: string;\n}\n\nexport class ParsingResultModel<T = any> implements ParsingResultInterface<T> {\n  constructor(\n    public success: boolean = false,\n    public data?: T[],\n    public error?: string\n  ) {}\n\n  static adapt<T = any>(item?: any): ParsingResultModel<T> {\n    return new ParsingResultModel<T>(\n      item?.success,\n      Array.isArray(item?.data) ? item.data : undefined,\n      item?.error\n    );\n  }\n}\n","import { RetryOptions } from \"./retry-options.model\"\n\nexport interface ConfigHTTPOptionsInterface {\n  server: string\n  path?: any[]\n  headers?: any\n  polling?: number // seconds (undefined | 0 = none)\n  retry?: RetryOptions\n  stream?: boolean\n  displayError?: boolean\n  displaySuccess?: boolean\n  selector?: string\n  suppressToastStatuses?: number[]\n}\n\nexport class ConfigHTTPOptions implements ConfigHTTPOptionsInterface {\n\n  constructor(\n    public server = '',\n    public path?: any[],\n    public headers?: any,\n    public polling?: number,\n    public retry?: RetryOptions,\n    public stream?: boolean,\n    public displayError?: boolean,\n    public displaySuccess?: boolean,\n    public selector?: string,\n    public suppressToastStatuses?: number[],\n  ) {}\n\n  static adapt(item?: any): ConfigHTTPOptions {\n\n    const server = Array.isArray(item?.server) ? item.server.join('/') : item?.server || '';\n    const retryOptions = item?.retry ? RetryOptions.adapt(item.retry) : RetryOptions.adapt();\n\n    return new ConfigHTTPOptions(\n      server,\n      (item?.path) ? item.path : [],\n      (item?.headers) ? item.headers : {},\n      (typeof item?.polling !== 'undefined' && item?.polling !== null) ? Math.floor(item.polling) : 0,\n      retryOptions,\n      (typeof item?.stream !== 'undefined' && item?.stream !== null) ? item.stream : false,\n      (typeof item?.displayError !== 'undefined' && item?.displayError !== null) ? item.displayError : false,\n      (typeof item?.displaySuccess !== 'undefined' && item?.displaySuccess !== null) ? item.displaySuccess : false,\n      item?.selector,\n      Array.isArray(item?.suppressToastStatuses) ? item.suppressToastStatuses : [],\n    )\n\n  }\n\n}\n","import { SettingOptions } from \"../services/local-storage-manager-service/models/setting-options.model\"\n\nexport interface LocalStorageOptionsInterface {\n  storageName?: string\n  storageSettingsName?: string\n  options?: SettingOptions,\n}\n\nexport class LocalStorageOptions implements LocalStorageOptionsInterface {\n\n  constructor(\n    public storageName?: string,\n    public storageSettingsName?: string,\n    public options?: SettingOptions,\n  ) {}\n\n  static adapt(item?: any): LocalStorageOptions {\n\n    return new LocalStorageOptions(\n      (item?.storageName) ? item.storageName : 'storage',\n      (item?.storageSettingsName) ? item.storageSettingsName : 'global-storage',\n      (item?.options) ? SettingOptions.adapt(item.options) : SettingOptions.adapt(),\n    )\n\n  }\n\n}\n","import { ConfigHTTPOptions } from \"./config-http-options.model\";\nimport { LocalStorageOptions } from \"./config-local-storage-options.model\";\n\nexport interface ConfigOptionsInterface {\n  httpRequestOptions?: ConfigHTTPOptions\n  LocalStorageOptions?: LocalStorageOptions\n  appId?: string\n  // DatabaseOptions: any\n}\n\nexport class ConfigOptions implements ConfigOptionsInterface {\n\n  constructor(\n    public httpRequestOptions?: ConfigHTTPOptions,\n    public LocalStorageOptions?: LocalStorageOptions,\n    public appId?: string,\n    // public DatabaseOptions?: any,\n  ) {}\n\n  static adapt(item?: any): ConfigOptions {\n    return new ConfigOptions(\n      (item?.httpRequestOptions) ? ConfigHTTPOptions.adapt(item.httpRequestOptions) : undefined,\n      (item?.LocalStorageOptions) ? LocalStorageOptions.adapt(item.LocalStorageOptions) : undefined,\n      item?.appId,\n      // item?.DatabaseOptions,\n    )\n\n  }\n\n}\n","import { Inject, Injectable, Optional, inject } from '@angular/core';\n\nimport { ApiRequest } from '../request-manager-state-service/models';\nimport { SettingOptions } from '../local-storage-manager-service/models/setting-options.model';\nimport { UtilsService } from './utils.service';\n\nimport { CONFIG_SETTINGS_TOKEN } from '../../models/config-token.model';\nimport { ConfigHTTPOptions } from '../../models/config-http-options.model';\nimport { ConfigOptions } from '../../models/config-options.model';\nimport { LocalStorageOptions } from '../../models/config-local-storage-options.model';\nimport { RetryOptions } from '../../models/retry-options.model';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class ObjectMergerService {\n\n  utils = inject(UtilsService);\n\n  constructor(@Inject(CONFIG_SETTINGS_TOKEN) @Optional() private configOptions?: ConfigOptions) {\n      if (!this.configOptions) this.configOptions = ConfigOptions.adapt()\n   }\n\n  // ponytail: `options` here is intentionally the caller's RAW, pre-adapt object (see\n  // defineReqOptions() in http-manager.service.ts/http-manager-signals.service.ts, which\n  // delegates straight into this method rather than pre-adapting). Presence\n  // (`typeof x !== 'undefined'`) is checked against that raw object directly so an explicit\n  // falsy/zero value is never confused with \"not provided\" — the same pattern\n  // mergeStorageOptions()/SettingOptions.adapt() already use below. ApiRequest.adapt() is called\n  // exactly once, at the end, on the fully-resolved object.\n  //\n  // `params`, when provided, are appended to the options' own path before anything else runs —\n  // this mirrors what defineReqOptions() used to do to the raw object before calling in.\n  mergeOptions(options: any = {}, params?: any[]) {\n\n    const rawOptions = { ...(options || {}) }\n    if (params) rawOptions.path = [ ...(rawOptions.path || []), ...params ]\n\n    const configForRoot = (this.configOptions?.httpRequestOptions) ? this.configOptions.httpRequestOptions : ConfigHTTPOptions.adapt()\n\n    const merged: any = { ...rawOptions }\n\n    merged.server = (!rawOptions?.server) ? (configForRoot?.server || '') : rawOptions.server\n\n    merged.path = [ ...(rawOptions?.path || []), ...(configForRoot?.path || []) ]\n\n    merged.headers = { ...(rawOptions?.headers || {}), ...(configForRoot?.headers || {}) }\n\n    merged.retry = (typeof rawOptions?.retry !== 'undefined' && rawOptions?.retry !== null)\n      ? RetryOptions.adapt(rawOptions.retry)\n      : (configForRoot?.retry || RetryOptions.adapt());\n\n    merged.polling = (typeof rawOptions?.polling !== 'undefined' && rawOptions?.polling !== null)\n      ? rawOptions.polling\n      : (configForRoot?.polling ?? 0);\n\n    merged.displayError = (typeof rawOptions?.displayError !== 'undefined' && rawOptions?.displayError !== null)\n      ? rawOptions.displayError\n      : (configForRoot?.displayError ?? false);\n\n    merged.displaySuccess = (typeof rawOptions?.displaySuccess !== 'undefined' && rawOptions?.displaySuccess !== null)\n      ? rawOptions.displaySuccess\n      : (configForRoot?.displaySuccess ?? false);\n\n    merged.stream = (typeof rawOptions?.stream !== 'undefined' && rawOptions?.stream !== null)\n      ? rawOptions.stream\n      : (configForRoot?.stream ?? false);\n\n    merged.selector = (typeof rawOptions?.selector !== 'undefined' && rawOptions?.selector !== null)\n      ? rawOptions.selector\n      : configForRoot?.selector;\n\n    merged.suppressToastStatuses = Array.from(new Set([\n      ...(Array.isArray(rawOptions?.suppressToastStatuses) ? rawOptions.suppressToastStatuses : []),\n      ...(Array.isArray(configForRoot?.suppressToastStatuses) ? configForRoot.suppressToastStatuses : []),\n    ]));\n\n    return ApiRequest.adapt(merged);\n\n  }\n\n  mergeStorageOptions(options = SettingOptions.adapt()) {\n\n    const configForRoot = (this.configOptions?.LocalStorageOptions) ? this.configOptions.LocalStorageOptions : LocalStorageOptions.adapt()\n    const configForRootOptions = configForRoot.options || LocalStorageOptions.adapt().options\n\n    const mergedOptions = SettingOptions.adapt(options)\n\n    // storage type\n    mergedOptions.storage = (options && (typeof options.storage !== 'undefined')) ? options.storage : (configForRootOptions?.storage ?? 0)\n\n    // expires: prefer explicit numeric expires; if not provided, compute from expiresIn string; otherwise use config default\n    // if an explicit, non-zero numeric expires is provided, use it\n    if (options && (typeof options.expires !== 'undefined') && options.expires !== null && Number(options.expires) > 0) {\n      mergedOptions.expires = Number(options.expires);\n    } else if (options && options.expiresIn) {\n      // compute numeric epoch from expiresIn string using UtilsService if available\n      try {\n        mergedOptions.expires = this.utils ? this.utils.expires(options.expiresIn) : 0;\n      } catch {\n        mergedOptions.expires = 0;\n      }\n    } else {\n      mergedOptions.expires = configForRootOptions?.expires ?? 0;\n    }\n\n    // keep expiresIn string if explicitly provided, otherwise use config default\n    mergedOptions.expiresIn = (options && (typeof options.expiresIn !== 'undefined')) ? options.expiresIn : (configForRootOptions?.expiresIn || '')\n\n    mergedOptions.encrypted = (options && (typeof options.encrypted !== 'undefined')) ? options.encrypted : (configForRootOptions?.encrypted || false)\n\n    return mergedOptions;\n\n  }\n\n}\n","import { DestroyRef, Inject, Injectable, Optional, Signal, WritableSignal, computed, effect, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Observable, Subject, interval } from 'rxjs';\n\nimport { UtilsService } from '../utils/utils.service';\nimport { SymmetricalEncryptionService, EncryptionTestService } from 'encryption-helpers';\n\nimport { StorageOption, StorageType } from './models';\nimport { SettingOptions } from './models/setting-options.model';\nimport { StorageData } from './models/storage-data.model';\nimport { CONFIG_SETTINGS_TOKEN } from '../../models/config-token.model';\nimport { ConfigOptions } from '../../models/config-options.model';\nimport { ObjectMergerService } from '../utils/object-merger.service';\n\nexport interface State {\n  localStores: StorageData[]\n  sessionStores: StorageData[]\n  settings: StorageOption[]\n}\n\nconst initialState: State = {\n  localStores: [],\n  sessionStores: [],\n  settings: [],\n};\n\n@Injectable({ providedIn: 'root' })\nexport class LocalStorageManagerService {\n\n  storageName = 'storage'\n  storageSettingsName = 'global-storage'\n  defaultOptions = SettingOptions.adapt()\n\n  stateRetrieved = false\n  encrypted = false\n\n  private readonly destroyRef = inject(DestroyRef)\n\n  utils = inject(UtilsService)\n  objectMergerService = inject(ObjectMergerService)\n  encryption = inject(SymmetricalEncryptionService)\n  encryptionTest = inject(EncryptionTestService)\n\n  private readonly state: WritableSignal<State> = signal(initialState)\n  // Pinged synchronously by every mutation. The $-observables below read off this\n  // instead of an effect() on `state`, because effects coalesce rapid synchronous\n  // writes into one async flush — a caller doing three updateStore() calls in a row\n  // would only ever see the last one. This ping fires once per mutation, matching\n  // the old ComponentStore.select()'s synchronous-per-mutation emission.\n  private readonly stateChanged$ = new Subject<void>()\n\n  // --- SIGNAL SURFACE ---\n\n  readonly stores: Signal<StorageOption[]> = computed(() => this.state().settings)\n\n  readonly storeExists = (store: string) => {\n    const name = this.validStoreName(store)\n    return computed(() => !!this.state().settings.find(item => item.name === name))\n  }\n\n  readonly store = (store: string) => {\n    const name = this.validStoreName(store)\n    return computed(() => {\n\n      const data = this.state()\n      const foundStore = [...data.settings].reverse().find(item => item.name === name)\n\n      if (!foundStore) return null\n\n      const options = SettingOptions.adapt(foundStore.options)\n\n      const found = options.storage === StorageType.GLOBAL\n        ? [...data.localStores].reverse().find(item => item.id === foundStore.id)\n        : [...data.sessionStores].reverse().find(item => item.id === foundStore.id)\n\n      if (!found) return null\n\n      let storageData = found.data\n      if (options.encrypted) {\n        if (!this.encryption.appID) {\n          console.warn('No App ID found - AppId not Provided, cannot decrypt encrypted store')\n          return null\n        }\n\n        if (this.isString(found.data) && !this.encryptionTest.isEncrypted(found.data)) {\n          storageData = found.data\n        } else {\n          const decryptedData = this.encryption.decrypt(found.data)\n          if (decryptedData !== null) {\n            storageData = decryptedData\n          } else {\n            console.warn(`Failed to decrypt data for store: ${store}`)\n            storageData = found.data\n          }\n        }\n      }\n\n      try {\n        return this.isString(storageData) ? JSON.parse(storageData) : storageData\n      } catch (error) {\n        console.warn(`Failed to parse storage data for store: ${store}`, error)\n        return storageData\n      }\n\n    })\n  }\n\n  readonly settings: Signal<StorageOption[]> = computed(() => this.state().settings)\n\n  readonly setting = (store: string) => {\n    const name = this.validStoreName(store)\n    return computed(() => {\n      const foundSetting = [...this.state().settings].reverse().find(item => item.name === name)\n      return foundSetting ? foundSetting : null\n    })\n  }\n\n  // --- OBSERVABLE SURFACE (derived from the signals above) ---\n  //\n  // Not toObservable(): that backs its emissions with an effect(), and effects coalesce\n  // rapid synchronous signal writes into a single async flush — losing intermediate\n  // mutations that the old ComponentStore.select() (a plain RxJS Subject) always\n  // delivered synchronously, one per call. stateChanged$ preserves that: every mutator\n  // pings it synchronously, so each subscribe emits the current value immediately, then\n  // one more emission per subsequent mutation, in order, none skipped.\n\n  private toSyncObservable<T>(sig: Signal<T>): Observable<T> {\n    return new Observable<T>(subscriber => {\n      let last = sig()\n      subscriber.next(last)\n\n      const sub = this.stateChanged$.subscribe(() => {\n        const value = sig()\n        if (!Object.is(value, last)) {\n          last = value\n          subscriber.next(value)\n        }\n      })\n\n      return () => sub.unsubscribe()\n    })\n  }\n\n  readonly stores$: Observable<StorageOption[]> = this.toSyncObservable(this.stores)\n\n  readonly storeExists$ = (store: string) => this.toSyncObservable(this.storeExists(store))\n\n  readonly store$ = (store: string) => this.toSyncObservable(this.store(store))\n\n  readonly settings$: Observable<StorageOption[]> = this.toSyncObservable(this.settings)\n\n  readonly setting$ = (store: string) => this.toSyncObservable(this.setting(store))\n\n  constructor(@Optional() @Inject(CONFIG_SETTINGS_TOKEN) private configOptions?: ConfigOptions) {\n\n    this.storageName = configOptions?.LocalStorageOptions?.storageName || this.storageName\n    this.storageSettingsName = configOptions?.LocalStorageOptions?.storageSettingsName || this.storageSettingsName\n    this.defaultOptions = configOptions?.LocalStorageOptions?.options || this.defaultOptions\n\n    this.retrieveState()\n\n    effect(() => {\n      if (this.stateRetrieved) this.persistState(this.state())\n    })\n\n    interval(1000 * 3).pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n\n      const state = this.state()\n      const expired = this.expired(state)\n\n      if (expired.length > 0) {\n        const ids = expired.map(item => item.id)\n        const updatedState: State = {\n          ...state,\n          localStores: state.localStores.filter(item => !ids.includes(item.id)),\n          sessionStores: state.sessionStores.filter(item => !ids.includes(item.id)),\n          settings: state.settings.filter(item => !ids.includes(item.id)),\n        }\n        this.state.set(updatedState)\n        this.stateChanged$.next()\n        this.persistState(updatedState)\n      }\n\n    })\n\n  }\n\n  /** Compat for existing test setup that seeds state directly. */\n  setState(state: State): void {\n    this.state.set(state)\n    this.stateChanged$.next()\n  }\n\n  // --- MUTATORS ---\n\n  setStore(store: { id: string, name: string, data: any, options: SettingOptions }) {\n    this.state.update(state => {\n\n      // normalize before adapt() so the stored name/derived id reflect the sanitized\n      // form — adapting first and normalizing store.name afterward left the sanitized\n      // name on a variable nothing downstream reads\n      store.name = this.validStoreName(store.name)\n      const settings = StorageOption.adapt(store)\n      settings.options = this.objectMergerService.mergeStorageOptions(settings.options)\n\n      const type = store.options.storage\n      const hasStore = this.hasGlobalStorage(type, store.id)\n\n      if (!hasStore) {\n        return state\n      }\n\n      const str = this.encryptionTest.isEncrypted(store.data) ? store.data : JSON.stringify(store.data)\n      const dataStr = store.options.encrypted ? this.encryption.encrypt(str) : store.data\n\n      const localData = (dataStr && settings.options?.storage === StorageType.GLOBAL) ? [{ data: dataStr, id: settings.id }] : []\n      const sessionData = (dataStr && settings.options?.storage === StorageType.SESSION) ? [{ data: dataStr, id: settings.id }] : []\n      const localStores = state.localStores.filter(item => item.id !== settings.id)\n      const sessionStores = state.sessionStores.filter(item => item.id !== settings.id)\n      // dedupe by id AND name — a stale entry under the same name but a different id must not survive as a duplicate\n      const stateSettings = state.settings.filter(item => item.id !== settings.id && item.name !== settings.name)\n\n      return {\n        ...state,\n        localStores: [...localStores, ...localData],\n        sessionStores: [...sessionStores, ...sessionData],\n        settings: [...stateSettings, settings],\n      }\n\n    })\n    this.stateChanged$.next()\n  }\n\n  createStore(store: { id?: string, name: string, data: any, options: SettingOptions }) {\n    this.state.update(state => {\n\n      // normalize before adapt() — see setStore for why this order matters\n      store.name = this.validStoreName(store.name)\n      store.options = this.objectMergerService.mergeStorageOptions(store.options)\n      const settings = StorageOption.adapt(store)\n      settings.options = this.objectMergerService.mergeStorageOptions(settings.options)\n      const foundStore = state.settings.some(item => item.name === store.name)\n\n      const expires = settings.options?.expiresIn ? this.utils.expires(settings.options.expiresIn) : 0\n      if (settings.options) settings.options.expires = expires\n\n      if (foundStore) {\n        return state\n      }\n\n      if (!this.isObjectOrArray(store.data)) {\n        console.warn('Data must be an Object or Array')\n        return state\n      }\n\n      store.data = this.isString(store.data) ? JSON.parse(store.data) : store.data\n      const dataStr = store.options.encrypted ? this.encryption.encrypt(store.data) : store.data\n\n      const localData = settings.options?.storage === StorageType.GLOBAL ? [{ data: dataStr, id: settings.id }] : []\n      const sessionData = settings.options?.storage === StorageType.SESSION ? [{ data: dataStr, id: settings.id }] : []\n\n      return {\n        ...state,\n        localStores: [...state.localStores, ...localData],\n        sessionStores: [...state.sessionStores, ...sessionData],\n        settings: [...state.settings, settings],\n      }\n\n    })\n    this.stateChanged$.next()\n  }\n\n  updateStore(store: { name: string, data: any, preserveRequestCache?: boolean }) {\n    this.state.update(state => {\n\n      store.name = this.validStoreName(store.name)\n\n      const settings = [...state.settings].reverse().find(item => item.name === store.name)\n\n      if (!settings) return state\n\n      // ponytail: defensive merge — if the incoming data came from a schema update\n      // (has schemaSignature, real expires) but dropped requestCache, carry it forward\n      // from the current store. Explicit clears opt out via preserveRequestCache=false\n      // so clearRecords/clearRequestCacheMetadata can actually delete requestCache.\n      if (store.preserveRequestCache !== false\n          && !store.data?.requestCache\n          && store.data?.schemaSignature\n          && store.data?.expires !== 0) {\n        const bucket = settings.options?.storage === StorageType.SESSION ? state.sessionStores : state.localStores\n        const existing = bucket.find((item: any) => item.id === settings.id)\n        if (existing?.data?.requestCache) {\n          store.data = { ...store.data, requestCache: existing.data.requestCache }\n        }\n      }\n\n      const dataStr = settings.options?.encrypted ? this.encryption.encrypt(store.data) : store.data\n\n      const localData = (dataStr && settings.options?.storage === StorageType.GLOBAL) ? [{ data: dataStr, id: settings.id }] : []\n      const sessionData = (dataStr && settings.options?.storage === StorageType.SESSION) ? [{ data: dataStr, id: settings.id }] : []\n\n      return {\n        ...state,\n        localStores: [...state.localStores.filter(item => item.id !== settings.id), ...localData],\n        sessionStores: [...state.sessionStores.filter(item => item.id !== settings.id), ...sessionData],\n      }\n\n    })\n    this.stateChanged$.next()\n  }\n\n  deleteStore(store: { name: string }) {\n    this.state.update(state => {\n\n      store.name = this.validStoreName(store.name)\n\n      const id = state.settings.find(item => item.name === store.name)?.id\n\n      if (!id) {\n        return state\n      }\n\n      return {\n        ...state,\n        localStores: state.localStores.filter(item => item.id !== id),\n        sessionStores: state.sessionStores.filter(item => item.id !== id),\n        settings: state.settings.filter(item => item.id !== id),\n      }\n\n    })\n    this.stateChanged$.next()\n  }\n\n  resetStore() {\n    const newState: State = {\n      localStores: [],\n      sessionStores: [],\n      settings: [],\n    }\n    this.state.set(newState)\n    this.stateChanged$.next()\n    this.persistState(newState)\n  }\n\n  // --- PERSISTENCE / RECOVERY ---\n\n  private persistState(state: State | null) {\n\n    if (!state) return\n\n    const strLocal = JSON.stringify(state.localStores)\n    localStorage.setItem(this.storageName, strLocal)\n\n    const strSession = JSON.stringify(state.sessionStores)\n    sessionStorage.setItem(this.storageName, strSession)\n\n    const settingsStr = this.encryption.encrypt(state.settings)\n    // ponytail: skip the write on encryption failure — writing '' here previously\n    // silently wiped out whatever settings were already persisted.\n    if (!settingsStr) {\n      console.warn('Failed to encrypt settings for persistence - leaving previously persisted settings untouched')\n      return\n    }\n    localStorage.setItem(this.storageSettingsName, settingsStr)\n\n  }\n\n  private expired(state: State | null) {\n    if (!state) return []\n    return state.settings?.filter(item => (item.options?.expires || 0) > 0 && this.utils.hasExpired(item.options?.expires || 0))\n  }\n\n  retrieveState() {\n\n    const str = localStorage.getItem(this.storageSettingsName)\n\n    const localStr = localStorage.getItem(this.storageName)\n    const sessionStr = sessionStorage.getItem(this.storageName)\n\n    let localData: StorageData[] = [];\n    let sessionData: StorageData[] = [];\n    let settings: StorageOption[] = [];\n\n    try {\n      localData = (localStr) ? JSON.parse(localStr) : [];\n    } catch (error) {\n      console.warn('Failed to parse local storage data:', error);\n      localData = [];\n    }\n\n    try {\n      sessionData = (sessionStr) ? JSON.parse(sessionStr) : [];\n    } catch (error) {\n      console.warn('Failed to parse session storage data:', error);\n      sessionData = [];\n    }\n\n    if (str) {\n      const plainSettings = this.tryParseSettingsArray(str);\n      if (plainSettings) {\n        settings = plainSettings;\n        const migratedSettings = this.encryption.encrypt(settings);\n        if (migratedSettings) {\n          localStorage.setItem(this.storageSettingsName, migratedSettings);\n        }\n        console.warn('Recovered settings from plaintext storage and migrated to encrypted format');\n      } else {\n        const decryptedStr = this.encryption.decrypt(str);\n        if (decryptedStr) {\n          const decryptedSettings = this.tryParseSettingsArray(decryptedStr);\n          if (decryptedSettings) {\n            settings = decryptedSettings;\n          } else {\n            console.warn('Failed to parse decrypted settings data. Resetting corrupted settings store.');\n            localStorage.removeItem(this.storageSettingsName);\n            settings = [];\n          }\n        } else {\n          console.warn('Failed to decrypt settings data. Resetting corrupted settings store.');\n          localStorage.removeItem(this.storageSettingsName);\n          settings = [];\n        }\n      }\n    }\n\n    const reconstructedSettings: StorageOption[] = [];\n    const reconstructedLocal: StorageData[] = [];\n    const reconstructedSession: StorageData[] = [];\n\n    settings.forEach(store => {\n\n      const options = SettingOptions.adapt(store.options);\n\n      if ((!options.expires || options.expires === 0) && options.expiresIn) {\n        try {\n          const computed = this.utils.expires(options.expiresIn as unknown as string);\n          options.expires = computed || 0;\n        } catch {\n          options.expires = 0;\n        }\n      }\n\n      const expired = (options.expires || 0) > 0 && this.utils.hasExpired(options.expires || 0);\n\n      if (expired) return;\n\n      const settingsEntry = StorageOption.adapt({\n        id: store.id,\n        name: store.name,\n        data: store.data,\n        options,\n      });\n      settingsEntry.options = this.objectMergerService.mergeStorageOptions(options);\n\n      // Dedup by name (last-wins) — collapses any duplicates from the old bug\n      const existingIdx = reconstructedSettings.findIndex(s => s.name === settingsEntry.name)\n      if (existingIdx >= 0) {\n        reconstructedSettings[existingIdx] = settingsEntry\n      } else {\n        reconstructedSettings.push(settingsEntry)\n      }\n\n      const hasStorage = this.hasGlobalStorage(options.storage, store.id || '')\n\n      const bucket = settingsEntry.options?.storage === StorageType.SESSION ? reconstructedSession : reconstructedLocal\n      const bucketIdx = bucket.findIndex(item => item.id === settingsEntry.id)\n      const bucketEntry = { data: hasStorage ? (options.storage === StorageType.GLOBAL\n        ? localData.find(item => item.id === store.id)?.data\n        : sessionData.find(item => item.id === store.id)?.data) ?? [] : [], id: settingsEntry.id }\n      if (bucketIdx >= 0) {\n        bucket[bucketIdx] = bucketEntry\n      } else {\n        bucket.push(bucketEntry)\n      }\n\n    })\n\n    this.state.set({\n      localStores: reconstructedLocal,\n      sessionStores: reconstructedSession,\n      settings: reconstructedSettings,\n    })\n    this.stateChanged$.next()\n\n    this.stateRetrieved = true\n\n  }\n\n  // --- HELPERS ---\n\n  private isObjectOrArray = (obj: any) => {\n\n    let parsed;\n\n    try {\n      parsed = (typeof obj === 'object') ? obj : JSON.parse(obj)\n    } catch (e) {\n      return false;\n    }\n\n    if (Array.isArray(parsed)) {\n      const allStringsOrObjectsOrNumbers = parsed.every(item =>\n          typeof item === 'string' ||\n          typeof item === 'object' && item !== null ||\n          typeof item === 'number'\n      );\n      return allStringsOrObjectsOrNumbers;\n    }\n\n    return typeof parsed === 'object' && parsed !== null;\n\n  }\n\n  private isString(obj: any) {\n    return (Object.prototype.toString.call(obj) === '[object String]')\n  }\n\n  private fixAndParseJSON(jsonString: string): any {\n    const fixedString = jsonString\n      .replace(/'/g, '\"')\n      .replace(/([{,]\\s*)(\\w+)\\s*:/g, '$1\"$2\":')\n      .replace(/,\\s*(\\}|\\])/g, '$1');\n\n    try {\n      return JSON.parse(fixedString);\n    } catch (error: any) {\n      throw new Error('Failed to parse JSON: ' + error.message);\n    }\n  }\n\n  private validStoreName(str: string) {\n    return str\n      .toLowerCase() // Convert to lowercase\n      .replace(/\\s+/g, '_') // Replace spaces with underscores\n      .replace(/[^ -~]/g, ''); // Remove non-ASCII characters\n  }\n\n  private hasGlobalStorage(type: StorageType = StorageType.GLOBAL, id: string) {\n\n    const strData: StorageData[] = []\n\n    try {\n      if (type === StorageType.GLOBAL) {\n        const str = localStorage.getItem(this.storageName)\n        strData.push(...(str ? JSON.parse(str) : []))\n      } else {\n        const str = sessionStorage.getItem(this.storageName)\n        strData.push(...(str ? JSON.parse(str) : []))\n      }\n    } catch (error) {\n      console.warn('Failed to parse raw storage while checking for an existing entry:', error)\n      return false\n    }\n\n    return !!strData.find(store => store.id === id)\n\n  }\n\n  /**\n   * Clears all stored data from localStorage and sessionStorage\n   * Use this method to recover from corrupted data errors\n   */\n  clearAllStoredData(): void {\n    try {\n      this.resetStore();\n      console.log('Cleared all stored data');\n    } catch (error) {\n      console.error('Failed to clear stored data:', error);\n    }\n  }\n\n  /**\n   * Checks if stored data appears to be corrupted\n   * Returns true if data appears corrupted\n   */\n  checkForCorruptedData(): boolean {\n    try {\n      const str = localStorage.getItem(this.storageSettingsName);\n      if (str) {\n        const plainSettings = this.tryParseSettingsArray(str);\n        if (plainSettings) {\n          return false;\n        }\n\n        const decryptedStr = this.encryption.decrypt(str);\n        if (decryptedStr !== null && decryptedStr !== undefined) {\n          const decryptedSettings = this.tryParseSettingsArray(decryptedStr);\n          return !decryptedSettings;\n        }\n\n        return true;\n      }\n      return false;\n    } catch (error) {\n      return true;\n    }\n  }\n\n  private tryParseSettingsArray(raw: any): StorageOption[] | null {\n    if (!raw) {\n      return null;\n    }\n\n    if (Array.isArray(raw)) {\n      return raw;\n    }\n\n    if (!this.isString(raw)) {\n      return null;\n    }\n\n    try {\n      const parsed = JSON.parse(raw);\n      if (Array.isArray(parsed)) {\n        return parsed;\n      }\n\n      if (this.isString(parsed)) {\n        const nestedParsed = JSON.parse(parsed);\n        if (Array.isArray(nestedParsed)) {\n          return nestedParsed;\n        }\n      }\n    } catch {\n      // Continue to fallback parser\n    }\n\n    try {\n      const fallbackParsed = this.fixAndParseJSON(raw);\n      if (Array.isArray(fallbackParsed)) {\n        return fallbackParsed;\n      }\n    } catch {\n      return null;\n    }\n\n    return null;\n  }\n\n}\n","import { HttpHeaders } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class HeadersService {\n\n  headers = {}\n\n  generateHeaders(headers?: Record<string, string>): { headers: HttpHeaders } {\n\n    const allHeaders = { ...this.headers, ...(headers || {}) }\n    return { headers: new HttpHeaders(allHeaders) }\n\n  }\n\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class PathQueryService {\n\n  buildAPIPath(server: string|string[], params?: any[]|any) {\n\n    server = (Array.isArray(server)) ? server.join('/') : server\n\n    const pathObjects = (params) ? params.filter((path:any) => (!this.isObject(path))) : []\n    const queryObjects = (params) ? params.filter((path:any) => (this.isObject(path))) : []\n\n    const query = this.removeEmptyParams(queryObjects.reduce((r: any, c: any) => {\n      Object.entries(c).forEach(([key, value]) => {\n        r[key] = Array.isArray(value) ? value.join(',') : value\n      })\n      return r\n    }, {}))\n\n    let path = this.buildRestPath(server, pathObjects)\n\n    return(Object.keys(query).length > 0) ? path + '?' + this.buildQueryPath(query) : path\n\n  }\n\n  private buildRestPath(server: string, params: any[]): string {\n    server = (server) ? server : ''\n    server = (server.charAt(0) === '/') ? server.substring(1) : server\n    return this.cleanUrlPath(server +'/'+ params.join('/'))\n  }\n\n  private buildQueryPath(params: any): string {\n\n    const searchParams = new URLSearchParams()\n\n    for (const key in params) {\n\n      if (Array.isArray(params[key])) {\n        params[key].forEach((value: any) => searchParams.append(key, value));\n      } else {\n        searchParams.append(key, params[key]);\n      }\n\n    }\n\n    return searchParams.toString()\n\n  }\n\n  private cleanUrlPath(str: string) {\n    return str.replace(/([^:]\\/)\\/+/g, \"$1\").replace(/\\/$/,'')\n  }\n\n  private isObject(val: any): boolean {\n    return (val === null) ? false : ( (typeof val === 'function') || (typeof val === 'object') )\n  }\n\n  private removeEmptyParams = (obj: any): Record<string, any> =>\n    Object.fromEntries(\n      Object.entries(obj)\n        .map(([key, value]) =>\n          [key, value && typeof value === 'object' ? this.removeEmptyParams(value) : value]\n        )\n        .filter(([_, value]) => value !== undefined && value !== null && value !== \"\")\n    )\n\n}\n","/**\n * Generate a random hex color code\n * @returns A random hex color string (e.g., \"#FF5733\")\n */\nexport const RandomHexColor = (): string => {\n  // Generate a random number between 0 and 16777215 (0xFFFFFF)\n  const randomColor = Math.floor(Math.random() * 16777215);\n  // Convert to hexadecimal and pad with zeros to ensure 6 digits\n  const hexColor = randomColor.toString(16).padStart(6, '0');\n  // Return with # prefix\n  return `#${hexColor}`;\n};\n\n/**\n * Generate a random hex color with constraints to ensure good visibility\n * @param options Optional constraints for color generation\n * @returns A random hex color string with good contrast\n */\nexport const RandomVisibleColor = (options?: {\n  minBrightness?: number; // Minimum brightness (0-255), default: 50\n  maxBrightness?: number; // Maximum brightness (0-255), default: 200\n}): string => {\n  const minBrightness = options?.minBrightness ?? 50;\n  const maxBrightness = options?.maxBrightness ?? 200;\n\n  // Generate RGB values within the specified brightness range\n  const r = Math.floor(Math.random() * (maxBrightness - minBrightness) + minBrightness);\n  const g = Math.floor(Math.random() * (maxBrightness - minBrightness) + minBrightness);\n  const b = Math.floor(Math.random() * (maxBrightness - minBrightness) + minBrightness);\n\n  // Convert to hex and pad with zeros\n  const toHex = (n: number) => n.toString(16).padStart(2, '0');\n  return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n};\n\n/**\n * Generate a random color from a predefined palette\n * @returns A hex color from a set of visually distinct colors\n */\nexport const RandomPaletteColor = (): string => {\n  const colorPalette = [\n    '#FF6B6B', // Coral\n    '#4ECDC4', // Turquoise\n    '#45B7D1', // Sky Blue\n    '#FFBE0B', // Amber\n    '#FB5607', // Orange\n    '#8338EC', // Violet\n    '#3A86FF', // Azure\n    '#38B000', // Green\n    '#9D4EDD', // Purple\n    '#FF006E', // Pink\n    '#0077B6', // Blue\n    '#2A9D8F'  // Teal\n  ];\n\n  const randomIndex = Math.floor(Math.random() * colorPalette.length);\n  return colorPalette[randomIndex];\n};\n\n/**\n * Generate a random HSL color\n * @param options Optional constraints for HSL generation\n * @returns A random HSL color string (e.g., \"hsl(120, 100%, 50%)\")\n */\nexport const RandomHSLColor = (options?: {\n  saturation?: [number, number]; // Saturation range (0-100), default: [50, 100]\n  lightness?: [number, number];   // Lightness range (0-100), default: [40, 80]\n}): string => {\n  // Full range for hue (0-360)\n  const hue = Math.floor(Math.random() * 361);\n\n  // Default or custom saturation range\n  const satMin = options?.saturation?.[0] ?? 50;\n  const satMax = options?.saturation?.[1] ?? 100;\n  const saturation = Math.floor(Math.random() * (satMax - satMin + 1) + satMin);\n\n  // Default or custom lightness range\n  const lightMin = options?.lightness?.[0] ?? 40;\n  const lightMax = options?.lightness?.[1] ?? 80;\n  const lightness = Math.floor(Math.random() * (lightMax - lightMin + 1) + lightMin);\n\n  return `hsl(${hue}, ${saturation}%, ${lightness}%)`;\n};\n","import { Signal } from '@angular/core';\nimport { Observable } from 'rxjs';\n\n// Not toObservable(): that backs its emissions with an effect(), and effects coalesce rapid\n// synchronous signal writes into a single async flush — losing intermediate mutations a plain\n// Subject-backed ping always delivers synchronously, one per call.\nexport function toSyncObservable<T>(sig: Signal<T>, changed$: Observable<void>): Observable<T> {\n  return new Observable<T>(subscriber => {\n    let last = sig();\n    subscriber.next(last);\n\n    const sub = changed$.subscribe(() => {\n      const value = sig();\n      if (!Object.is(value, last)) {\n        last = value;\n        subscriber.next(value);\n      }\n    });\n\n    return () => sub.unsubscribe();\n  });\n}\n","import { Injectable, isDevMode } from '@angular/core';\n\n/**\n * LoggerService for http-request-manager library\n *\n * Automatically enables debug logging in development mode,\n * disables it in production mode.\n *\n * Usage:\n * ```typescript\n * constructor(private logger: LoggerService) {}\n *\n * this.logger.debug('WebSocket', 'Connected successfully');\n * this.logger.info('HTTP', 'Request completed', { status: 200 });\n * this.logger.warn('State', 'Cache miss for key', { key: 'user' });\n * this.logger.error('Database', 'Connection failed', error);\n * ```\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class LoggerService {\n  private static readonly DEBUG_FLAG_KEY = 'HTTP_MGR_DEBUG';\n  private debugMode: boolean;\n\n  constructor() {\n    this.debugMode = isDevMode() && this.isDebugFlagEnabled();\n  }\n\n  /**\n   * Debug level logging - only shown in development mode\n   * Use for: Detailed diagnostic information, state changes, connection events\n   */\n  debug(context: string, message: string, data?: any): void {\n    if (this.debugMode) {\n      console.log(`[HTTP-MGR DEBUG] ${context}: ${message}`, data ?? '');\n    }\n  }\n\n  /**\n   * Info level logging - only shown in development mode\n   * Use for: Important operational messages, successful operations\n   */\n  info(context: string, message: string, data?: any): void {\n    if (this.debugMode) {\n      console.info(`[HTTP-MGR INFO] ${context}: ${message}`, data ?? '');\n    }\n  }\n\n  /**\n   * Warning level logging - only shown in development mode\n   * Use for: Potential issues, deprecated usage, recoverable errors\n   */\n  warn(context: string, message: string, data?: any): void {\n    if (this.debugMode) {\n      console.warn(`[HTTP-MGR WARN] ${context}: ${message}`, data ?? '');\n    }\n  }\n\n  /**\n   * Error level logging - only shown in development mode\n   * Use for: Actual errors, failures, exceptions\n   */\n  error(context: string, message: string, data?: any): void {\n    if (this.debugMode) {\n      console.error(`[HTTP-MGR ERROR] ${context}: ${message}`, data ?? '');\n    }\n  }\n\n  /**\n   * Check if debug mode is enabled (development mode)\n   */\n  isDebugEnabled(): boolean {\n    return this.debugMode;\n  }\n\n  private isDebugFlagEnabled(): boolean {\n    try {\n      if (typeof globalThis === 'undefined' || !globalThis.localStorage) {\n        return true;\n      }\n\n      const value = globalThis.localStorage.getItem(LoggerService.DEBUG_FLAG_KEY);\n      if (value === null) {\n        return true;\n      }\n\n      const normalized = value.trim().toLowerCase();\n      return !['0', 'false', 'off', 'no'].includes(normalized);\n    } catch {\n      return true;\n    }\n  }\n}\n","import { OperatorFunction } from 'rxjs';\nimport { filter, map } from 'rxjs/operators';\nimport { HttpEventType } from '@angular/common/http';\nimport { StreamType } from '../../request-manager-state-service/models/stream-type.enum';\nimport { StreamConfigModel } from '../../request-manager-state-service/models/stream-config.model';\nimport { StreamProgressModel } from '../../request-manager-state-service/models/stream-progress.model';\nimport { StreamOutputModel } from '../../request-manager-state-service/models/stream-output.model';\n\n/**\n * Stateful processor for managing streaming data and events\n */\nclass StreamingProcessor<T = any> {\n  private buffer = '';\n  private contentType = '';\n  private readonly maxBufferSize = 10 * 1024 * 1024; // 10MB limit\n  private streamConfig: StreamConfigModel;\n  private lastParsedLength = 0; // Track parsed position to avoid duplicates\n  private totalFromHeader: number | undefined;\n\n  constructor(config?: StreamConfigModel) {\n    this.streamConfig = config || new StreamConfigModel(StreamType.AI_STREAMING);\n  }\n\n  /**\n   * Process HTTP events and extract streaming data with progress\n   */\n  process(event: any): StreamOutputModel<T> | null {\n    switch (event.type) {\n      case HttpEventType.ResponseHeader:\n        this.contentType = event.headers?.get('content-type') || '';\n        // Read total from response header if configured\n        if (this.streamConfig.totalHeader && event.headers) {\n          const totalVal = event.headers.get(this.streamConfig.totalHeader);\n          if (totalVal !== undefined && totalVal !== null) {\n            const parsed = parseInt(totalVal, 10);\n            if (!isNaN(parsed)) {\n              this.totalFromHeader = parsed;\n            }\n          }\n        }\n        return null;\n\n      case HttpEventType.DownloadProgress:\n        if (event.partialText) {\n          this.buffer = event.partialText;\n          const parsedData = this.parseBuffer();\n\n          // Only return NEW items since last parse (progressive updates)\n          const newItems = parsedData.slice(this.lastParsedLength);\n          this.lastParsedLength = parsedData.length;\n\n          // Calculate progress — prefer record count from header, fall back to byte-level\n          const total = this.totalFromHeader ?? event.total;\n          const received = this.totalFromHeader ? this.lastParsedLength : event.loaded;\n          const percent = total\n            ? Math.round((received / total) * 100)\n            : 0;\n\n          const progress = StreamProgressModel.adapt({\n            received,\n            total,\n            percent,\n            stage: 'streaming'\n          });\n\n          return StreamOutputModel.adapt<T>({\n            data: newItems.length > 0 ? newItems : [],\n            progress\n          });\n        }\n        return null;\n\n      case HttpEventType.Response:\n        if (event.body) {\n          this.buffer = typeof event.body === 'string' ? event.body : this.buffer;\n          const parsedData = this.parseBuffer();\n\n          // Calculate final progress\n          const received = this.totalFromHeader ? parsedData.length : event.loaded;\n\n          const progress = StreamProgressModel.adapt({\n            received,\n            percent: 100,\n            stage: 'complete'\n          });\n\n          return StreamOutputModel.adapt<T>({\n            data: parsedData.length > 0 ? parsedData : [],\n            progress\n          });\n        }\n        return null;\n\n      default:\n        return null;\n    }\n  }\n\n  /**\n   * Append data to buffer with size management\n   */\n  private appendToBuffer(data: string): void {\n    this.buffer += data;\n\n    // Implement sliding window if buffer gets too large\n    if (this.buffer.length > this.maxBufferSize) {\n      this.buffer = this.buffer.slice(-this.maxBufferSize / 2);\n    }\n  }\n\n  /**\n   * Parse current buffer content\n   */\n  private parseBuffer(): T[] {\n    if (!this.buffer.trim()) {\n      return [];\n    }\n\n    try {\n      const result = parseStreamData(this.buffer, this.contentType, this.streamConfig);\n      return result as T[];\n    } catch (error) {\n      console.warn('Failed to parse streaming data:', error);\n      return [];\n    }\n  }\n\n  /**\n   * Reset processor state\n   */\n  reset(): void {\n    this.buffer = '';\n    this.contentType = '';\n    this.lastParsedLength = 0;\n    this.totalFromHeader = undefined;\n  }\n\n  /**\n   * Update configuration\n   */\n  updateConfig(config: StreamConfigModel): void {\n    this.streamConfig = config;\n  }\n}\n\n/**\n * Safe JSON parsing with error handling\n */\nfunction safeJsonParse<T>(jsonStr: string, fallback?: T): T | null {\n  try {\n    return JSON.parse(jsonStr);\n  } catch {\n    return fallback || null;\n  }\n}\n\n/**\n * Safe JSON array parsing\n */\nfunction safeJsonArrayParse<T>(jsonStr: string, fallback: T[] = []): T[] {\n  try {\n    const parsed = JSON.parse(jsonStr);\n    return Array.isArray(parsed) ? parsed : fallback;\n  } catch {\n    return fallback;\n  }\n}\n\n/**\n * Enhanced JSON object extraction with better error handling\n */\nfunction extractJsonObjects(text: string): string[] {\n  const objects: string[] = [];\n  let braceCount = 0;\n  let currentObject = '';\n  let inString = false;\n  let escaped = false;\n\n  for (let i = 0; i < text.length; i++) {\n    const char = text[i];\n\n    if (escaped) {\n      currentObject += char;\n      escaped = false;\n      continue;\n    }\n\n    if (char === '\\\\') {\n      escaped = true;\n      currentObject += char;\n      continue;\n    }\n\n    if (char === '\"' && !escaped) {\n      inString = !inString;\n    }\n\n    if (!inString) {\n      if (char === '{') braceCount++;\n      else if (char === '}') braceCount--;\n    }\n\n    currentObject += char;\n\n    if (braceCount === 0 && currentObject.trim()) {\n      objects.push(currentObject.trim());\n      currentObject = '';\n    }\n  }\n\n  return objects;\n}\n\n/**\n * COMPREHENSIVE REQUEST STREAMING OPERATOR - FULLY ABSTRACTED\n * Refactored for better type safety and memory management\n *\n * Single function that handles ALL streaming formats without hardcoded assumptions:\n * - JSON format (Individual JSON objects)\n * - NDJSON format (Newline delimited JSON)\n * - AI streaming format (Real-time AI responses)\n * - Server-Sent Events format\n * - Auto-detection mode\n *\n * Usage:\n *   this.http.get(url, options).pipe(requestStreaming()).subscribe(data => {...})\n *   this.http.get(url, options).pipe(requestStreaming({ streamType: StreamType.NDJSON })).subscribe(data => {...})\n */\nexport function requestStreaming<T = any>(config?: StreamConfigModel): OperatorFunction<any, StreamOutputModel<T>> {\n  const processor = new StreamingProcessor<T>(config);\n\n  return input$ => input$.pipe(\n    // Filter only streaming-related events\n    filter((event: any) =>\n      event.type === HttpEventType.DownloadProgress ||\n      event.type === HttpEventType.Response ||\n      event.type === HttpEventType.ResponseHeader\n    ),\n\n    // Process events using the streaming processor\n    map((event: any) => {\n      const result = processor.process(event);\n      return result;\n    }),\n\n    // Filter out null results\n    filter((result): result is StreamOutputModel<T> => result !== null)\n  );\n}\n\n/**\n * Main streaming data parser - handles ALL formats based on streamType\n */\nfunction parseStreamData(buffer: string, contentType: string, config: StreamConfigModel): any[] {\n  const results: any[] = [];\n\n  if (!buffer.trim()) {\n    return results;\n  }\n\n  // Determine parsing format based on streamType and content type\n  const format = config.streamType === StreamType.AI_STREAMING ? detectFormat(buffer, contentType) : config.streamType;\n\n  switch (format) {\n    case StreamType.NDJSON:\n      return parseNdjson(buffer, config);\n\n    case StreamType.JSON:\n      return parseJsonObjects(buffer, config);\n\n    case StreamType.AI_STREAMING:\n      return parseAiStreaming(buffer, config);\n\n    case StreamType.EVENT_STREAM:\n      return parseEventStream(buffer, config);\n\n    default:\n      return autoParse(buffer, contentType, config);\n  }\n}\n\n/**\n * Parse NDJSON format (JSON objects per line)\n */\nfunction parseNdjson(buffer: string, config: StreamConfigModel): any[] {\n  const results: any[] = [];\n  const lines = buffer.split('\\n');\n\n  // If the buffer doesn't end with \\n, the last segment is an incomplete partial line — skip it\n  const completeLines = buffer.endsWith('\\n') ? lines : lines.slice(0, -1);\n\n  completeLines.filter(line => line.trim()).forEach(line => {\n    const trimmedLine = line.trim();\n    if (trimmedLine && trimmedLine.startsWith('{')) {\n      const parsed = safeJsonParse(trimmedLine);\n      if (parsed) results.push(parsed);\n    }\n  });\n\n  return results;\n}\n\n/**\n * Parse individual JSON objects\n */\nfunction parseJsonObjects(buffer: string, config: StreamConfigModel): any[] {\n  const results: any[] = [];\n  const jsonObjects = extractJsonObjects(buffer);\n\n  // Parses directly (rather than via safeJsonParse()'s truthy-return convention) so a\n  // legitimately falsy parsed value (0, false, null, \"\") isn't mistaken for a parse failure.\n  jsonObjects.forEach(jsonStr => {\n    try {\n      results.push(JSON.parse(jsonStr));\n    } catch {\n      // not valid JSON — skip this fragment\n    }\n  });\n\n  return results;\n}\n\n/**\n * Parse AI streaming format\n */\nfunction parseAiStreaming(buffer: string, config: StreamConfigModel): any[] {\n  const results: any[] = [];\n  const jsonObjects = extractJsonObjects(buffer);\n\n  jsonObjects.forEach(jsonStr => {\n    const parsed = safeJsonParse(jsonStr);\n    if (parsed && typeof parsed === 'object' && parsed !== null && 'type' in parsed) {\n      const typedParsed = parsed as any;\n      if (['ai_thinking', 'ai_response', 'ai_suggestion', 'ai_status'].includes(typedParsed.type)) {\n        results.push(typedParsed);\n      }\n    }\n  });\n\n  return results;\n}\n\n/**\n * Parse Server-Sent Events format\n */\nfunction parseEventStream(buffer: string, config: StreamConfigModel): any[] {\n  const results: any[] = [];\n  const rawEvents = buffer.split('\\n\\n');\n\n  // If the buffer doesn't end with \\n\\n, the last segment is an incomplete partial event — skip it\n  const completeEvents = buffer.endsWith('\\n\\n') ? rawEvents : rawEvents.slice(0, -1);\n\n  const events = completeEvents.filter(event => event.trim());\n\n  events.forEach(event => {\n    const lines = event.split('\\n');\n    let eventData = '';\n\n    lines.forEach(line => {\n      if (line.startsWith('data: ')) {\n        eventData += line.substring(6);\n      }\n    });\n\n    if (eventData) {\n      try {\n        const parsed = JSON.parse(eventData);\n        if(parsed) results.push(parsed);\n      } catch (e) {\n        results.push({\n          content: eventData,\n          _streamType: 'event_stream',\n          _format: StreamType.EVENT_STREAM,\n          _timestamp: new Date().toISOString()\n        });\n      }\n    }\n  });\n\n  return results;\n}\n\n/**\n * Auto-detect and parse unknown formats\n */\nfunction autoParse(buffer: string, contentType: string, config: StreamConfigModel): any[] {\n  // Delegate classification to detectFormat() so both auto-detecting entry points\n  // (this and the default/AI_STREAMING path in parseStreamData) agree on the format.\n  switch (detectFormat(buffer, contentType)) {\n    case StreamType.NDJSON:\n      return parseNdjson(buffer, config);\n\n    case StreamType.EVENT_STREAM:\n      return parseEventStream(buffer, config);\n\n    case StreamType.AI_STREAMING:\n      return parseAiStreaming(buffer, config);\n\n    default:\n      // detectFormat() defaults to JSON when nothing else matches; only treat the\n      // buffer as JSON if it actually contains extractable JSON, else fall back to text.\n      if (extractJsonObjects(buffer).length > 0) {\n        return parseJsonObjects(buffer, config);\n      }\n      return buffer.split('\\n').filter(line => line.trim()).map(line => ({\n        content: line.trim(),\n        _streamType: 'text',\n        _format: 'plain',\n        _timestamp: new Date().toISOString()\n      }));\n  }\n}\n\n/**\n * Detect streaming format from content\n */\nfunction detectFormat(buffer: string, contentType: string): StreamType {\n  if (contentType.includes('application/x-ndjson') || isNdjsonFormat(buffer)) {\n    return StreamType.NDJSON;\n  }\n\n  if (contentType.includes('text/event-stream')) {\n    return StreamType.EVENT_STREAM;\n  }\n\n  if (contentType.includes('application/json') || buffer.includes('{')) {\n    // Check if it looks like AI streaming\n    if (buffer.includes('\"type\":') && buffer.includes('\"ai_')) {\n      return StreamType.AI_STREAMING;\n    }\n    return StreamType.JSON;\n  }\n\n  return StreamType.JSON; // Default\n}\n\n/**\n * Check if buffer is NDJSON format\n */\nfunction isNdjsonFormat(buffer: string): boolean {\n  const lines = buffer.split('\\n').filter(line => line.trim());\n  const jsonLines = lines.filter(line => line.trim().startsWith('{') && line.trim().endsWith('}'));\n  return jsonLines.length > 1 || (lines.length > 1 && jsonLines.length > 0);\n}\n\n/**\n * Convenience functions for common use cases\n */\n\n// Stream with JSON format\nexport function streamJSON<T = any>(): OperatorFunction<any, StreamOutputModel<T>> {\n  return requestStreaming<T>(StreamConfigModel.adapt({ streamType: StreamType.JSON }));\n}\n\n// Stream with NDJSON format\nexport function streamNDJSON<T = any>(): OperatorFunction<any, StreamOutputModel<T>> {\n  return requestStreaming<T>(StreamConfigModel.adapt({ streamType: StreamType.NDJSON }));\n}\n\n// Stream AI responses\nexport function streamAI<T = any>(): OperatorFunction<any, StreamOutputModel<T>> {\n  return requestStreaming<T>(StreamConfigModel.adapt({ streamType: StreamType.AI_STREAMING }));\n}\n\n// Stream Server-Sent Events\nexport function streamEvents<T = any>(): OperatorFunction<any, StreamOutputModel<T>> {\n  return requestStreaming<T>(StreamConfigModel.adapt({ streamType: StreamType.EVENT_STREAM }));\n}\n\n// Auto-detect streaming format\nexport function streamAuto<T = any>(): OperatorFunction<any, StreamOutputModel<T>> {\n  return requestStreaming<T>(StreamConfigModel.adapt({ streamType: StreamType.AUTO }));\n}\n","export interface DatabaseStorageInterface {\n  table: string\n  expiresIn: string\n  deltaSync?: boolean\n  reconcile?: boolean\n  reconcileIntervalMs?: number\n}\n\nexport class DatabaseStorage implements DatabaseStorageInterface {\n\n  constructor(\n    public table = '',\n    public expiresIn: '',    public deltaSync = false,\n    public reconcile = false,\n    public reconcileIntervalMs = 60000,\n  ) {}\n\n  static adapt(item?: any): any {\n\n    if(!item?.table) return\n\n    return new DatabaseStorage(\n      item?.table,\n      item?.expiresIn,\n      item?.deltaSync ?? false,\n      item?.reconcile ?? false,\n      item?.reconcileIntervalMs ?? 60000,\n    )\n\n  }\n\n}\n","export interface BatchOptionsInterface {\n  mode?: 'sequential' | 'parallel';\n  stopOnError?: boolean;\n  concurrency?: number;\n  ignoreErrors?: boolean;\n  logErrors?: boolean;\n  displaySuccess?: boolean;\n  displayError?: boolean;\n}\n\nexport class BatchOptions implements BatchOptionsInterface {\n  constructor(\n    public mode: 'sequential' | 'parallel' = 'sequential',\n    public stopOnError: boolean = false,\n    public concurrency: number = 3,\n    public ignoreErrors: boolean = false,\n    public logErrors: boolean = true,\n    public displaySuccess?: boolean,\n    public displayError?: boolean,\n  ) {}\n\n  static adapt(item?: any): BatchOptions {\n    return new BatchOptions(\n      item?.mode ?? 'sequential',\n      item?.stopOnError ?? false,\n      item?.concurrency ?? 3,\n      item?.ignoreErrors ?? false,\n      item?.logErrors !== false,\n      item?.displaySuccess ?? false,\n      item?.displayError ?? false,\n    );\n  }\n}\n","export interface BatchResultInterface<T = any> {\n  request: any;\n  success: boolean;\n  data?: T;\n  error?: any;\n  index: number;\n  timestamp: number;\n}\n\nexport class BatchResult<T = any> implements BatchResultInterface<T> {\n  constructor(\n    public request: any,\n    public success: boolean,\n    public data?: T,\n    public error?: any,\n    public index: number = 0,\n    public timestamp: number = Date.now(),\n  ) {}\n\n  static adapt<T>(item?: any): BatchResult<T> {\n    return new BatchResult<T>(\n      item?.request,\n      item?.success ?? false,\n      item?.data,\n      item?.error,\n      item?.index ?? 0,\n      item?.timestamp ?? Date.now(),\n    );\n  }\n}\n","export type BatchRequestState<T> = \n  | BatchPendingState\n  | BatchSuccessState<T>\n  | BatchErrorState;\n\nexport interface BatchPendingState {\n  index: number;\n  request: any;\n  isPending: true;\n  data?: undefined;\n  error?: undefined;\n}\n\nexport interface BatchSuccessState<T> {\n  index: number;\n  request: any;\n  isPending: false;\n  data: T;\n  error?: undefined;\n}\n\nexport interface BatchErrorState {\n  index: number;\n  request: any;\n  isPending: false;\n  data?: undefined;\n  error: any;\n}\n\nexport function isPendingState<T>(state: BatchRequestState<T>): state is BatchPendingState {\n  return state.isPending === true;\n}\n\nexport function isSuccessState<T>(state: BatchRequestState<T>): state is BatchSuccessState<T> {\n  return state.isPending === false && state.data !== undefined;\n}\n\nexport function isErrorState<T>(state: BatchRequestState<T>): state is BatchErrorState {\n  return state.isPending === false && state.error !== undefined;\n}\n","import { BatchRequestState } from './batch-request-state.model';\n\nexport interface BatchProgress {\n  total: number;\n  pending: number;\n  completed: number;\n  failed: number;\n  percent: number;\n}\n\nexport function calculateBatchProgress<T>(states: BatchRequestState<T>[]): BatchProgress {\n  const total = states.length;\n  const pending = states.filter(s => s.isPending).length;\n  const completed = states.filter(s => !s.isPending && s.data !== undefined).length;\n  const failed = states.filter(s => !s.isPending && s.error !== undefined).length;\n  const percent = total > 0 ? Math.round(((completed + failed) / total) * 100) : 0;\n\n  return { total, pending, completed, failed, percent };\n}\n","export enum DataType {\n  ANY = 0,\n  ARRAY,\n  OBJECT\n}\n","export interface InvalidFileInfoInterface {\n  fileName: string;\n  fileSize: number;\n  fileType: string;\n  errors: string[];\n}\n\nexport class InvalidFileInfoModel implements InvalidFileInfoInterface {\n  constructor(\n    public fileName: string = '',\n    public fileSize: number = 0,\n    public fileType: string = '',\n    public errors: string[] = []\n  ) {}\n\n  static adapt(item?: any): InvalidFileInfoModel {\n    return new InvalidFileInfoModel(\n      item?.fileName,\n      item?.fileSize,\n      item?.fileType,\n      Array.isArray(item?.errors) ? item.errors : []\n    );\n  }\n}\n\nexport interface UploadValidationErrorInterface {\n  invalidFiles: InvalidFileInfoModel[];\n  validFilesCount: number;\n  totalFilesCount: number;\n}\n\nexport class UploadValidationErrorModel implements UploadValidationErrorInterface {\n  constructor(\n    public invalidFiles: InvalidFileInfoModel[] = [],\n    public validFilesCount: number = 0,\n    public totalFilesCount: number = 0\n  ) {}\n\n  static adapt(item?: any): UploadValidationErrorModel {\n    return new UploadValidationErrorModel(\n      Array.isArray(item?.invalidFiles) ? item.invalidFiles.map((f: any) => InvalidFileInfoModel.adapt(f)) : [],\n      item?.validFilesCount,\n      item?.totalFilesCount\n    );\n  }\n}\n","export interface ErrorDisplaySettingsInterface {\n  displayTime: number\n  position: string\n}\n\nexport class ErrorDisplaySettings implements ErrorDisplaySettingsInterface {\n\n  constructor(\n    public displayTime = 3 * 1000,\n    public position = 'top'\n  ) {}\n\n  static adapt(item?: any): ErrorDisplaySettings {\n\n    return new ErrorDisplaySettings(\n      (item?.displayTime) ? item.displayTime * 1000 : 3 * 1000,\n      item?.position,\n    )\n\n  }\n\n}\n","import { HttpContextToken } from '@angular/common/http'\n\n// Set by RequestService when the caller already shows its own error toast (ApiRequest.displayError).\n// RequestErrorInterceptor checks this to skip its own toast without silencing unrelated HttpClient callers.\nexport const OWNS_ERROR_DISPLAY = new HttpContextToken<boolean>(() => false)\n","import { HttpClient, HttpContext, HttpEvent, HttpEventType, HttpHeaderResponse } from '@angular/common/http';\nimport { Injectable, inject, signal } from '@angular/core';\nimport { Observable, Subject, throwError } from 'rxjs';\nimport { catchError, filter, finalize, map, tap } from 'rxjs/operators';\n\nimport { ApiRequest } from '../request-manager-state-service/models/api-request.model';\nimport { StreamType } from '../request-manager-state-service/models/stream-type.enum';\nimport { PathQueryService, HeadersService, toSyncObservable } from '../utils';\nimport { requestStreaming } from './rxjs-operators/request-streaming';\nimport { StreamConfigModel } from '../request-manager-state-service/models/stream-config.model';\nimport { StreamOutputModel } from '../request-manager-state-service/models/stream-output.model';\nimport { StreamProgressModel } from '../request-manager-state-service/models/stream-progress.model';\nimport { InvalidFileInfoModel, UploadValidationErrorModel } from '../../models';\nimport { OWNS_ERROR_DISPLAY } from '../../interceptors/models';\n\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class RequestService {\n\n  private http = inject(HttpClient)\n\n  private pathQueryService = inject(PathQueryService)\n  private headersService = inject(HeadersService)\n\n  // Pinged synchronously by every signal mutation below, so the `$` observables derived via\n  // toSyncObservable() emit once per change, in order, none skipped — see that util's own\n  // comment for why this isn't toObservable()/effect()-backed. protected (not private): the sole\n  // subclass, HTTPManagerService, mutates these inherited signals directly from its own request\n  // wrappers and needs to ping the same Subject those signals' `$` observables listen to; it also\n  // reuses this Subject for its own signals (data/error/countdown/batch state) rather than\n  // maintaining a second one.\n  protected readonly stateChanged$ = new Subject<void>()\n\n  isPending = signal(false)\n  isPending$: Observable<boolean> = toSyncObservable(this.isPending, this.stateChanged$)\n\n  progress = signal(0)\n  progress$: Observable<number> = toSyncObservable(this.progress, this.stateChanged$)\n\n  streamProgress = signal<StreamProgressModel>(new StreamProgressModel())\n  streamProgress$: Observable<StreamProgressModel> = toSyncObservable(this.streamProgress, this.stateChanged$)\n\n  getRecordRequest<T>(options: ApiRequest): Observable<T>;\n  // Overload for non-streaming requests\n  getRecordRequest<T>(options: ApiRequest): Observable<T>;\n  // Overload for streaming requests\n  getRecordRequest<T>(options: ApiRequest & { stream: true }): Observable<T[]>;\n  // Implementation\n  getRecordRequest<T>(options: ApiRequest): Observable<any> {\n    const urlPath = this.buildUrlPath(options);\n    const headers = this.buildCombinedHeaders(options);\n\n    this.isPending.set(true);\n    this.stateChanged$.next();\n\n    return (options.stream)\n        ? this.http.get<any>(urlPath, {\n            ...headers,\n            observe: 'events',\n            responseType: 'text',\n            reportProgress: true\n          }).pipe(\n            requestStreaming(StreamConfigModel.adapt({ streamType: options.streamType || StreamType.NDJSON, totalHeader: 'X-Total-Count' })),\n            this.requestStreaming(options),\n            this.handleStreamProgressFinalize()\n          )\n        : this.http.get<T>(urlPath, headers).pipe(\n            this.request(options),\n            this.handleStreamProgressFinalize()\n        )\n  }\n\n  createRecordRequest<T>(options: ApiRequest, data: any): Observable<T>;\n  createRecordRequest<T>(options: ApiRequest & { stream: true }, data: any): Observable<T[]>;\n  createRecordRequest<T>(options: ApiRequest, data: any): Observable<T>;\n  createRecordRequest<T>(options: ApiRequest & { stream: true }, data: any): Observable<T[]>;\n  createRecordRequest<T>(options: ApiRequest, data: any): Observable<any> {\n\n    const urlPath = this.buildUrlPath(options);\n    const headers = this.buildCombinedHeaders(options);\n\n    this.isPending.set(true);\n    this.stateChanged$.next();\n\n    return (options.stream)\n        ? this.http.post<any>(urlPath, data, {\n            ...headers,\n            observe: 'events',\n            responseType: 'text',\n            reportProgress: true\n          }).pipe(\n            requestStreaming(StreamConfigModel.adapt({ streamType: options.streamType || StreamType.NDJSON, totalHeader: 'X-Total-Count' })),\n            this.requestStreaming(options),\n            this.handleStreamProgressFinalize()\n          )\n        : this.http.post<T>(urlPath, data, headers).pipe(\n            this.request(options),\n            this.handleStreamProgressFinalize()\n        )\n  }\n\n  updateRecordRequest<T>(options: ApiRequest, data: any): Observable<T> {\n    const urlPath = this.buildUrlPath(options);\n    const headers = this.buildHeaders(options);\n\n    this.isPending.set(true);\n    this.stateChanged$.next();\n\n    return this.http.put<any>(urlPath, data, headers).pipe(\n        this.request(options),\n        this.handleFinalize()\n    )\n  }\n\n  patchRecordRequest<T>(options: ApiRequest, data: any): Observable<T> {\n    const urlPath = this.buildUrlPath(options);\n    const headers = this.buildHeaders(options);\n\n    this.isPending.set(true);\n    this.stateChanged$.next();\n\n    return this.http.patch<any>(urlPath, data, headers).pipe(\n        this.request(options),\n        this.handleFinalize()\n    )\n  }\n\n  deleteRecordRequest<T>(options: ApiRequest): Observable<T> {\n\n    const urlPath = this.buildUrlPath(options);\n    const headers = this.buildHeaders(options);\n\n    this.isPending.set(true);\n    this.stateChanged$.next();\n\n    return this.http.delete<any>(urlPath, headers).pipe(\n      this.request(options),\n      this.handleFinalize()\n    )\n  }\n\n  // Helper functions\n  private buildUrlPath(options: ApiRequest): string {\n    return this.pathQueryService.buildAPIPath(options.server, options.path);\n  }\n\n  private buildHeaders(options: ApiRequest): any {\n    return { ...this.headersService.generateHeaders(options.headers), ...this.buildErrorDisplayContext(options) };\n  }\n\n  private buildCombinedHeaders(options: ApiRequest): any {\n    const headers = { ...this.headersService.generateHeaders(options.headers), ...this.buildErrorDisplayContext(options) }\n    return this.combineHeaders(headers, options.stream || false)\n  }\n\n  // Lets RequestErrorInterceptor know this call already shows its own error toast\n  // (HTTPManagerService's displayError-gated one), so it should skip its own.\n  private buildErrorDisplayContext(options: ApiRequest): { context: HttpContext } {\n    return { context: new HttpContext().set(OWNS_ERROR_DISPLAY, !!options.displayError) }\n  }\n\n  // Resolves a dot-delimited path (e.g. 'data' or 'data.items') against a response body,\n  // isolating the sub-value that request()/requestStreaming() adapt. Any missing segment along\n  // the path resolves to undefined, which the existing empty-response check already handles.\n  private resolveSelector(data: any, selector?: string): any {\n    if (!selector) return data\n    return selector.split('.').reduce((value: any, key: string) => value?.[key], data)\n  }\n\n  private request<T>(options: ApiRequest): (source: Observable<any>) => Observable<T> {\n    return (source$: Observable<any>): Observable<T> => {\n      return source$.pipe(\n        map(data => {\n          const selected = this.resolveSelector(data, options?.selector)\n          if (!selected || (Array.isArray(selected) && selected.length === 0)) {\n            return selected\n          }\n          if (options?.adapter) {\n            return Array.isArray(selected)\n              ? selected.map((item: any) => options.adapter(item))\n              : options.adapter(selected)\n          }\n          return selected\n        })\n      )\n    }\n  }\n\n  private requestStreaming<T>(options: ApiRequest): (source: Observable<StreamOutputModel<T>>) => Observable<T[]> {\n    return (source$: Observable<StreamOutputModel<T>>): Observable<T[]> => {\n      return source$.pipe(\n        tap(output => {\n          // Update progress from stream output\n          this.progress.set(output.progress.received);\n          this.streamProgress.set(output.progress);\n          this.stateChanged$.next();\n        }),\n        map(output => {\n          const data = this.resolveSelector(output.data, options?.selector)\n          if (!data || (Array.isArray(data) && data.length === 0)) {\n            return data\n          }\n          if (options?.adapter) {\n            return data.map((item: any) => options.adapter(item))\n          }\n          return data\n        })\n      )\n    }\n  }\n\n  downloadFileRequest(options: ApiRequest): Observable<any> {\n\n    this.isPending.set(true);\n    this.stateChanged$.next();\n\n    const urlPath = this.buildUrlPath(options);\n\n    return this.http.get(urlPath, { responseType: 'blob', observe: 'events', reportProgress: true })\n    .pipe(\n      map((event: HttpEvent<any>) => {\n\n        this.isPending.set(true)\n        this.stateChanged$.next();\n\n        if (event instanceof HttpHeaderResponse) {\n          if(event.status !== 200) {\n            this.isPending.set(false)\n            this.stateChanged$.next();\n            throw new Error('Download failed');\n          }\n        }\n\n        // 0\tSent\tRequest has been sent.\n        // 1\tUploadProgress\tUpload is in progress.\n        // 2\tResponseHeader\tResponse headers received.\n        // 3\tDownloadProgress\tDownload is in progress.\n        // 4\tResponse\tResponse is fully received.\n        // 5\tUser\tCustom user event.\n\n        switch (event.type) {\n\n          case HttpEventType.DownloadProgress:\n\n          const status = (event.total) ? Math.round(event.loaded / (event.total || 1) * 100) : 100\n          this.progress.set(status)\n          this.stateChanged$.next();\n          return status\n\n          case HttpEventType.Response:\n\n            try {\n\n              const fileNamePath = (options?.saveAs) ? options.saveAs : (options.path) ? options.path[options.path.length - 1] : []\n              const fileContentHeader = options.fileContentHeader || 'Content-Disposition'\n              const header_content = event.headers.get(fileContentHeader);\n\n              // checks if header_content is not empty and splits the header_content to get the file name\n              // otherwise, it will use the fileDownload - contains the file name and extension\n              const file = (header_content) ? header_content.split('=')[1].substring(0, header_content.split('=')[1].length) : ''\n\n              const fileName = (file) ? file : fileNamePath\n\n              if (fileName === '') {\n                this.isPending.set(false);\n                this.stateChanged$.next();\n                throw new Error('Save File: (file name and extension) not found in Headers or Path');\n              }\n\n              this.downloadFile(fileName, event.body)\n              this.isPending.set(false)\n              this.stateChanged$.next();\n\n              return 100\n\n            } catch (error) {\n              throw new Error('Download failed');\n            }\n\n            default:\n              this.isPending.set(false)\n              this.stateChanged$.next();\n              return 0\n        }\n\n      }),\n      catchError(err => {\n        return throwError(() => err)\n      })\n    )\n  }\n\n  uploadFileRequest(options: ApiRequest): Observable<any> {\n    this.isPending.set(true);\n    this.stateChanged$.next();\n\n    const files = options.uploadFiles ? (Array.isArray(options.uploadFiles) ? options.uploadFiles : [options.uploadFiles]) : [];\n    const validation = this.validateUploadFiles(files, options);\n\n    if (validation.validFiles.length === 0) {\n      this.isPending.set(false);\n      this.stateChanged$.next();\n      return throwError(() => new UploadValidationErrorModel(\n        validation.invalidFiles,\n        0,\n        files.length\n      ));\n    }\n\n    const fieldName = options.uploadFieldName || (files.length === 1 ? 'file' : 'files');\n    const formData = this.buildFormData(validation.validFiles, fieldName);\n    const urlPath = this.buildUrlPath(options);\n    const method = options.uploadHttpMethod || 'POST';\n\n    return this.http.request(method, urlPath, {\n      body: formData,\n      observe: 'events',\n      reportProgress: true,\n      ...this.buildErrorDisplayContext(options)\n    }).pipe(\n      map((event: HttpEvent<any>) => {\n        this.isPending.set(true);\n        this.stateChanged$.next();\n\n        switch (event.type) {\n          case HttpEventType.UploadProgress:\n            const status = event.total ? Math.round(event.loaded / (event.total || 1) * 100) : 0;\n            this.progress.set(status);\n            this.stateChanged$.next();\n            return null;\n\n          case HttpEventType.Response:\n            this.isPending.set(false);\n            this.progress.set(0);\n            this.stateChanged$.next();\n            return event.body;\n\n          default:\n            return null;\n        }\n      }),\n      filter((body: any) => body !== null),\n      catchError(err => {\n        this.isPending.set(false);\n        this.progress.set(0);\n        this.stateChanged$.next();\n        return throwError(() => err);\n      })\n    );\n  }\n\n  private validateUploadFiles(files: File[], options: ApiRequest): { validFiles: File[]; invalidFiles: InvalidFileInfoModel[] } {\n    const validFiles: File[] = [];\n    const invalidFiles: InvalidFileInfoModel[] = [];\n    let totalSize = 0;\n\n    for (const file of files) {\n      const errors: string[] = [];\n\n      if (options.allowedTypes && options.allowedTypes.length > 0) {\n        const isAllowed = options.allowedTypes.some(type => {\n          if (type.endsWith('/*')) {\n            return file.type.startsWith(type.replace('/*', '/'));\n          }\n          return file.type === type;\n        });\n        if (!isAllowed) {\n          errors.push('type not allowed');\n        }\n      }\n\n      const maxFileSize = options.maxFileSize !== undefined ? options.maxFileSize : Infinity;\n      if (file.size > maxFileSize) {\n        errors.push('exceeds maxFileSize');\n      }\n\n      if (errors.length > 0) {\n        invalidFiles.push(new InvalidFileInfoModel(file.name, file.size, file.type, errors));\n      } else {\n        validFiles.push(file);\n        totalSize += file.size;\n      }\n    }\n\n    const maxTotalSize = options.maxTotalSize !== undefined ? options.maxTotalSize : Infinity;\n    if (totalSize > maxTotalSize) {\n      return {\n        validFiles: [],\n        invalidFiles: [\n          new InvalidFileInfoModel(\n            'total',\n            totalSize,\n            '',\n            ['exceeds maxTotalSize']\n          )\n        ]\n      };\n    }\n\n    return { validFiles, invalidFiles };\n  }\n\n  private buildFormData(files: File[], fieldName: string): FormData {\n    const formData = new FormData();\n    files.forEach((file) => {\n      formData.append(fieldName, file);\n    });\n    return formData;\n  }\n\n  // Resets isPending only. Used by methods with no streamProgress semantics (update/patch/delete\n  // never had a `stream` option, matching HTTPManagerService's scoping of streamProgress to\n  // get/create). finalize() covers both success and error paths.\n  private handleFinalize(): (source: Observable<any>) => Observable<any> {\n    return finalize(() => {\n      this.isPending.set(false);\n      this.stateChanged$.next();\n    });\n  }\n\n  // Resets isPending and advances streamProgress to a terminal stage — 'complete' on success,\n  // 'error' on failure — for every get/create request, whether or not it streams. Uses tap's\n  // `complete` callback (not finalize) for the success case: finalize()'s teardown runs during\n  // unsubscription, which happens AFTER catchError has already handled an error and replaced the\n  // stream — placing the stage-transition there would let a failing request's 'error' stage get\n  // overwritten back to 'complete'. tap({ complete }) only fires on a clean completion, never on\n  // error, so the two stages can't clobber each other regardless of pipe order.\n  private handleStreamProgressFinalize(): (source: Observable<any>) => Observable<any> {\n    return (source$: Observable<any>): Observable<any> => source$.pipe(\n      tap({\n        complete: () => {\n          this.streamProgress.update(p => StreamProgressModel.adapt({ ...p, stage: 'complete' }));\n          this.stateChanged$.next();\n        }\n      }),\n      catchError(err => {\n        this.streamProgress.update(p => StreamProgressModel.adapt({ ...p, stage: 'error' }));\n        this.stateChanged$.next();\n        return throwError(() => err);\n      }),\n      finalize(() => {\n        this.isPending.set(false);\n        this.stateChanged$.next();\n      })\n    );\n  }\n\n  private downloadFile(file:string, fileData: any) {\n\n    const navigatorAny = window.navigator as any\n\n    const extension = file.split('.')[1].toLowerCase()\n\n    var newBlob = new Blob([fileData], { type: this.createFileType(extension) })\n\n    if (navigatorAny.msSaveOrOpenBlob) {\n      navigatorAny.msSaveOrOpenBlob(newBlob, file)\n    } else {\n      const link = document.createElement('a')\n      const url = window.URL.createObjectURL(newBlob)\n      link.href = url\n      link.download = file\n      // Must be attached to the document for the click to reliably trigger a save in every\n      // browser/context — a detached anchor's click() is not guaranteed to be honored.\n      document.body.appendChild(link)\n      link.click()\n      document.body.removeChild(link)\n      window.URL.revokeObjectURL(url)\n    }\n\n  }\n\n  private createFileType(ext: any): string {\n\n    let fileType: string = \"\"\n\n    if (ext == 'pdf' || ext == 'csv') {\n      fileType = `application/${ext}`\n    }\n    else if (ext == 'jpeg' || ext == 'jpg' || ext == 'png') {\n      fileType = `image/${ext}`\n    }\n    else if (ext == 'txt') {\n      fileType = 'text/plain'\n    }\n\n    else if (ext == 'ppt' || ext == 'pot' || ext == 'pps' || ext == 'ppa') {\n      fileType = 'application/vnd.ms-powerpoint'\n    }\n    else if (ext == 'pptx') {\n      fileType = 'application/vnd.openxmlformats-officedocument.presentationml.presentation'\n    }\n    else if (ext == 'doc' || ext == 'dot') {\n      fileType = 'application/msword'\n    }\n    else if (ext == 'docx') {\n      fileType = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'\n    }\n    else if (ext == 'xls' || ext == 'xlt' || ext == 'xla') {\n      fileType = 'application/vnd.ms-excel'\n    }\n    else if (ext == 'xlsx') {\n      fileType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\n    }\n\n    return fileType\n\n  }\n\n  private combineHeaders(headers: any, isStreaming: boolean) {\n\n    return (isStreaming) ?\n    {\n      ...headers,\n      observe: 'events',\n      responseType: 'text',\n      reportProgress: true,\n      Accept: 'text/event-stream'\n    }\n    : headers\n\n  }\n\n}\n","import { Observable, defer, interval } from 'rxjs';\nimport { takeWhile, map, tap } from 'rxjs/operators';\n\nexport function countdown(duration: number): Observable<number> {\n\n  return defer(() => {\n\n    const currentCount = { current: duration }\n\n    return interval(1000).pipe(\n      map(() => --currentCount.current),\n      takeWhile(count => count >= 0)\n    )\n\n  })\n\n}\n","import { Observable, timer } from 'rxjs';\nimport { retry } from 'rxjs/operators';\n\nconst DEFAULT_MAX_RETRIES = 3;\n\nexport function delayedRetry<T>(delayMs: number, maxRetry = DEFAULT_MAX_RETRIES) {\n  return (src: Observable<T>) =>\n    src.pipe(\n      retry({\n        count: maxRetry,\n        delay: () => timer(delayMs)\n      })\n    );\n}\n\n\n","import { Observable, interval } from 'rxjs';\nimport { finalize, mergeMap, startWith, takeUntil } from 'rxjs/operators';\n\nexport function requestPolling<T>(pollInterval: number, stopCondition$: Observable<any>, isPending$: any) {\n  return (source: Observable<T>): Observable<T> => {\n    let activeCount = 0;\n\n    const setPending = (value: boolean) => {\n      try {\n        if (isPending$ && typeof isPending$.next === 'function') {\n          isPending$.next(value);\n        } else if (isPending$ && typeof isPending$.set === 'function') {\n          isPending$.set(value);\n        }\n      } catch (e) {\n        // no-op if setting fails\n      }\n    };\n\n    return interval(pollInterval * 1000)\n    .pipe(\n      startWith(0),\n      mergeMap(() => {\n        activeCount++;\n        if (activeCount === 1) setPending(true);\n\n        return source.pipe(\n          finalize(() => {\n            activeCount--;\n            if (activeCount === 0) setPending(false);\n          }),\n        );\n      }),\n      takeUntil(stopCondition$),\n    );\n  };\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable, Subscription, timer } from 'rxjs';\nimport { take } from 'rxjs/operators';\nimport { WSOptions } from '../../request-manager-state-service';\nimport { UUID_STR } from 'encryption-helpers';\n\n/**\n * WebSocketManagerService - Singleton WebSocket connection manager\n *\n * This service ensures only ONE WebSocket connection exists across ALL instances\n * of HTTPManagerStateService. It uses static properties to track connection state\n * globally, preventing duplicate connections when multiple state services are created.\n *\n * Usage:\n * - Inject into HTTPManagerService (or directly into state services)\n * - Call connect() with WSOptions - only the first call establishes connection\n * - Subsequent calls detect existing connection and skip reconnection\n * - All instances share the same connectionStatus$ and messages$ observables\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class WebSocketManagerService {\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // STATIC SINGLETON STATE (Shared across ALL instances)\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  private static socket: WebSocket | null = null;\n  private static isConnectingSubject = new BehaviorSubject<boolean>(false);\n  public isConnecting$ = WebSocketManagerService.isConnectingSubject.asObservable();\n  private static connectionInitialized = false;\n  private static shouldRetry = true;\n\n  // Store last options for reconnection\n  private static lastOptions: WSOptions | null = null;\n  private static lastJwtToken: string = '';\n\n\n  // Retry configuration\n  private static retryCount = 0;\n  private static retryDelay = 5000;\n  private static retrySubscription: Subscription | null = null;\n  private static maxRetries = 10;\n  private static connectionReadyNotified = false;\n  private static retryCountSubject = new BehaviorSubject<number>(0);\n  public retryCount$ = WebSocketManagerService.retryCountSubject.asObservable();\n  private static maxRetriesSubject = new BehaviorSubject<number>(10);\n  public maxRetries$ = WebSocketManagerService.maxRetriesSubject.asObservable();\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // INSTANCE OBSERVABLES (Shared across ALL instances via static BehaviorSubjects)\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  private static messages = new BehaviorSubject<any>(null);\n  public messages$: Observable<any> = WebSocketManagerService.messages.asObservable();\n\n  private static connectionStatus = new BehaviorSubject<boolean>(false);\n  public connectionStatus$: Observable<boolean> = WebSocketManagerService.connectionStatus.asObservable();\n\n  private static connectionError = new BehaviorSubject<string | null>(null);\n  public connectionError$: Observable<string | null> = WebSocketManagerService.connectionError.asObservable();\n\n  private static isSubscribed: boolean = false;\n\n  // Track currently subscribed channels\n  private static subscribedChannels = new BehaviorSubject<Set<string>>(new Set());\n  public subscribedChannels$: Observable<Set<string>> = WebSocketManagerService.subscribedChannels.asObservable();\n\n  // Channels whose subscribe frame has been sent but not yet server-confirmed. Separate from\n  // subscribedChannels (which only tracks confirmed subscriptions, by design — see\n  // sendSubscribeWithLastSeen) so that two near-simultaneous callers (e.g. two independent\n  // HTTPManagerStateService instances reacting to the same connect/channelsList event) don't\n  // both pass the \"not yet subscribed\" check and each send their own subscribe frame.\n  private static pendingSubscriptions = new Set<string>();\n\n  // Public method to get current subscribed channels\n  public static getSubscribedChannels(): Set<string> {\n    return WebSocketManagerService.subscribedChannels.getValue();\n  }\n\n  // Public method to add a channel to subscribed channels\n  public static addSubscribedChannel(channelName: string): void {\n    WebSocketManagerService.pendingSubscriptions.delete(channelName);\n    const current = new Set(WebSocketManagerService.subscribedChannels.value);\n    current.add(channelName);\n    WebSocketManagerService.subscribedChannels.next(current);\n    console.log(`📝 Added ${channelName} to subscribedChannels (now has ${current.size} channels)`);\n  }\n\n  // Reconnect event (emitted when connection is established/re-established)\n  private static onReconnect = new BehaviorSubject<void>(undefined);\n  public onReconnect$: Observable<void> = WebSocketManagerService.onReconnect.asObservable();\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // SESSION MANAGEMENT\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  private getSessionId(): string {\n    return sessionStorage.getItem('WSID') ?? (() => {\n      const uuid = UUID_STR()\n      sessionStorage.setItem('WSID', uuid)\n      return uuid\n    })()\n  }\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // CONNECTION MANAGEMENT\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  /**\n   * Connect to WebSocket server\n   *\n   * IMPORTANT: Only the first call across ALL instances will establish a connection.\n   * Subsequent calls will detect the existing connection and return immediately.\n   *\n   * @param options - WebSocket configuration options\n   * @param jwtToken - Optional JWT token for authentication\n   */\n  connect(options: WSOptions, jwtToken: string): void {\n    // Cancel any pending retry timer before attempting a new connection\n    WebSocketManagerService.retrySubscription?.unsubscribe();\n    WebSocketManagerService.retrySubscription = null;\n    WebSocketManagerService.connectionError.next(null);\n\n    // Guard: reject non-absolute WS URLs before touching any state\n    const wsServer = options?.wsServer ?? '';\n    if (!wsServer.startsWith('ws://') && !wsServer.startsWith('wss://')) {\n      console.error(`❌ Invalid WebSocket URL: '${wsServer}'. Must be an absolute ws:// or wss:// URL.`);\n      WebSocketManagerService.isConnectingSubject.next(false);\n      WebSocketManagerService.connectionStatus.next(false);\n      WebSocketManagerService.connectionError.next(`Invalid WebSocket URL: '${wsServer}'`);\n      return;\n    }\n\n    // Reset retryCount only on a fresh (non-retry) connection\n    if (options !== WebSocketManagerService.lastOptions) {\n      WebSocketManagerService.retryCount = 0;\n      WebSocketManagerService.retryCountSubject.next(0);\n    }\n\n    // Check if connection already exists and is open\n    if (WebSocketManagerService.socket) {\n      if (WebSocketManagerService.socket.readyState === WebSocket.OPEN) {\n        console.log('✓ WebSocket connection already OPEN (singleton).');\n        return;\n      }\n\n      if (WebSocketManagerService.socket.readyState === WebSocket.CONNECTING) {\n        console.log('⏳ WebSocket is already CONNECTING (singleton). Waiting for handshake.');\n        return;\n      }\n\n      // Clean up stale connection\n      if (WebSocketManagerService.socket.readyState === WebSocket.CLOSING ||\n          WebSocketManagerService.socket.readyState === WebSocket.CLOSED) {\n        console.log(`🧹 Cleaning up stale socket (State: ${WebSocketManagerService.socket.readyState}).`);\n        WebSocketManagerService.socket.close();\n        WebSocketManagerService.socket = null;\n      }\n    }\n\n    // Store jwt token for retry\n    WebSocketManagerService.lastJwtToken = jwtToken;\n    WebSocketManagerService.lastOptions = options;\n\n    // Always set maxRetries and delay from latest options\n    if (options?.retry?.times) {\n      WebSocketManagerService.maxRetries = options.retry.times;\n      WebSocketManagerService.maxRetriesSubject.next(options.retry.times);\n    } else {\n      WebSocketManagerService.maxRetries = 10;\n      WebSocketManagerService.maxRetriesSubject.next(10);\n    }\n\n    if (options?.retry?.delay) {\n      WebSocketManagerService.retryDelay = options.retry.delay * 1000;\n    } else {\n      WebSocketManagerService.retryDelay = 5000;\n    }\n\n    // Reset shouldRetry flag for new connection attempts\n    WebSocketManagerService.shouldRetry = true;\n\n    // Mark as connecting — connectionStatus false while connecting, true only when connected\n    WebSocketManagerService.isConnectingSubject.next(true);\n    WebSocketManagerService.isSubscribed = false;\n    WebSocketManagerService.connectionReadyNotified = false;\n    WebSocketManagerService.subscribedChannels.next(new Set());\n    // Don't set connectionStatus to true here - only set to true when connection is actually established\n    // WebSocketManagerService.connectionStatus.next(true);\n\n    const sessionId = this.getSessionId();\n    const URL = (jwtToken) ? `${options.wsServer}?token=${jwtToken}&sessionId=${sessionId}` : `${options.wsServer}?sessionId=${sessionId}`;\n\n    console.log(`🔌 Initiating WebSocket connection to: ${options.wsServer}`);\n\n    // Create new WebSocket instance (static)\n    WebSocketManagerService.socket = new WebSocket(URL);\n\n    WebSocketManagerService.socket.onopen = () => {\n      console.log(`📡 WebSocket handshake complete — awaiting server confirmation`);\n      // Force clear subscribedChannels on new connection - server lost our subscriptions\n      console.log('🧹 Clearing subscribedChannels on connect (was:', WebSocketManagerService.subscribedChannels.value.size, 'channels)');\n      WebSocketManagerService.subscribedChannels.next(new Set());\n      WebSocketManagerService.connectionInitialized = true;\n      // Do NOT set isConnecting=false here — TCP handshake is not app-level auth.\n      // isConnecting goes false only when onmessage confirms auth or a terminal failure occurs.\n      // Do NOT set connectionStatus to true here - wait for server to confirm authentication via onmessage\n    };\n\n    WebSocketManagerService.socket.onmessage = (event) => {\n      try {\n        const data = JSON.parse(event.data);\n\n        if (data.error) {\n          WebSocketManagerService.messages.next(data);\n          if (data.error === 'JWT_INVALID' || data.error === 'AUTH_BLOCKED') {\n            console.error(`🚫 ${data.error}: ${data.message || 'Authentication error'} — stopping, no retry`);\n            WebSocketManagerService.lastOptions = null;\n            WebSocketManagerService.connectionError.next('Invalid or Expired JWT');\n            WebSocketManagerService.connectionStatus.next(false);\n            // Stop retrying for authentication errors\n            WebSocketManagerService.shouldRetry = false;\n          } else {\n            console.error(`❌ Server error: ${data.error} — will retry`);\n          }\n          WebSocketManagerService.socket?.close();\n          return;\n        }\n\n        // First valid (non-error) message confirms the server accepted auth.\n        // Notify readiness once per connection so pending intended subscriptions\n        // are replayed after the socket is actually usable.\n        if (!WebSocketManagerService.connectionReadyNotified) {\n          WebSocketManagerService.connectionReadyNotified = true;\n          // Auth confirmed — stop the connecting indicator and mark connected\n          WebSocketManagerService.isConnectingSubject.next(false);\n          WebSocketManagerService.connectionStatus.next(true);\n          console.log(`✅ Server confirmed authentication. WebSocket ready.`);\n          console.log(`🔄 Emitting reconnect event for MessageTrackerService`);\n          WebSocketManagerService.onReconnect.next();\n        }\n\n        WebSocketManagerService.messages.next(data);\n\n      } catch (error) {\n        console.error('Error parsing WebSocket message:', event.data);\n      }\n    };\n\n    WebSocketManagerService.socket.onclose = (event: CloseEvent) => {\n      console.log(`🔴 WebSocket closed (code: ${event.code})`);\n      // Do NOT set isConnecting to false here — we may be about to retry.\n      // Only terminal paths (auth error, retries exhausted) set it false.\n      WebSocketManagerService.connectionReadyNotified = false;\n      WebSocketManagerService.socket = null;\n      WebSocketManagerService.subscribedChannels.next(new Set());\n\n      if (event.code === 4000 || event.code === 4001 || event.code === 4003) {\n        WebSocketManagerService.isConnectingSubject.next(false);\n        WebSocketManagerService.connectionError.next('Invalid or Expired JWT');\n        WebSocketManagerService.connectionStatus.next(false);\n        // Stop retrying for authentication errors\n        WebSocketManagerService.shouldRetry = false;\n        return;\n      }\n\n      const maxRetries = WebSocketManagerService.maxRetries;\n      const retryDelay = WebSocketManagerService.retryDelay;\n\n      // Only retry if shouldRetry is true and we haven't exceeded max retries\n      if (WebSocketManagerService.shouldRetry && WebSocketManagerService.lastOptions && WebSocketManagerService.retryCount < maxRetries) {\n        WebSocketManagerService.retryCount++;\n        WebSocketManagerService.retryCountSubject.next(WebSocketManagerService.retryCount);\n        console.log(`🔄 Reconnect attempt ${WebSocketManagerService.retryCount}/${maxRetries}...`);\n        // Keep isConnecting true — still actively trying to connect during the retry wait\n        WebSocketManagerService.isConnectingSubject.next(true);\n        WebSocketManagerService.retrySubscription = timer(retryDelay).pipe(take(1)).subscribe(() => this.connect(WebSocketManagerService.lastOptions!, WebSocketManagerService.lastJwtToken));\n      } else {\n        console.error(`❌ WebSocket failed after ${maxRetries} retries. Giving up.`);\n        WebSocketManagerService.isConnectingSubject.next(false);\n        WebSocketManagerService.connectionStatus.next(false);\n        // Only set the error if this wasn't an intentional disconnect (lastOptions cleared in disconnect())\n        if (WebSocketManagerService.lastOptions && !WebSocketManagerService.connectionError.value) {\n          WebSocketManagerService.connectionError.next('Connection failed after maximum retries');\n        }\n        WebSocketManagerService.retryCount = maxRetries;\n        WebSocketManagerService.retryCountSubject.next(maxRetries);\n        WebSocketManagerService.shouldRetry = true;\n      }\n    };\n\n    WebSocketManagerService.socket.onerror = (error) => {\n      console.error('❌ WebSocket error:', error);\n      // Do not set isConnecting here — onclose fires immediately after onerror\n      // and is the authoritative place to decide whether to retry or give up.\n    };\n  }\n\n  /**\n   * Disconnect from WebSocket server\n   */\n  disconnect(): void {\n    // Stop retry logic BEFORE closing — onclose fires synchronously in some environments\n    // and must not see shouldRetry=true or it will schedule a reconnect.\n    WebSocketManagerService.shouldRetry = false;\n    WebSocketManagerService.lastOptions = null;\n    WebSocketManagerService.retrySubscription?.unsubscribe();\n    WebSocketManagerService.retrySubscription = null;\n    if (WebSocketManagerService.socket) {\n      console.log('🔌 Disconnecting WebSocket...');\n      WebSocketManagerService.socket.close();\n      WebSocketManagerService.socket = null;\n      WebSocketManagerService.connectionStatus.next(false);\n      WebSocketManagerService.isConnectingSubject.next(false);\n      WebSocketManagerService.connectionError.next(null);\n      WebSocketManagerService.subscribedChannels.next(new Set());\n      WebSocketManagerService.pendingSubscriptions.clear();\n    }\n  }\n\n  /**\n   * Clear a stale connectionError without triggering a connection attempt.\n   * Used when no wsServer is configured so the UI shows clean \"Disconnected\" state.\n   */\n  clearConnectionError(): void {\n    WebSocketManagerService.connectionError.next(null);\n    WebSocketManagerService.isConnectingSubject.next(false);\n  }\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // SUBSCRIPTION MANAGEMENT\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  private sendSubscribe(channelName: string, user: any): void {\n    const alreadySubscribed = WebSocketManagerService.subscribedChannels.value.has(channelName);\n\n    if (WebSocketManagerService.socket?.readyState === WebSocket.OPEN && !alreadySubscribed) {\n      const message = {\n        type: 'subscribe',\n        subscribedChannel: channelName,\n        content: {\n          id: this.getSessionId(),\n          ...user\n        }\n      };\n      WebSocketManagerService.socket.send(JSON.stringify(message));\n\n      // Track this channel as subscribed\n      const current = new Set(WebSocketManagerService.subscribedChannels.value);\n      current.add(channelName);\n      WebSocketManagerService.subscribedChannels.next(current);\n\n      WebSocketManagerService.isSubscribed = true;\n      console.log(`[CLIENT] Sent initial subscription to: ${channelName}`);\n    } else {\n      console.warn(`[CLIENT] Subscription prevented. Open: ${WebSocketManagerService.socket?.readyState === WebSocket.OPEN}, Already subscribed to ${channelName}: ${alreadySubscribed}`);\n    }\n  }\n\n  /**\n   * Send subscribe with lastSeenId for message sync support\n   * @param channelName - Channel name to subscribe to\n   * @param user - User data\n   * @param lastSeenId - Last message ID seen (for replay)\n   */\n  sendSubscribeWithLastSeen(channelName: string, user: any, lastSeenId: number): void {\n    const alreadySubscribed = WebSocketManagerService.subscribedChannels.value.has(channelName);\n    const subscribePending = WebSocketManagerService.pendingSubscriptions.has(channelName);\n    const isOpen = WebSocketManagerService.socket?.readyState === WebSocket.OPEN;\n\n    console.log(`🔍 Subscription check for \"${channelName}\": isOpen=${isOpen}, alreadySubscribed=${alreadySubscribed}, pending=${subscribePending}`);\n\n    if (isOpen && !alreadySubscribed && !subscribePending && WebSocketManagerService.socket) {\n      // Claim synchronously, before the send, so a second near-simultaneous caller (e.g. another\n      // HTTPManagerStateService instance reacting to the same event) sees pending=true and skips.\n      WebSocketManagerService.pendingSubscriptions.add(channelName);\n\n      const message = {\n        type: 'subscribe',\n        subscribedChannel: channelName,\n        lastSeenId,  // NEW: For message replay\n        content: {\n          id: this.getSessionId(),\n          ...user\n        }\n      };\n      WebSocketManagerService.socket.send(JSON.stringify(message));\n\n      // DON'T track as subscribed yet - wait for server confirmation ('subscribed' message)\n      // This prevents race conditions where we think we're subscribed but server doesn't\n\n      WebSocketManagerService.isSubscribed = true;\n      console.log(`[CLIENT] Sent subscription with lastSeenId=${lastSeenId} to: ${channelName}`);\n    } else {\n      console.warn(`[CLIENT] Subscription prevented. Open: ${isOpen}, Already subscribed to ${channelName}: ${alreadySubscribed}, pending: ${subscribePending}`);\n    }\n  }\n\n  /**\n   * Subscribe to a channel\n   * @param channelName - Channel name to subscribe to\n   */\n  subscribeToChannel(channelName: string): void {\n    if (WebSocketManagerService.socket?.readyState === WebSocket.OPEN) {\n      try {\n        const message = {\n          type: 'subscribe',\n          subscribedChannel: channelName,\n          content: {}\n        };\n\n        WebSocketManagerService.socket.send(JSON.stringify(message));\n\n        // Track locally - create new Set to trigger change detection\n        const current = new Set(WebSocketManagerService.subscribedChannels.value);\n        current.add(channelName);\n        WebSocketManagerService.subscribedChannels.next(current);\n        console.log(`📝 Subscribed to channel: ${channelName}`);\n      } catch (error) {\n        console.error(`❌ Failed to subscribe to channel \"${channelName}\":`, error);\n      }\n    } else {\n      console.warn(`Cannot subscribe to channel \"${channelName}\": WebSocket not yet open.`);\n    }\n  }\n\n  /**\n   * Subscribe to multiple channels\n   * @param channelNames - Array of channel names to subscribe to\n   */\n  subscribeToChannels(channelNames: string[]): void {\n    if (WebSocketManagerService.socket?.readyState === WebSocket.OPEN) {\n      channelNames.forEach(channel => this.subscribeToChannel(channel));\n    } else {\n      console.warn('Cannot subscribe: WebSocket not yet open.');\n    }\n  }\n\n  /**\n   * Unsubscribe from a channel\n   * @param channel - Channel name to unsubscribe from\n   */\n  unsubscribeFromChannel(channel: string): void {\n    if (WebSocketManagerService.socket?.readyState === WebSocket.OPEN) {\n      WebSocketManagerService.socket.send(JSON.stringify({ type: 'unsubscribe', subscribedChannel: channel }));\n\n      // Remove from local tracking - create new Set to trigger change detection\n      const current = new Set(WebSocketManagerService.subscribedChannels.value);\n      current.delete(channel);\n      WebSocketManagerService.subscribedChannels.next(current);\n      console.log(`💬 Unsubscribed from channel: ${channel}`);\n    } else {\n      console.error('WebSocket is not open. Cannot unsubscribe from channel.');\n    }\n  }\n\n  /**\n   * Get currently subscribed channels\n   * @returns Set of subscribed channel names\n   */\n  getSubscribedChannels(): Set<string> {\n    return WebSocketManagerService.subscribedChannels.value;\n  }\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // MESSAGE SENDING\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  /**\n   * Generic send method for message tracking (acks, gap requests, etc.)\n   * @param message - Message object to send\n   */\n  send(message: any): void {\n    if (WebSocketManagerService.socket?.readyState === WebSocket.OPEN) {\n      WebSocketManagerService.socket.send(JSON.stringify(message));\n    } else {\n      console.warn('⚠️ Cannot send message: WebSocket not open', message);\n    }\n  }\n\n  /**\n   * Send broadcast message\n   * @param content - Message content to broadcast\n   */\n  sendBroadcast(content: any): void {\n    if (WebSocketManagerService.socket?.readyState === WebSocket.OPEN) {\n      WebSocketManagerService.socket.send(JSON.stringify({ type: 'broadcast', content }));\n      console.log(`📢 Send broadcast: ${content}`);\n    } else {\n      console.error('WebSocket is not open. Cannot send broadcast.');\n    }\n  }\n\n  /**\n   * Send message in channel (state manager message)\n   * @param channel - Channel name\n   * @param content - Message content\n   */\n  sendMessageInChannel(channel: string, content: any): void {\n    if (WebSocketManagerService.socket?.readyState === WebSocket.OPEN) {\n      const message = {\n        type: 'statemanagerMessage',\n        subscribedChannel: channel,\n        content\n      };\n\n      // DEBUG: Log the exact message being sent\n      // console.log('🔍 [DEBUG] sendMessageInChannel:', {\n      //   channel,\n      //   channelType: typeof channel,\n      //   channelEmpty: channel === '' || channel === null || channel === undefined,\n      //   content,\n      //   fullMessage: message,\n      //   jsonString: JSON.stringify(message)\n      // });\n\n      WebSocketManagerService.socket.send(JSON.stringify(message));\n      console.log(`💬 Send message:`, content);\n    } else {\n      console.error('WebSocket is not open. Cannot send message.');\n    }\n  }\n\n  /**\n   * Send channel message (broadcasts to all subscribers in the channel)\n   * @param channel - Channel name\n   * @param content - Message content\n   */\n  sendChannelMessage(channel: string, content: any): void {\n    if (WebSocketManagerService.socket?.readyState === WebSocket.OPEN) {\n      WebSocketManagerService.socket.send(JSON.stringify({\n        type: 'message',\n        subscribedChannel: channel,\n        content\n      }));\n      console.log(`💬 Send channel message to [${channel}]:`, content);\n    } else {\n      console.error('WebSocket is not open. Cannot send channel message.');\n    }\n  }\n\n  /**\n   * Send message to multiple channels at once (batch)\n   * @param channels - Array of channel names\n   * @param content - Message content\n   */\n  sendChannelMessageToChannels(channels: string[], content: any): void {\n    if (WebSocketManagerService.socket?.readyState === WebSocket.OPEN) {\n      try {\n        // New batch format\n        WebSocketManagerService.socket.send(JSON.stringify({\n          type: 'channelMessage',\n          channels: channels,\n          data: content\n        }));\n        console.log(`💬 Send channel message to channels [${channels.join(', ')}]:`, content);\n      } catch (error) {\n        console.error('❌ Failed to send channelMessage batch:', error);\n      }\n\n      // Legacy fallback - send individual messages to each channel\n      try {\n        channels.forEach(channel => {\n          WebSocketManagerService.socket?.send(JSON.stringify({\n            type: 'message',\n            subscribedChannel: channel,\n            content\n          }));\n        });\n      } catch (err) {\n        console.warn('⚠️ Legacy fallback failed sending individual messages', err);\n      }\n\n    } else {\n      console.error('WebSocket is not open. Cannot send message to channels.');\n    }\n  }\n\n  /**\n   * Send message to specific user\n   * @param user - User identifier\n   * @param content - Message content\n   */\n  sendMessageToUser(user: string, content: any): void {\n    if (WebSocketManagerService.socket?.readyState === WebSocket.OPEN) {\n      WebSocketManagerService.socket.send(JSON.stringify({\n        type: 'userMessage',\n        subscribedChannel: user,\n        content\n      }));\n      console.log(`💬 Send message:`, content);\n    } else {\n      console.error('WebSocket is not open. Cannot send message.');\n    }\n  }\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // CHANNEL MANAGEMENT\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  /**\n   * Request list of all channels from server\n   */\n  getAllChannels(): void {\n    if (WebSocketManagerService.socket?.readyState === WebSocket.OPEN) {\n      WebSocketManagerService.socket.send(JSON.stringify({ type: 'getChannels' }));\n      console.log('🗂️ List of all channels');\n    } else {\n      console.error('WebSocket is not open. Cannot request channels.');\n    }\n  }\n\n  /**\n   * Create a new channel on server\n   * @param channel - Channel name to create\n   */\n  createChannel(channel: string): void {\n    if (WebSocketManagerService.socket?.readyState === WebSocket.OPEN) {\n      WebSocketManagerService.socket.send(JSON.stringify({\n        type: 'createChannel',\n        content: channel\n      }));\n      console.log('🗂️ Created channel:', channel);\n    } else {\n      console.error('WebSocket is not open. Cannot request channels.');\n    }\n  }\n\n  /**\n   * Delete a channel from server\n   * @param channel - Channel name to delete\n   */\n  deleteChannel(channel: string): void {\n    if (WebSocketManagerService.socket?.readyState === WebSocket.OPEN) {\n      WebSocketManagerService.socket.send(JSON.stringify({\n        type: 'deleteChannel',\n        content: channel\n      }));\n      console.log('🗂️ Delete channel:', channel);\n    } else {\n      console.error('WebSocket is not open. Cannot request channels.');\n    }\n  }\n\n  /**\n   * Get users in a specific channel\n   * @param channel - Channel name\n   */\n  getUsersInChannel(channel: string): void {\n    if (WebSocketManagerService.socket?.readyState === WebSocket.OPEN) {\n      WebSocketManagerService.socket.send(JSON.stringify({\n        type: 'getUsers',\n        subscribedChannel: channel\n      }));\n      console.log(`👥 List all users in channel: ${channel}`);\n    } else {\n      console.error('WebSocket is not open. Cannot request users.');\n    }\n  }\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // NOTIFICATION CHANNELS (MES- prefix)\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  /**\n   * Create a notification channel\n   * @param channel - Channel name (should include MES- prefix)\n   */\n  createNotificationChannel(channel: string): void {\n    if (WebSocketManagerService.socket?.readyState === WebSocket.OPEN) {\n      WebSocketManagerService.socket.send(JSON.stringify({\n        type: 'createNotificationChannel',\n        content: channel\n      }));\n      console.log('📢 Created notification channel:', channel);\n    } else {\n      console.error('WebSocket is not open. Cannot create notification channel.');\n    }\n  }\n\n  /**\n   * Get all notification channels (in-memory)\n   */\n  getNotificationChannels(): void {\n    if (WebSocketManagerService.socket?.readyState === WebSocket.OPEN) {\n      WebSocketManagerService.socket.send(JSON.stringify({ type: 'getNotificationChannels' }));\n      console.log('📢 Requested notification channels list');\n    } else {\n      console.error('WebSocket is not open. Cannot request notification channels.');\n    }\n  }\n\n  /**\n   * Get today's notification channels from database\n   */\n  getTodaysNotificationChannels(): void {\n    if (WebSocketManagerService.socket?.readyState === WebSocket.OPEN) {\n      WebSocketManagerService.socket.send(JSON.stringify({ type: 'getTodaysNotificationChannels' }));\n      console.log('📢 Requested today\\'s notification channels from DB');\n    } else {\n      console.error('WebSocket is not open. Cannot request today\\'s notification channels.');\n    }\n  }\n\n  /**\n   * Subscribe to a notification channel with optional date filters\n   * @param channel - Channel name\n   * @param options - Optional start/end epoch filters\n   * @param user - User information\n   */\n  subscribeToNotificationChannel(channel: string, options?: { startEpoch?: number; endEpoch?: number }, user?: any): void {\n    if (WebSocketManagerService.socket?.readyState === WebSocket.OPEN) {\n      WebSocketManagerService.socket.send(JSON.stringify({\n        type: 'subscribeNotifications',\n        subscribedChannel: channel,\n        content: {\n          ...options,\n          user: user\n        }\n      }));\n      console.log(`📢 Subscribed to notification channel: ${channel}`);\n    } else {\n      console.error('WebSocket is not open. Cannot subscribe to notification channel.');\n    }\n  }\n\n  /**\n   * Unsubscribe from a notification channel\n   * @param channel - Channel name\n   */\n  unsubscribeFromNotificationChannel(channel: string): void {\n    if (WebSocketManagerService.socket?.readyState === WebSocket.OPEN) {\n      WebSocketManagerService.socket.send(JSON.stringify({\n        type: 'unsubscribeNotifications',\n        subscribedChannel: channel\n      }));\n      console.log(`📢 Unsubscribed from notification channel: ${channel}`);\n    } else {\n      console.error('WebSocket is not open. Cannot unsubscribe from notification channel.');\n    }\n  }\n\n  /**\n   * Send notification to channel\n   * @param channel - Channel name (should include MES- prefix)\n   * @param content - Notification content\n   */\n  sendNotification(channel: string, content: any): void {\n    if (WebSocketManagerService.socket?.readyState === WebSocket.OPEN) {\n      WebSocketManagerService.socket.send(JSON.stringify({\n        type: 'notification',\n        subscribedChannel: channel,\n        content\n      }));\n      console.log(`📢 Sent notification to channel: ${channel}`, content);\n    } else {\n      console.error('WebSocket is not open. Cannot send notification.');\n    }\n  }\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // CONNECTION STATUS (Static getter for direct access)\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  /**\n   * Check if WebSocket connection is currently open\n   * @returns true if connected, false otherwise\n   */\n  static isConnected(): boolean {\n    return WebSocketManagerService.socket?.readyState === WebSocket.OPEN;\n  }\n\n  /**\n   * Check if connection has been initialized (attempted at least once)\n   * @returns true if connection was initialized, false otherwise\n   */\n  static isInitialized(): boolean {\n    return WebSocketManagerService.connectionInitialized;\n  }\n\n}\n","import { Injectable, OnDestroy } from '@angular/core';\nimport { BehaviorSubject, interval, Observable, Subject, Subscription } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { WebSocketManagerService } from '../connection/websocket-manager.service';\n\n/**\n * Message Tracker Service - Guaranteed Message Delivery\n *\n * Tracks message IDs, detects gaps, manages acknowledgments, and handles sync.\n * Ensures frontend clients never miss messages even during disconnections.\n *\n * Features:\n * - Per-channel message sequence tracking\n * - Automatic gap detection and recovery\n * - Batch acknowledgments (configurable interval)\n * - Reconnection sync with last-seen tracking\n * - Gap threshold alerting (10 messages before UI notification)\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class MessageTrackerService implements OnDestroy {\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // CONFIGURATION\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  /** Batch acknowledgment interval in milliseconds */\n  private readonly BATCH_ACK_INTERVAL_MS = 5000; // 5 seconds\n\n  /** Maximum gap before alerting UI */\n  private readonly GAP_THRESHOLD = 10;\n\n  /** Maximum messages to store in pending acks before forcing batch */\n  private readonly MAX_PENDING_ACKS = 100;\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // STATE TRACKING\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  /**\n   * Track last seen message ID per channel\n   * Map<channelName, lastMessageId>\n   */\n  private lastSeen = new Map<string, number>();\n\n  /**\n   * Expected next message ID per channel (for gap detection)\n   * Map<channelName, nextExpectedId>\n   */\n  private expectedSequence = new Map<string, number>();\n\n  /**\n   * Pending acknowledgments per channel\n   * Map<channelName, Set<messageId>>\n   */\n  private pendingAcks = new Map<string, Set<number>>();\n\n  /**\n   * Gap count per channel (for threshold alerting)\n   * Map<channelName, gapCount>\n   */\n  private gapCounts = new Map<string, number>();\n\n  /**\n   * Replay mode tracking (per channel)\n   * Used to distinguish replay vs live messages\n   */\n  private inReplayMode = new Map<string, boolean>();\n\n  /**\n   * Gap retry count (for retry logic)\n   * Map<channel, retryCount>\n   */\n  private gapRetryCount = new Map<string, number>();\n\n  /** Subscription to WebSocket messages */\n  private messagesSubscription: Subscription | null = null;\n\n  /** Subject to signal destroy for takeUntil */\n  private destroy$ = new Subject<void>();\n\n  /**\n   * Track channels we want to be subscribed to (survives disconnect/reconnect)\n   * This is separate from WebSocketManagerService.subscribedChannels which tracks\n   * actual active subscriptions\n   */\n  private intendedChannels = new Set<string>();\n\n  /** Observable to emit processed messages to UI components */\n  private messagesSubject = new BehaviorSubject<any>(null);\n  public messages$: Observable<any> = this.messagesSubject.asObservable();\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // INITIALIZATION\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  constructor(private wsManager: WebSocketManagerService) {\n    // Restore state from sessionStorage (survives page reload)\n    this.restoreLastSeen();\n    this.restoreIntendedChannels();\n\n    // Start batch acknowledgment timer\n    interval(this.BATCH_ACK_INTERVAL_MS)\n      .pipe(takeUntil(this.destroy$))\n      .subscribe(() => this.sendAllBatchAcks());\n\n    // Subscribe to all incoming WebSocket messages\n    this.messagesSubscription = this.wsManager.messages$.subscribe(msg => {\n      if (msg) {\n        this.onMessage(msg);\n      }\n    });\n\n    // Listen for reconnect events - re-subscribe with lastSeenId for sync\n    this.wsManager.onReconnect$.subscribe(() => {\n      console.log('🔄 Reconnection detected, re-subscribing with lastSeenId...');\n      this.reSubscribeAllChannels();\n    });\n\n    console.log('✅ MessageTrackerService initialized');\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n    this.persistLastSeen(); // This now also persists intendedChannels\n    this.messagesSubscription?.unsubscribe();\n    console.log('🛑 MessageTrackerService destroyed');\n  }\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // MESSAGE HANDLING\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  /**\n   * Process incoming message\n   * Tracks ID, detects gaps, queues acknowledgment\n   */\n  private onMessage(msg: any): void {\n    const { type, channel, messageId, isReplay } = msg;\n\n    // Only track messages with IDs (ignore legacy messages without messageId)\n    if (messageId === undefined || messageId === null) {\n      console.warn('⚠️ Received message without ID (legacy format):', msg);\n      // Still forward legacy messages to UI\n      this.messagesSubject.next(msg);\n      return;\n    }\n\n    // Handle replay mode transitions\n    if (isReplay && !this.inReplayMode.get(channel)) {\n      console.log(`🔄 Entering replay mode for channel: ${channel}`);\n      this.inReplayMode.set(channel, true);\n    } else if (!isReplay && this.inReplayMode.get(channel)) {\n      console.log(`✅ Exiting replay mode for channel: ${channel}`);\n      this.inReplayMode.set(channel, false);\n    }\n\n    // Track message and detect gaps\n    this.trackMessage(channel, messageId, isReplay);\n\n    // Forward message to UI components\n    this.messagesSubject.next(msg);\n  }\n\n  /**\n   * Track message ID and detect gaps\n   */\n  private trackMessage(channel: string, messageId: number, isReplay: boolean): void {\n    const expected = this.expectedSequence.get(channel) || 1;\n\n    // Gap detection\n    if (messageId !== expected) {\n      console.warn(`⚠️ Gap detected in channel \"${channel}\": expected ${expected}, got ${messageId}`);\n\n      // Increment gap count\n      const currentGapCount = this.gapCounts.get(channel) || 0;\n      const newGapCount = currentGapCount + 1;\n      this.gapCounts.set(channel, newGapCount);\n\n      // Check threshold\n      if (newGapCount >= this.GAP_THRESHOLD) {\n        console.error(`🚨 Gap threshold exceeded for channel \"${channel}\": ${newGapCount} gaps`);\n        this.onGapThresholdExceeded(channel, newGapCount);\n      }\n\n      // Request gap fill\n      this.requestGapFill(channel, expected, messageId - 1);\n    } else {\n      // Reset gap count and retry count on successful sequence\n      this.gapCounts.set(channel, 0);\n      this.gapRetryCount.set(channel, 0);\n    }\n\n    // Update tracking\n    this.lastSeen.set(channel, messageId);\n    this.expectedSequence.set(channel, messageId + 1);\n\n    // Persist to sessionStorage (debounced in production)\n    this.persistLastSeen();\n\n    // Queue for acknowledgment\n    this.queueAck(channel, messageId);\n\n    // Check if we should force batch ack due to volume\n    const pendingCount = this.pendingAcks.get(channel)?.size || 0;\n    if (pendingCount >= this.MAX_PENDING_ACKS) {\n      console.log(`📦 Forcing batch ack: ${pendingCount} pending messages`);\n      this.sendBatchAck(channel);\n    }\n  }\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // ACKNOWLEDGMENT MANAGEMENT\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  /**\n   * Queue message for batch acknowledgment\n   */\n  private queueAck(channel: string, messageId: number): void {\n    if (!this.pendingAcks.has(channel)) {\n      this.pendingAcks.set(channel, new Set());\n    }\n    this.pendingAcks.get(channel)!.add(messageId);\n  }\n\n  /**\n   * Send batch acknowledgments for all channels with pending acks\n   */\n  private sendAllBatchAcks(): void {\n    this.pendingAcks.forEach((messageIds, channel) => {\n      if (messageIds.size > 0) {\n        this.sendBatchAck(channel);\n      }\n    });\n  }\n\n  /**\n   * Send batch acknowledgment for a specific channel\n   */\n  private sendBatchAck(channel: string): void {\n    const messageIds = this.pendingAcks.get(channel);\n\n    if (!messageIds || messageIds.size === 0) {\n      return;\n    }\n\n    // Convert Set to sorted array\n    const sortedIds = Array.from(messageIds).sort((a, b) => a - b);\n    const ackUpTo = sortedIds[sortedIds.length - 1];\n\n    console.log(`📦 Batch ack for channel \"${channel}\": ackUpTo=${ackUpTo} (${messageIds.size} messages)`);\n\n    this.wsManager.send({\n      type: 'messageAckBatch',\n      channel,\n      ackUpTo,\n      // Optional: include skippedIds if you want to report gaps\n      // skippedIds: this.getSkippedIds(channel, ackUpTo)\n    });\n\n    // Clear pending acks\n    messageIds.clear();\n  }\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // GAP RECOVERY\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  /**\n   * Request missing messages from server\n   */\n  private requestGapFill(channel: string, fromId: number, toId: number): void {\n    const retries = this.gapRetryCount.get(channel) || 0;\n\n    if (retries >= 3) {\n      console.error(`🚨 Gap fill failed after 3 retries for channel \"${channel}\": ${fromId} to ${toId}`);\n      // Could emit to UI for manual intervention\n      return;\n    }\n\n    console.log(`🔍 Requesting gap fill for channel \"${channel}\": ${fromId} to ${toId} (attempt ${retries + 1})`);\n\n    this.wsManager.send({\n      type: 'gapRequest',\n      channel,\n      fromId,\n      toId\n    });\n\n    this.gapRetryCount.set(channel, retries + 1);\n  }\n\n  /**\n   * Handle gap threshold exceeded (optional: alert UI)\n   */\n  private onGapThresholdExceeded(channel: string, gapCount: number): void {\n    console.warn(`⚠️ High gap count for channel \"${channel}\": ${gapCount} missed messages`);\n    // Could emit to a separate observable for UI components to subscribe to\n    // this.gapAlerts.next({ channel, gapCount });\n  }\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // SUBSCRIPTION MANAGEMENT\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  /**\n   * Subscribe to channel with sync support\n   * Automatically includes lastSeenId for replay\n   */\n  subscribeToChannel(channel: string, userData?: any): void {\n    const lastSeenId = this.lastSeen.get(channel) || 0;\n\n    console.log(`📥 Subscribing to channel \"${channel}\" with lastSeenId=${lastSeenId}`);\n\n    // PUB- channels are only ever subscribed via an explicit user action (a chip\n    // click) and must never auto-resubscribe/auto-select on reconnect, so they're\n    // deliberately kept out of intendedChannels. Other channels (e.g. the SYS-\n    // state channel) still track as intended so they survive disconnect/reconnect.\n    if (!channel.startsWith('PUB-')) {\n      console.log(`📝 Adding to intendedChannels (now has ${this.intendedChannels.size + 1} channels)`);\n      this.intendedChannels.add(channel);\n      this.persistIntendedChannels();\n    }\n\n    this.wsManager.sendSubscribeWithLastSeen(channel, userData, lastSeenId);\n  }\n\n  /**\n   * Re-subscribe to all previously subscribed channels after reconnect\n   * Includes lastSeenId for each channel to trigger message replay\n   */\n  private reSubscribeAllChannels(): void {\n    // Use intendedChannels which survives disconnect/reconnect\n    const channels = Array.from(this.intendedChannels);\n\n    console.log(`🔄 Re-subscribing to ${channels.length} channel(s) with lastSeenId...`);\n\n    channels.forEach((channel: string) => {\n      this.subscribeToChannel(channel);\n    });\n\n    console.log(`✅ Re-subscription complete for ${channels.length} channel(s)`);\n  }\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // STATE PERSISTENCE\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  /**\n   * Persist lastSeen to sessionStorage (survives page reload)\n   */\n  private persistLastSeen(): void {\n    try {\n      const data = JSON.stringify(Array.from(this.lastSeen.entries()));\n      sessionStorage.setItem('messageLastSeen', data);\n\n      // Also persist intendedChannels\n      this.persistIntendedChannels();\n    } catch (err: any) {\n      console.warn('⚠️ Failed to persist lastSeen:', err.message);\n    }\n  }\n\n  /**\n   * Restore lastSeen from sessionStorage\n   */\n  private restoreLastSeen(): void {\n    try {\n      const data = sessionStorage.getItem('messageLastSeen');\n      if (data) {\n        const entries = JSON.parse(data);\n        this.lastSeen = new Map(entries);\n\n        // Rebuild expectedSequence from restored lastSeen\n        this.lastSeen.forEach((lastId, channel) => {\n          this.expectedSequence.set(channel, lastId + 1);\n        });\n\n        console.log('📥 Restored lastSeen from sessionStorage:', this.lastSeen.size, 'channels');\n      }\n    } catch (err: any) {\n      console.warn('⚠️ Failed to restore lastSeen:', err.message);\n    }\n  }\n\n  /**\n   * Persist intendedChannels to sessionStorage\n   */\n  private persistIntendedChannels(): void {\n    try {\n      const channels = Array.from(this.intendedChannels);\n      sessionStorage.setItem('intendedChannels', JSON.stringify(channels));\n    } catch (err: any) {\n      console.warn('⚠️ Failed to persist intendedChannels:', err.message);\n    }\n  }\n\n  /**\n   * Restore intendedChannels from sessionStorage\n   */\n  private restoreIntendedChannels(): void {\n    try {\n      const data = sessionStorage.getItem('intendedChannels');\n      if (data) {\n        const channels = JSON.parse(data) as string[];\n        // Drop any PUB- entries a pre-fix session may have persisted -- they must\n        // not auto-resubscribe either, same as a freshly-subscribed one wouldn't be added.\n        this.intendedChannels = new Set(channels.filter(ch => !ch.startsWith('PUB-')));\n        console.log('📥 Restored intendedChannels from sessionStorage:', this.intendedChannels.size, 'channels');\n      }\n    } catch (err: any) {\n      console.warn('⚠️ Failed to restore intendedChannels:', err.message);\n    }\n  }\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // PUBLIC ACCESSORS\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  /**\n   * Get last seen message ID for a channel\n   */\n  getLastSeenId(channel: string): number {\n    return this.lastSeen.get(channel) || 0;\n  }\n\n  /**\n   * Get expected next message ID for a channel\n   */\n  getExpectedNextId(channel: string): number {\n    return this.expectedSequence.get(channel) || 1;\n  }\n\n  /**\n   * Check if currently in replay mode for a channel\n   */\n  isInReplayMode(channel: string): boolean {\n    return this.inReplayMode.get(channel) || false;\n  }\n\n  /**\n   * Get gap count for a channel\n   */\n  getGapCount(channel: string): number {\n    return this.gapCounts.get(channel) || 0;\n  }\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // UTILITY METHODS\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  /**\n   * Get skipped IDs between expected and received (for detailed gap reporting)\n   */\n  private getSkippedIds(channel: string, upToId: number): number[] {\n    const expected = this.expectedSequence.get(channel) || 1;\n    const skipped: number[] = [];\n\n    for (let i = expected; i < upToId; i++) {\n      const pending = this.pendingAcks.get(channel);\n      if (!pending?.has(i)) {\n        skipped.push(i);\n      }\n    }\n\n    return skipped;\n  }\n\n  /**\n   * Clear all tracking state (useful for debugging or manual reset)\n   */\n  clearState(): void {\n    this.lastSeen.clear();\n    this.expectedSequence.clear();\n    this.pendingAcks.clear();\n    this.gapCounts.clear();\n    this.inReplayMode.clear();\n    this.gapRetryCount.clear();\n    this.persistLastSeen();\n    console.log('🧹 MessageTracker state cleared');\n  }\n}\n","import { Inject, inject, Injectable, Injector, Optional, signal, computed } from '@angular/core';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { Observable, Subject, throwError, from, of } from 'rxjs';\nimport { tap, map, finalize, catchError, concatMap, mergeMap, toArray, concat } from 'rxjs/operators';\n\nimport { ApiRequest } from '../request-manager-state-service/models/api-request.model';\nimport { StreamProgressModel } from '../request-manager-state-service/models/stream-progress.model';\nimport { RequestService } from './request.service';\nimport { requestPolling, countdown, delayedRetry } from './rxjs-operators';\n\nimport { CONFIG_SETTINGS_TOKEN } from '../../models/config-token.model';\nimport { ConfigOptions, BatchOptions, BatchResult, BatchRequestState, BatchProgress, calculateBatchProgress } from '../../models';\nimport { ObjectMergerService } from '../utils/object-merger.service';\nimport { toSyncObservable } from '../utils';\nimport { ToastColors, ToastDisplay, ToastMessageDisplayService } from 'toast-message-display';\nimport { WebSocketManagerService } from '../ws-manager-service/connection';\nimport { MessageTrackerService } from '../ws-manager-service/messaging/message-tracker.service';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class HTTPManagerService<T> extends RequestService {\n\n  toastMessage = inject(ToastMessageDisplayService)\n  ng_injector = inject(Injector)\n  objectMergerService = inject(ObjectMergerService)\n  wsManager = inject(WebSocketManagerService)\n  messageTracker = inject(MessageTrackerService)\n\n  // Delegate WebSocket observables to WebSocketManagerService (singleton)\n  connectionStatus$ = this.wsManager.connectionStatus$\n  messages$ = this.messageTracker.messages$ // Messages flow through MessageTrackerService\n  subscribedChannels$ = this.wsManager.subscribedChannels$\n  isConnecting$ = this.wsManager.isConnecting$\n  retryCount$ = this.wsManager.retryCount$\n  maxRetries$ = this.wsManager.maxRetries$\n  connectionError$ = this.wsManager.connectionError$\n\n  countdown = signal(0);\n  countdown$: Observable<number> = toSyncObservable(this.countdown, this.stateChanged$);\n\n  // Public (not private) so a consumer built against the signals surface — e.g.\n  // RequestSignalsManagerDemoComponent — can call `.set()` directly, matching the shape\n  // HTTPManagerSignalsService already exposed.\n  error = signal(false);\n  error$: Observable<boolean> = toSyncObservable(this.error, this.stateChanged$);\n\n  data = signal<any>(null);\n  data$: Observable<any> = toSyncObservable(this.data, this.stateChanged$);\n\n  // Batch orchestration state — mirrors the Observable-returning batch methods below as a side\n  // effect, the same relationship `data`/`data$` already has to `getRequest()`. The batch\n  // methods' Observable return type is unchanged; these are last-known-state mirrors only.\n  isBatchPending = signal(false);\n  isBatchPending$: Observable<boolean> = toSyncObservable(this.isBatchPending, this.stateChanged$);\n\n  batchResults = signal<any[] | null>(null);\n  batchResults$: Observable<any[] | null> = toSyncObservable(this.batchResults, this.stateChanged$);\n\n  batchError = signal<any>(null);\n  batchError$: Observable<any> = toSyncObservable(this.batchError, this.stateChanged$);\n\n  batchStates = signal<BatchRequestState<any>[]>([]);\n  batchStates$: Observable<BatchRequestState<any>[]> = toSyncObservable(this.batchStates, this.stateChanged$);\n\n  batchProgress = computed(() => calculateBatchProgress(this.batchStates()));\n  batchProgress$: Observable<BatchProgress> = toSyncObservable(this.batchProgress, this.stateChanged$);\n\n  private polling$ = new Subject<void>();\n\n  config = ApiRequest.adapt();\n\n  constructor(@Optional() @Inject(CONFIG_SETTINGS_TOKEN) private configOptions?: ConfigOptions) {\n    super()\n    this.config = (configOptions) ? ApiRequest.adapt(configOptions.httpRequestOptions) : this.config\n  }\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // WEBSOCKET METHODS (Delegated to WebSocketManagerService singleton)\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  /**\n   * Connect to WebSocket server\n   * Only the first call across ALL instances will establish a connection\n   */\n  connect(options: any, jwtToken: string): void {\n    this.wsManager.connect(options, jwtToken);\n  }\n\n  /**\n   * Disconnect from WebSocket server\n   */\n  disconnect(): void {\n    this.wsManager.disconnect();\n  }\n\n  /**\n   * Clear any stale connection error without triggering a connection attempt\n   */\n  clearConnectionError(): void {\n    this.wsManager.clearConnectionError();\n  }\n\n  /**\n   * Subscribe to a channel\n   */\n  subscribeToChannel(channel: string, userData?: any): void {\n    this.messageTracker.subscribeToChannel(channel, userData);\n  }\n\n  /**\n   * Subscribe to multiple channels\n   */\n  subscribeToChannels(channels: string[], userData?: any): void {\n    channels.forEach(channel => this.messageTracker.subscribeToChannel(channel, userData));\n  }\n\n  /**\n   * Unsubscribe from a channel\n   */\n  unsubscribeFromChannel(channel: string): void {\n    this.wsManager.unsubscribeFromChannel(channel);\n  }\n\n  /**\n   * Get currently subscribed channels\n   */\n  getSubscribedChannels(): Set<string> {\n    return this.wsManager.getSubscribedChannels();\n  }\n\n  /**\n   * Send broadcast message\n   */\n  sendBroadcast(content: any): void {\n    this.wsManager.sendBroadcast(content);\n  }\n\n  /**\n   * Send message in channel (state manager message)\n   */\n  sendMessageInChannel(channel: string, content: any): void {\n    this.wsManager.sendMessageInChannel(channel, content);\n  }\n\n  /**\n   * Send channel message\n   */\n  sendChannelMessage(channel: string, content: any): void {\n    this.wsManager.sendChannelMessage(channel, content);\n  }\n\n  /**\n   * Send message to multiple channels\n   */\n  sendChannelMessageToChannels(channels: string[], content: any): void {\n    this.wsManager.sendChannelMessageToChannels(channels, content);\n  }\n\n  /**\n   * Send message to user\n   */\n  sendMessageToUser(user: string, content: any): void {\n    this.wsManager.sendMessageToUser(user, content);\n  }\n\n  /**\n   * Get all channels\n   */\n  getAllChannels(): void {\n    this.wsManager.getAllChannels();\n  }\n\n  /**\n   * Create channel\n   */\n  createChannel(channel: string): void {\n    this.wsManager.createChannel(channel);\n  }\n\n  /**\n   * Delete channel\n   */\n  deleteChannel(channel: string): void {\n    this.wsManager.deleteChannel(channel);\n  }\n\n  /**\n   * Get users in channel\n   */\n  getUsersInChannel(channel: string): void {\n    this.wsManager.getUsersInChannel(channel);\n  }\n\n  /**\n   * Create notification channel\n   */\n  createNotificationChannel(channel: string): void {\n    this.wsManager.createNotificationChannel(channel);\n  }\n\n  /**\n   * Get notification channels\n   */\n  getNotificationChannels(): void {\n    this.wsManager.getNotificationChannels();\n  }\n\n  /**\n   * Get today's notification channels\n   */\n  getTodaysNotificationChannels(): void {\n    this.wsManager.getTodaysNotificationChannels();\n  }\n\n  /**\n   * Subscribe to notification channel\n   */\n  subscribeToNotificationChannel(channel: string, options?: any, user?: any): void {\n    this.wsManager.subscribeToNotificationChannel(channel, options, user);\n  }\n\n  /**\n   * Unsubscribe from notification channel\n   */\n  unsubscribeFromNotificationChannel(channel: string): void {\n    this.wsManager.unsubscribeFromNotificationChannel(channel);\n  }\n\n  /**\n   * Send notification to channel\n   */\n  sendNotification(channel: string, content: any): void {\n    this.wsManager.sendNotification(channel, content);\n  }\n\n  // REQUESTS\n\n  getRequest<T>(options?: ApiRequest, params?: any[]) {\n\n    this.isPending.set(true);\n    this.data.set(null)\n    this.streamProgress.set(StreamProgressModel.adapt({\n      received: 0,\n      total: undefined,\n      percent: 0,\n      stage: 'connecting'\n    }));\n    this.stateChanged$.next();\n\n    const updatedOptions = this.defineReqOptions(options, params)\n    const func = this.getRecordRequest;\n    const requests = this.createRequest(func, updatedOptions);\n\n    // 'complete' is set in tap's complete callback (fires only on a clean completion), not\n    // finalize (fires on completion OR error, during teardown, which runs after catchError has\n    // already handled an error and set 'error' — finalize would then clobber it back to\n    // 'complete'). isPending reset stays in finalize since that outcome doesn't need to\n    // distinguish success from failure.\n    return this.createObservable<T>(updatedOptions, requests, func.name)\n    .pipe(\n      tap({\n        next: data => {\n          this.data.set(data)\n          this.stateChanged$.next();\n          if(updatedOptions.displaySuccess && !updatedOptions.stream) this.handleSuccessWithSnackBar(updatedOptions.successMessage)\n        },\n        complete: () => {\n          this.streamProgress.update(p => StreamProgressModel.adapt({ ...p, stage: 'complete' }));\n          if(updatedOptions.displaySuccess && updatedOptions.stream) this.handleSuccessWithSnackBar(updatedOptions.successMessage)\n          this.stateChanged$.next();\n        }\n      }),\n      catchError((err) => {\n        if(updatedOptions.displayError) this.handleErrorWithSnackBar(err, updatedOptions.errorMessage || err?.message, updatedOptions.suppressToastStatuses)\n        this.streamProgress.update(p => StreamProgressModel.adapt({ ...p, stage: 'error' }));\n        this.stateChanged$.next();\n        return this.handleError(err);\n      }),\n      finalize(() => {\n        this.isPending.set(false)\n        this.stateChanged$.next();\n      })\n    )\n  }\n\n  postRequest<T extends { id?: number|string }>(data: T, options: ApiRequest, params?: any[]) {\n\n    this.isPending.set(true);\n    this.data.set(null)\n    this.stateChanged$.next();\n\n    const updatedOptions = this.defineReqOptions(options, params)\n    const func = this.createRecordRequest;\n    const requests = this.createRequest(func, updatedOptions, data);\n\n    return this.createObservable<T>(updatedOptions, requests, func.name).pipe(\n      tap(data => {\n        this.data.set(data)\n        this.stateChanged$.next();\n        if(updatedOptions.displaySuccess) this.handleSuccessWithSnackBar(updatedOptions.successMessage)\n      }),\n      finalize(() => { this.isPending.set(false); this.stateChanged$.next(); }),\n      catchError((err) => {\n        if(updatedOptions.displayError) this.handleErrorWithSnackBar(err, updatedOptions.errorMessage || err?.message, updatedOptions.suppressToastStatuses)\n        this.isPending.set(false)\n        this.stateChanged$.next();\n        return this.handleError(err);\n      })\n    )\n  }\n\n  putRequest<T extends { id?: number|string }>(data: T, options: ApiRequest, params?: any[]) {\n\n    this.isPending.set(true);\n    this.data.set(null)\n    this.stateChanged$.next();\n\n    const updatedOptions = this.defineReqOptions(options, params)\n    const func = this.updateRecordRequest;\n    const requests = this.createRequest(func, updatedOptions, data);\n\n    return this.createObservable<T>(updatedOptions, requests, func.name).pipe(\n      tap(data => {\n        this.data.set(data)\n        this.stateChanged$.next();\n        if(updatedOptions.displaySuccess) this.handleSuccessWithSnackBar(updatedOptions.successMessage)\n      }),\n      finalize(() => { this.isPending.set(false); this.stateChanged$.next(); }),\n      catchError((err) => {\n        if(updatedOptions.displayError) this.handleErrorWithSnackBar(err, updatedOptions.errorMessage || err?.message, updatedOptions.suppressToastStatuses)\n        this.isPending.set(false)\n        this.stateChanged$.next();\n        return this.handleError(err);\n      })\n    )\n  }\n\n  patchRequest<T extends { id?: number|string }>(data: T, options: ApiRequest, params?: any[]) {\n\n    this.isPending.set(true);\n    this.data.set(null)\n    this.stateChanged$.next();\n\n    const updatedOptions = this.defineReqOptions(options, params)\n    const func = this.patchRecordRequest;\n    const requests = this.createRequest(func, updatedOptions, data);\n\n    return this.createObservable<T>(updatedOptions, requests, func.name).pipe(\n      tap(data => {\n        this.data.set(data)\n        this.stateChanged$.next();\n        if(updatedOptions.displaySuccess) this.handleSuccessWithSnackBar(updatedOptions.successMessage)\n      }),\n      finalize(() => { this.isPending.set(false); this.stateChanged$.next(); }),\n      catchError((err) => {\n        if(updatedOptions.displayError) this.handleErrorWithSnackBar(err, updatedOptions.errorMessage || err?.message, updatedOptions.suppressToastStatuses)\n        this.isPending.set(false)\n        this.stateChanged$.next();\n        return this.handleError(err);\n      })\n    )\n  }\n\n  deleteRequest<T>(options: ApiRequest, params?: any[]) {\n\n    this.isPending.set(true);\n    this.data.set(null)\n    this.stateChanged$.next();\n\n    const updatedOptions = this.defineReqOptions(options, params)\n    const func = this.deleteRecordRequest;\n    const requests = this.createRequest(func, updatedOptions);\n\n    return this.createObservable<T>(updatedOptions, requests, func.name).pipe(\n      tap(data => {\n        this.data.set(data)\n        this.stateChanged$.next();\n        if(updatedOptions.displaySuccess) this.handleSuccessWithSnackBar(updatedOptions.successMessage)\n      }),\n      finalize(() => { this.isPending.set(false); this.stateChanged$.next(); }),\n      catchError((err) => {\n        if(updatedOptions.displayError) this.handleErrorWithSnackBar(err, updatedOptions.errorMessage || err?.message, updatedOptions.suppressToastStatuses)\n        this.isPending.set(false)\n        this.stateChanged$.next();\n        return this.handleError(err);\n      })\n    )\n  }\n\n  downloadRequest<T>(options: ApiRequest, params?: any[], saveAs?: string) {\n\n    this.isPending.set(true);\n    this.stateChanged$.next();\n\n    const updatedOptions = this.defineReqOptions(options, params)\n    const func = this.downloadFileRequest;\n    const requests = this.createRequest(func, updatedOptions)\n\n    return this.createObservable<T>(updatedOptions, requests, func.name)\n    .pipe(\n      catchError((err) => {\n        this.error.set(true)\n        this.isPending.set(false)\n        this.stateChanged$.next();\n        return this.handleError(err);\n      })\n    )\n\n  }\n\n  uploadRequest<T>(files: File | File[], options: ApiRequest, params?: any[]) {\n\n    this.isPending.set(true);\n    this.data.set(null)\n    this.stateChanged$.next();\n\n    const updatedOptions = this.defineReqOptions(options, params)\n    updatedOptions.uploadFiles = files\n\n    const func = this.uploadFileRequest;\n    const requests = this.createRequest(func, updatedOptions);\n\n    return this.createObservable<T>(updatedOptions, requests, func.name).pipe(\n      tap(data => {\n        this.data.set(data)\n        this.stateChanged$.next();\n        if(updatedOptions.displaySuccess) this.handleSuccessWithSnackBar(updatedOptions.successMessage)\n      }),\n      finalize(() => { this.isPending.set(false); this.stateChanged$.next(); }),\n      catchError((err) => {\n        if(updatedOptions.displayError) this.handleErrorWithSnackBar(err, updatedOptions.errorMessage || err?.message, updatedOptions.suppressToastStatuses)\n        this.isPending.set(false)\n        this.stateChanged$.next();\n        return this.handleError(err);\n      })\n    )\n  }\n\n  private createObservable<T>(options: ApiRequest, request$: Observable<T>, funcName: string) {\n\n    const polling = options.polling ? (options.polling > 0 ? true : false) : false;\n    const isPolling =\n      polling &&\n      !(funcName === 'deleteRecordRequest' || funcName === 'updateRecordRequest' || funcName === 'createRecordRequest' || funcName === 'patchRecordRequest')\n        ? true\n        : false;\n\n    this.polling$.next();\n\n    const polling$ =\n      (isPolling && options.polling) || 0 >= 3\n        ? request$.pipe(\n            requestPolling((options.polling || 0) + 1, this.polling$, this.isPending),\n            tap(() => { this.countdown.set(0); this.stateChanged$.next(); }),\n            tap(() => {\n              if (!options.polling) return;\n              const count = options.polling ? options.polling : 0;\n              // console.log('COUNT:', count);\n              countdown(count)\n                .pipe(\n                  map((x: number) => {\n                    // console.log('XX:', count, x);\n                    const pollingInSec = options.polling || 0;\n                    const percentageCompleted = ((pollingInSec - x) / pollingInSec) * 100;\n                    return Math.round(percentageCompleted);\n                  })\n                )\n                .subscribe((countDownValue: number) => {\n                  this.countdown.set(countDownValue);\n                  this.stateChanged$.next();\n                });\n            }),\n          )\n        : request$.pipe(\n            catchError((err: any) => {\n\n              if (err instanceof HttpErrorResponse) {\n                this.error.set(true);\n                this.stateChanged$.next();\n                return this.handleError(err);\n              }\n\n              return throwError(() => err);\n            }),\n          )\n\n    return polling$.pipe(\n      (options?.retry && options.retry.times > 0)\n        ? delayedRetry((options.retry.delay || 3) * 1000, (options.retry.times || 0) - 1)\n        : (source: Observable<T>) => source,\n      catchError((err: any, caught: Observable<T>) => {\n\n        if (err instanceof HttpErrorResponse) {\n          this.error.set(true);\n          this.stateChanged$.next();\n          if(isPolling) this.stopPolling();\n          return this.handleError(err);\n        }\n\n        return throwError(() => err);\n      })\n    );\n  }\n\n  private createRequest(func: Function, options: ApiRequest, data?: any | any[]) {\n    const dataItem = this.prepareRequestData(options, data, func.name);\n    return func.bind(this)(dataItem.options, dataItem.data);\n  }\n\n  private prepareRequestData(options: ApiRequest, data: any, funcName: string) {\n\n    if ((options.mapper && (funcName === 'updateRecordRequest' || funcName === 'patchRecordRequest')) || funcName === 'createRecordRequest') {\n      if (options?.mapper) {\n        data = options.mapper\n          ? Array.isArray(data)\n            ? map((item) => options.mapper(item))\n            : options.mapper(data)\n          : data;\n      }\n    } else {\n      if (options?.adapter) {\n        data = Array.isArray(data)\n            ? map((item) => options.adapter(item))\n            : options.adapter(data)\n      }\n    }\n\n    return { options: options, data: data };\n  }\n\n  // MISC\n\n  private handleError(error: Response | any) {\n    // signals-consolidation Task 4.2: error/error$ is declared boolean and must stay one — this\n    // used to push error.message (a string) into it, matching HTTPManagerSignalsService's own\n    // (already-correct) handleError().\n    this.error.set(true)\n    this.stateChanged$.next();\n    return throwError(() => error)\n  }\n\n  private handleErrorWithSnackBar(error: Response | any, message?: string, suppressToastStatuses: number[] = []) {\n\n    if (suppressToastStatuses.includes(error?.status)) return\n\n    const displayError = ToastDisplay.adapt({\n            message: message || error.message || `${error.status} - ${error.statusText}`,\n            action: 'OK',\n            color: ToastColors.ERROR,\n            icon: 'error',\n          })\n\n    this.toastMessage.toastMessage(displayError, 5000) // 5 seconds\n\n  }\n\n  private handleSuccessWithSnackBar(message?: string) {\n\n    const displaySuccess = ToastDisplay.adapt({\n            message: message || 'Success',\n            color: ToastColors.SUCCESS,\n            icon: 'check_circle',\n          })\n\n    this.toastMessage.toastMessage(displaySuccess)\n\n  }\n\n  private stopPolling() {\n    this.isPending.set(false);\n    this.stateChanged$.next();\n    this.polling$.next();\n  }\n\n  // ponytail: delegates straight into ObjectMergerService.mergeOptions(), which owns the raw\n  // options/params handling and merge-against-root-config logic in one shared place (see that\n  // method for why the raw, pre-adapt object matters).\n  private defineReqOptions(options: any, params?: any[]) {\n\n    return this.objectMergerService.mergeOptions(options, params)\n\n  }\n\n  // BATCH REQUESTS\n\n  /**\n   * Execute multiple HTTP requests with configurable execution strategy\n   * @param requests Array of ApiRequest configurations\n   * @param options Optional batch configuration (all properties optional)\n   * @returns Observable emitting array of data in the order of requests provided\n   */\n  getBatchRequests<U = T>(\n    requests: ApiRequest[],\n    options?: BatchOptions\n  ): Observable<U[]> {\n    const batchOptions = BatchOptions.adapt(options);\n\n    const mode = batchOptions.mode || 'sequential';\n\n    if (mode === 'parallel') {\n      return this.getParallelRequest(requests, batchOptions);\n    } else {\n      return this.getSequentialRequest(requests, batchOptions);\n    }\n  }\n\n  /**\n   * Execute requests sequentially (one at a time, in order)\n   * @param requests Array of ApiRequest configurations\n   * @param options Optional batch configuration\n   * @returns Observable emitting array of data when all requests complete\n   */\n  getSequentialRequest<U = T>(\n    requests: ApiRequest[],\n    options?: BatchOptions,\n    successMessage?: string,\n    errorMessage?: string\n  ): Observable<U[]> {\n    const batchOptions = BatchOptions.adapt(options);\n    const results: U[] = new Array(requests.length);\n\n    this.isBatchPending.set(true);\n    this.batchError.set(null);\n    this.stateChanged$.next();\n\n    return from(requests).pipe(\n      concatMap((req, index) => {\n        return this.getRequest<U>(req, undefined).pipe(\n          tap(data => {\n            results[index] = data;\n          }),\n          catchError(error => this.handleSequentialError(req, error, index, batchOptions))\n        );\n      }),\n      toArray(),\n      tap(() => {\n        if (batchOptions.displaySuccess) this.handleSuccessWithSnackBar(successMessage);\n        this.batchResults.set(results);\n        this.isBatchPending.set(false);\n        this.stateChanged$.next();\n      }),\n      map(() => results),\n      catchError(error => {\n        this.batchError.set(error);\n        this.isBatchPending.set(false);\n        this.stateChanged$.next();\n        return throwError(() => error);\n      })\n    );\n  }\n\n  /**\n   * Execute requests in parallel with concurrency control\n   * @param requests Array of ApiRequest configurations\n   * @param options Optional batch configuration with concurrency limit\n   * @returns Observable emitting array of data when all requests complete\n   */\n  getParallelRequest<U = T>(\n    requests: ApiRequest[],\n    options?: BatchOptions,\n    successMessage?: string,\n    errorMessage?: string\n  ): Observable<U[]> {\n    const batchOptions = BatchOptions.adapt(options);\n    const concurrency = batchOptions.concurrency || 3;\n    const results: U[] = new Array(requests.length);\n\n    this.isBatchPending.set(true);\n    this.batchError.set(null);\n    this.stateChanged$.next();\n\n    return from(requests).pipe(\n      mergeMap((req, index) => {\n        return this.getRequest<U>(req, undefined).pipe(\n          tap(data => {\n            results[index] = data;\n          }),\n          catchError(error => this.handleParallelError(req, error, index, batchOptions))\n        );\n      }, concurrency),\n      toArray(),\n      tap(() => {\n        if (batchOptions.displaySuccess) this.handleSuccessWithSnackBar(successMessage);\n        this.batchResults.set(results);\n        this.isBatchPending.set(false);\n        this.stateChanged$.next();\n      }),\n      map(() => results),\n      catchError(error => {\n        this.batchError.set(error);\n        this.isBatchPending.set(false);\n        this.stateChanged$.next();\n        return throwError(() => error);\n      })\n    );\n  }\n\n  /**\n   * Execute multiple HTTP requests and emit individual state changes in real-time\n   * @param requests Array of ApiRequest configurations\n   * @param options Optional batch configuration (all properties optional)\n   * @returns Observable stream of individual request states\n   */\n  getBatchRequestsStream<U = T>(\n    requests: ApiRequest[],\n    options?: BatchOptions\n  ): Observable<BatchRequestState<U>> {\n    const batchOptions = BatchOptions.adapt(options);\n    const mode = batchOptions.mode || 'sequential';\n\n    if (mode === 'parallel') {\n      return this.getParallelStream(requests, batchOptions);\n    } else {\n      return this.getSequentialStream(requests, batchOptions);\n    }\n  }\n\n  /**\n   * Execute requests sequentially and emit state changes\n   */\n  private getSequentialStream<U>(\n    requests: ApiRequest[],\n    options: BatchOptions\n  ): Observable<BatchRequestState<U>> {\n    this.batchStates.set([]);\n    this.stateChanged$.next();\n\n    return from(requests).pipe(\n      concatMap((req, index) => {\n        const pending$: Observable<BatchRequestState<U>> = of({\n          index,\n          request: req,\n          isPending: true\n        });\n\n        const result$: Observable<BatchRequestState<U>> = this.getRequest<U>(req).pipe(\n          map((data) => ({\n            index,\n            request: req,\n            isPending: false,\n            data\n          }) as BatchRequestState<U>),\n          catchError((error) => of({\n            index,\n            request: req,\n            isPending: false,\n            error\n          } as BatchRequestState<U>))\n        );\n\n        return pending$.pipe(\n          concatMap(() => result$)\n        );\n      }),\n      tap(state => {\n        this.batchStates.update(arr => {\n          const next = [...arr];\n          next[state.index] = state;\n          return next;\n        });\n        this.stateChanged$.next();\n      })\n    );\n  }\n\n  /**\n   * Execute requests in parallel and emit state changes\n   */\n  private getParallelStream<U>(\n    requests: ApiRequest[],\n    options: BatchOptions\n  ): Observable<BatchRequestState<U>> {\n    const concurrency = options.concurrency || 3;\n\n    this.batchStates.set([]);\n    this.stateChanged$.next();\n\n    return from(requests).pipe(\n      mergeMap((req, index) => {\n        const pending$: Observable<BatchRequestState<U>> = of({\n          index,\n          request: req,\n          isPending: true\n        });\n\n        const result$: Observable<BatchRequestState<U>> = this.getRequest<U>(req).pipe(\n          map((data) => ({\n            index,\n            request: req,\n            isPending: false,\n            data\n          }) as BatchRequestState<U>),\n          catchError((error) => of({\n            index,\n            request: req,\n            isPending: false,\n            error\n          } as BatchRequestState<U>))\n        );\n\n        return pending$.pipe(\n          concatMap(() => result$)\n        );\n      }, concurrency),\n      tap(state => {\n        this.batchStates.update(arr => {\n          const next = [...arr];\n          next[state.index] = state;\n          return next;\n        });\n        this.stateChanged$.next();\n      })\n    );\n  }\n\n  private handleSequentialError<U>(\n    request: ApiRequest,\n    error: any,\n    index: number,\n    options: BatchOptions\n  ): Observable<U> {\n    if (options.logErrors !== false) {\n      console.error(`Batch request ${index} failed:`, error);\n    }\n\n    if (options.stopOnError) {\n      return throwError(() => error);\n    }\n\n    if (options.ignoreErrors) {\n      return of(undefined as unknown as U);\n    }\n\n    return throwError(() => error);\n  }\n\n  private handleParallelError<U>(\n    request: ApiRequest,\n    error: any,\n    index: number,\n    options: BatchOptions\n  ): Observable<U> {\n    if (options.logErrors !== false) {\n      console.error(`Batch request ${index} failed:`, error);\n    }\n\n    if (options.ignoreErrors) {\n      return of(undefined as unknown as U);\n    }\n\n    return of(undefined as unknown as U);\n  }\n}\n\n","export interface ChannelInfoInterface {\n  name: string\n  canSubscribe: boolean\n}\n\nexport class ChannelInfo implements ChannelInfoInterface {\n\n  constructor(\n    public name = '',\n    public canSubscribe = false,\n  ) {}\n\n  static adapt(item?: any): ChannelInfo {\n    // Handle string input (backward compatibility with old server responses)\n    if (typeof item === 'string') {\n      return new ChannelInfo(item, true);  // Assume subscribable\n    }\n\n    // Handle object input (new server responses)\n    // Default canSubscribe to true if not specified (backward compat)\n    return new ChannelInfo(\n      item?.name,\n      item?.canSubscribe ?? true,\n    )\n  }\n\n}\n\n\n","export interface WSUserInterface {\n    id: string,\n    ldap?: string,\n    name?: string,\n    email?: string,\n    [key: string]: any,  // Allow additional properties\n}\n\nexport class WSUser implements WSUserInterface {\n\n  constructor(\n    public id: string = '',\n    public ldap: string = '',\n    public name: string = '',\n    public email: string = '',\n  ) {}\n\n  static adapt(item?: any): WSUser {\n    const user = new WSUser(\n      item?.id || item?.sessionId,  // Support both for backward compatibility\n      item?.ldap,\n      item?.name,\n      item?.email,\n    );\n    // Copy any additional properties\n    if (item) {\n      Object.keys(item).forEach(key => {\n        if (!['id', 'sessionId', 'ldap', 'name', 'email'].includes(key)) {\n          (user as any)[key] = item[key];\n        }\n      });\n    }\n    return user;\n  }\n\n}\n\n\n","export enum CommunicationType {\n  MESSAGE,\n  ALERT,\n  OTHER\n}\n","export enum ChannelType {\n  STATE = 'SYS',           // System/state channel (CRUD operations)\n  PUBLIC = 'PUB',          // Public messaging (chat/broadcast)\n  NOTIFICATION = 'MES',    // Notification channel (persistent messages)\n  CUSTOM = ''              // No prefix (raw channel name)\n}\n","export interface StateMessageInterface {\n  sessionId: { id: string; ldap?: string; name?: string; email?: string };\n  content: any;\n}\n\nexport class StateMessage implements StateMessageInterface {\n  constructor(\n    public sessionId: { id: string; ldap?: string; name?: string; email?: string } = { id: '' },\n    public content: any = {}\n  ) {}\n\n  static adapt(item?: any): StateMessage {\n    return new StateMessage(\n      item?.sessionId,\n      item?.content\n    );\n  }\n}\n","export interface PublicMessageInterface {\n  sessionId: { id: string; ldap?: string; name?: string; email?: string };\n  content: { message: string; [key: string]: any };\n}\n\nexport class PublicMessage implements PublicMessageInterface {\n  constructor(\n    public sessionId: { id: string; ldap?: string; name?: string; email?: string } = { id: '' },\n    public content: { message: string; [key: string]: any } = { message: '' }\n  ) {}\n\n  static adapt(item?: any): PublicMessage {\n    return new PublicMessage(\n      item?.sessionId,\n      item?.content\n    );\n  }\n}\n","export interface NotificationMessageInterface {\n  sessionId: { id: string; ldap?: string; name?: string; email?: string; color?: string };\n  message: string;\n  [key: string]: any;\n}\n\nexport class NotificationMessage implements NotificationMessageInterface {\n  sessionId: { id: string; ldap?: string; name?: string; email?: string; color?: string };\n  message: string;\n  [key: string]: any;\n\n  constructor(\n    sessionId: { id: string; ldap?: string; name?: string; email?: string; color?: string } = { id: '' },\n    message: string = '',\n    additionalProperties: any = {}\n  ) {\n    this.sessionId = sessionId;\n    this.message = message;\n    Object.assign(this, additionalProperties);\n  }\n\n  static adapt(item?: any): NotificationMessage {\n    return new NotificationMessage(\n      item?.sessionId,\n      item?.message,\n      item\n    );\n  }\n}\n","export interface TableSchemaDefInterface {\n  table: string\n  schema: string\n}\n\nexport class TableSchemaDef implements TableSchemaDefInterface {\n  constructor(\n    public table = 'unknown',\n    public schema: string = '',\n  ) {}\n\n  static adapt(item?: any): TableSchemaDef {\n\n    const schemaArray = (item?.schema && Array.isArray(item.schema)) ? item.schema : item.schema.split(',')\n    const schema = schemaArray.map((item: string) => this.cleanString(item)).join()\n\n    return new TableSchemaDef(\n      (item?.table) ? this.cleanString(item.table) : 'unknown',\n      schema,\n    )\n\n  }\n\n  static cleanString(str: string): string {\n    // Allow alphanumeric, spaces, underscores, and Dexie schema characters (+, &, *, [, ])\n    const cleanStr = str\n      .replace(/[^a-zA-Z0-9\\s_+\\&*\\[\\]]/g, '')\n      .trim();\n\n    return cleanStr;\n  }\n\n}\n","import { Injectable } from '@angular/core';\nimport Dexie, { Table } from 'dexie';\nimport { from, Observable, of } from 'rxjs';\nimport { catchError, map, switchMap } from 'rxjs/operators';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class DbService extends Dexie {\n\n  readonly storageDB = \"global_storage_db\"\n\n  get db() { return this; }\n\n  private dbReady: Promise<void>;\n\n  constructor() {\n\n    super(\"global_storage_db\");\n\n    this.on('blocked', () => {\n        console.warn('Database upgrade blocked! Please close other tabs/windows of this app.');\n    });\n\n    this.on('versionchange', () => {\n      console.warn('Database version changed in another tab. Closing current database connection to allow upgrade.');\n      this.close();\n    });\n\n    this.dbReady = this.init();\n\n  }\n\n  private async init() {\n    try {\n      // Check if database already exists\n      const dbExists = await Dexie.exists(this.storageDB);\n\n      if (dbExists) {\n        // Database exists - just open it without declaring version\n        // This allows Dexie to use the existing schema and version\n        console.log(`Database \"${this.storageDB}\" already exists. Opening with existing schema...`);\n\n        if (!this.isOpen()) {\n          await this.open();\n        }\n\n        console.log(`✅ Connected to existing database. Current version: ${this.verno}`);\n        console.log(`📊 Existing tables: ${this.getTables.join(', ')}`);\n      } else {\n        // New database - initialize with empty schema at version 1\n        console.log(`Creating new database \"${this.storageDB}\"...`);\n\n        if (this.isOpen()) {\n          this.close();\n        }\n\n        this.version(1).stores({});\n        await this.open();\n        console.log(`✅ New database initialized. Current version: ${this.verno}`);\n      }\n    } catch (err) {\n      console.error('Failed to initialize database:', err);\n      throw err;\n    }\n  }\n\n  protected async createNewDatabase() {\n    if (this.isOpen()) {\n      this.close();\n    }\n    await this.open();\n  }\n\n  get vr() {\n    return this.verno;\n  }\n\n  get nextVr() {\n    const v = this.verno;\n    return (isNaN(v) || v === 0) ? 1 : v + 1;\n  }\n\n  get getTables() {\n    return this.tables.map((table) => table.name);\n  }\n\n  async hasDatabase() {\n    return await Dexie.exists(this.storageDB);\n  }\n\n  getTable(tableName: string): Table<any, any> | undefined {\n    try {\n        return this.table(tableName);\n    } catch (error) {\n        return undefined;\n    }\n  }\n\n  tableExists(tableName: string): boolean {\n    return this.tables.some(t => t.name === tableName);\n  }\n\n  protected async updateTable(tableName: string, find: { key: string, value: string | number }, data: any): Promise<boolean> {\n    const table = this.getTable(tableName);\n    if (!table || !find || !find.key) return false;\n\n    try {\n      const count = await table.where(find.key).equals(find.value).modify(data);\n      return count > 0;\n    } catch (error) {\n      console.error('Error updating table:', error);\n      return false;\n    }\n  }\n\n  protected async createTable(tableName: string, schema: string) {\n    if (!tableName || !schema) return;\n    this.dbReady = this.dbReady.then(() => this._doCreateTable(tableName, schema));\n    await this.dbReady;\n  }\n\n  private async _doCreateTable(tableName: string, schema: string): Promise<void> {\n    const safeTableName = this.cleanTableName(tableName);\n    const safeSchema = schema.trim();\n\n    const currentSchema = this.getCurrentSchema();\n    const existingSchema = currentSchema[safeTableName]?.trim();\n\n    if (this.tableExists(safeTableName) && existingSchema === safeSchema) {\n      return;\n    }\n\n    console.log('Current Schema before update:', currentSchema);\n\n    currentSchema[safeTableName] = safeSchema;\n\n    const nextVersion = this.verno + 1;\n    console.log(`Creating table ${safeTableName}. Upgrading to version ${nextVersion}. New Schema:`, currentSchema);\n\n    if (this.isOpen()) {\n      this.close();\n    }\n\n    this.version(nextVersion).stores(currentSchema);\n\n    try {\n        await this.open();\n        const created = this.tables.some(t => t.name === safeTableName);\n        if (!created) {\n         console.error(`CRITICAL: Table ${safeTableName} was NOT created after upgrade! Tables found:`, this.tables.map(t => t.name));\n         throw new Error(`Table '${safeTableName}' was not created after schema upgrade`);\n        } else {\n             console.log(`Database opened successfully version ${this.verno}. Table ${safeTableName} verified.`);\n        }\n    } catch (err) {\n        console.error('Error opening database after schema update:', err);\n      throw err;\n    }\n  }\n\n  protected async DBOpened() {\n    try {\n      await this.dbReady;\n      return this.isOpen();\n    } catch (err) {\n      console.error('DBOpened: init failed', err);\n      return false;\n    }\n  }\n\n  private getCurrentSchema(): { [key: string]: string } {\n    const schema: { [key: string]: string } = {};\n\n    if (!this.tables || this.tables.length === 0) {\n        return schema;\n    }\n\n    this.tables.forEach(table => {\n      const primKey = table.schema.primKey;\n      const indexes = table.schema.indexes;\n\n      let schemaStr = \"\";\n\n      if (primKey.auto) schemaStr += \"++\";\n\n      if (Array.isArray(primKey.keyPath)) {\n          schemaStr += `[${primKey.keyPath.join('+')}]`;\n      } else {\n          schemaStr += primKey.keyPath || \"\";\n      }\n\n      indexes.forEach(idx => {\n        schemaStr += \",\";\n        if (idx.unique) schemaStr += \"&\";\n        if (idx.multi) schemaStr += \"*\";\n\n        if (Array.isArray(idx.keyPath)) {\n            schemaStr += `[${idx.keyPath.join('+')}]`;\n        } else {\n            schemaStr += idx.keyPath || \"\";\n        }\n      });\n\n      schema[table.name] = schemaStr;\n    });\n    return schema;\n  }\n\n  protected deleteAndReinitialize(): Observable<boolean> {\n    return from(\n      this.delete({ disableAutoOpen: false }).then(async () => {\n        console.log('[DB] Database deleted. Reopening...');\n        try {\n          await this.open();\n          this.dbReady = Promise.resolve();\n          console.log(`[DB] Reopened database. Version: ${this.verno}, Tables: ${this.getTables.join(', ')}`);\n          return this.isOpen();\n        } catch (openErr) {\n          console.error('[DB] Failed to reopen after delete:', openErr);\n          return false;\n        }\n      })\n    ).pipe(\n      catchError((err) => {\n        console.error('[DB] deleteAndReinitialize failed:', err);\n        return of(false);\n      })\n    );\n  }\n\n  protected cleanTableName(str: string): string {\n    return str\n      .replace(/[^a-zA-Z0-9\\s_]/g, '')\n      .replace(/\\s+/g, '_')\n      .trim()\n      .toLowerCase();\n  }\n\n}\n","import { computed, inject, Injectable, Signal, signal, WritableSignal } from '@angular/core';\nimport { DbService } from './db.storage.service';\nimport { LocalStorageManagerService } from '../local-storage-manager-service/local-storage-manager.service';\n\nimport { TableSchemaDef } from './models/table-schema';\nimport { EMPTY, from, Observable, of, Subject, throwError } from 'rxjs';\nimport { catchError, finalize, map, switchMap, tap } from 'rxjs/operators';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class DatabaseManagerService extends DbService {\n\n  private localStorageManager = inject(LocalStorageManagerService);\n\n  // --- Reactive state: signals are the primary form, `$` observables are derived\n  // from them below via toSyncObservable() — same convention as\n  // local-storage-manager.service.ts and toast-message-display's service. ---\n\n  private readonly pendingCountSignal: WritableSignal<number> = signal(0);\n  private readonly tableNamesSignal: WritableSignal<string[]> = signal([]);\n  private readonly databaseReadySignal: WritableSignal<boolean> = signal(false);\n\n  readonly isPending: Signal<boolean> = computed(() => this.pendingCountSignal() > 0);\n  readonly tableNames = this.tableNamesSignal.asReadonly();\n  readonly databaseReady = this.databaseReadySignal.asReadonly();\n\n  // Pinged synchronously whenever one of the signals above changes, so the $\n  // observables below emit once per change, in order — not toObservable(), which\n  // backs emissions with an effect() that coalesces rapid synchronous writes.\n  private readonly stateChanged$ = new Subject<void>();\n\n  private toSyncObservable<T>(sig: Signal<T>): Observable<T> {\n    return new Observable<T>(subscriber => {\n      let last = sig();\n      subscriber.next(last);\n\n      const sub = this.stateChanged$.subscribe(() => {\n        const value = sig();\n        if (!Object.is(value, last)) {\n          last = value;\n          subscriber.next(value);\n        }\n      });\n\n      return () => sub.unsubscribe();\n    });\n  }\n\n  readonly isPending$: Observable<boolean> = this.toSyncObservable(this.isPending);\n  readonly tableNames$: Observable<string[]> = this.toSyncObservable(this.tableNames);\n  readonly databaseReady$: Observable<boolean> = this.toSyncObservable(this.databaseReady);\n\n  // isPending is reference-counted, not a plain boolean: several methods below call\n  // other trackPending()-wrapped methods internally (findTableRecord() ->\n  // findTableRecords(), the recovery cascade -> createDatabaseTable(), etc.). A\n  // boolean would flip back to false the moment the *inner* call resolves, even\n  // while the *outer* call's own remaining work is still running. A count composes\n  // correctly regardless of nesting depth.\n  private trackPending<T>(obs$: Observable<T>): Observable<T> {\n    this.pendingCountSignal.update(n => n + 1);\n    this.stateChanged$.next();\n    return obs$.pipe(\n      finalize(() => {\n        this.pendingCountSignal.update(n => n - 1);\n        this.stateChanged$.next();\n      })\n    );\n  }\n\n  private refreshTableNames(): void {\n    this.tableNamesSignal.set(this.tables.map((item: any) => item.name));\n    this.stateChanged$.next();\n  }\n\n  constructor() {\n    super()\n  }\n\n  getDatabaseTables() {\n    return this.trackPending(from(this.DBOpened()).pipe(\n      map(() => this.tables.map((item: any) => item.name))\n    ))\n  }\n\n  databaseExists(): Observable<boolean> {\n    return this.trackPending(from(this.hasDatabase()).pipe(\n      tap((exists) => {\n        this.databaseReadySignal.set(exists);\n        this.stateChanged$.next();\n      })\n    ));\n  }\n\n  hasDatabaseTable(table: string): Observable<boolean> {\n    const tableName = this.cleanTableName(table);\n    return this.trackPending(from(this.DBOpened()).pipe(\n      map(() => {\n        return this.tableExists(tableName)\n      })\n    ))\n  }\n\n  getDatabaseTable(table: string): Observable<any> {\n    const tableName = this.cleanTableName(table);\n    return this.trackPending(from(this.DBOpened()).pipe(\n      map(() => {\n          const found = this.getTable(tableName);\n          if(!found) {\n            console.warn('No Such Table:', tableName)\n            return null;\n          }\n          return found;\n      })\n    ))\n  }\n\n  getDatabaseTableSchema(table: string): Observable<string[]> {\n    const tableName = this.cleanTableName(table);\n    return this.trackPending(this.getDatabaseTable(tableName).pipe(\n      map((dbTable: any) => {\n        if(!dbTable) return []\n        const cols = dbTable.schema.indexes.map((col: any) => col.name)\n        const pri = dbTable.schema.primKey.name\n        return [pri, ...cols]\n      })\n    ));\n  }\n\n  createDatabaseTable(tableDef: TableSchemaDef) {\n    const tableName = this.cleanTableName(tableDef.table);\n    return this.trackPending(from(this.createTable(tableDef.table, tableDef.schema)).pipe(\n      switchMap(() => from(this.DBOpened())),\n      map((opened) => opened && this.tableExists(tableName)),\n      tap(() => this.refreshTableNames()),\n      catchError((error) => {\n        console.error(`createDatabaseTable: failed for table '${tableName}'`, error);\n        return of(false);\n      })\n    ));\n  }\n\n  updateDatabaseTableSchema(tableDef: TableSchemaDef) {\n    return this.trackPending(from(this.createTable(tableDef.table, tableDef.schema)).pipe(\n      switchMap(() => this.getDatabaseTable(tableDef.table)),\n      tap(() => this.refreshTableNames())\n    ));\n  }\n\n  // CRUD\n  findTableRecords(table: string, column: string, value: any) {\n    const tableName = this.cleanTableName(table);\n    return this.trackPending(this.getDatabaseTable(tableName).pipe(\n      switchMap((tableData: any) => {\n        if (!tableData) {\n          console.warn(`findTableRecords: Table '${tableName}' not found`);\n          return from([]);\n        }\n        return from(tableData.where(column).equals(value).toArray());\n      })\n    ));\n  }\n\n  findTableRecord(table: string, column: string, value: any) {\n    const tableName = this.cleanTableName(table);\n    return this.trackPending(this.findTableRecords(tableName, column, value).pipe(\n      map((records: any) => records && records.length > 0 ? records[0] : null)\n    ));\n  }\n\n  getTableRecords(table: string) {\n    const tableName = this.cleanTableName(table);\n    return this.trackPending(this.getDatabaseTable(tableName).pipe(\n      switchMap((tableData: any) => {\n        if (!tableData) {\n          console.warn(`getTableRecords: Table '${tableName}' not found`);\n          return from([]);\n        }\n        return from(tableData.toArray());\n      })\n    ));\n  }\n\n  getTableRecord(table: string, id: number) {\n    const tableName = this.cleanTableName(table);\n    return this.trackPending(this.getDatabaseTable(tableName).pipe(\n      switchMap((tableData: any) => {\n        if (!tableData) {\n          console.warn(`getTableRecord: Table '${tableName}' not found`);\n          return from([null]);\n        }\n        return from(tableData.get(id)).pipe(\n          map((record: any) => record || null)\n        );\n      })\n    ));\n  }\n\n  createTableRecord(table: string, record: any) {\n    const tableName = this.cleanTableName(table);\n    return this.trackPending(this.createTableRecords(tableName, [record])\n    .pipe(\n      map((item: any) => item ? item[0] : null)));\n  }\n\n  createTableRecords(table: string, records: any[]) {\n    const tableName = this.cleanTableName(table);\n\n    // Keep full object payload; Dexie stores non-indexed properties as well.\n    const insertRecords = records.map((record: any) => {\n      const payload = { ...(record || {}) };\n      if (payload.id === undefined || payload.id === null || payload.id === '') {\n        delete payload.id;\n      }\n      return payload;\n    });\n\n    const writeRecords = () => from(this.DBOpened()).pipe(\n      switchMap((opened) => {\n        if (!opened) {\n          console.error(`createTableRecords: DB not open. Cannot write to '${tableName}'.`);\n          return throwError(() => new Error(`DB not open for table '${tableName}'`));\n        }\n\n        const tableInstance = this.getTable(tableName);\n        if (!tableInstance) {\n          console.error(`createTableRecords: Table '${tableName}' does not exist in DB version ${this.verno}. Available:`, this.tables.map(t => t.name));\n          return throwError(() => new Error(`Table '${tableName}' not found`));\n        }\n\n        return from(tableInstance.bulkPut(insertRecords)).pipe(\n          map(() => insertRecords)\n        );\n      })\n    );\n\n    const recreateMissingTableAndRetry = () => {\n      const inferredSchema = this.inferSchemaFromRecords(insertRecords);\n\n      if (!inferredSchema) {\n        // console.warn(`createTableRecords: Could not infer schema for '${tableName}'. Retrying after DB reopen.`);\n        return from(this.createNewDatabase()).pipe(\n          switchMap(() => writeRecords())\n        );\n      }\n\n      const tableDef = TableSchemaDef.adapt({ table: tableName, schema: inferredSchema });\n\n      return this.createDatabaseTable(tableDef).pipe(\n        switchMap((created) => {\n          if (!created) {\n            // console.warn(`createTableRecords: Failed to recreate table '${tableName}' from inferred schema. Retrying after DB reopen.`);\n            return from(this.createNewDatabase()).pipe(\n              switchMap(() => writeRecords())\n            );\n          }\n\n          return writeRecords();\n        })\n      );\n    };\n\n    return this.trackPending(writeRecords().pipe(\n      catchError((error) => {\n        if (!this.isMissingObjectStoreError(error)) {\n          throw error;\n        }\n\n        return recreateMissingTableAndRetry().pipe(\n          catchError((retryError) => {\n            if (!this.isMissingObjectStoreError(retryError)) {\n              console.error(`createTableRecords: Retry failed for '${tableName}'`, retryError);\n              throw retryError;\n            }\n\n            console.warn(`createTableRecords: Table '${tableName}' still missing after retry. Deleting DB and reinitializing...`);\n            return this.deleteAndReinitialize().pipe(\n              switchMap((reinitialized) => {\n                if (!reinitialized) {\n                  throw retryError;\n                }\n                const inferredSchema = this.inferSchemaFromRecords(insertRecords);\n                if (!inferredSchema) {\n                  throw retryError;\n                }\n                const tableDef = TableSchemaDef.adapt({ table: tableName, schema: inferredSchema });\n                return this.createDatabaseTable(tableDef).pipe(\n                  switchMap(() => writeRecords())\n                );\n              }),\n              catchError((finalError) => {\n                console.error(`createTableRecords: All retries exhausted for '${tableName}'`, finalError);\n                throw finalError;\n              })\n            );\n          })\n        );\n      })\n    ));\n  }\n\n  private inferSchemaFromRecords(records: any[]): string | null {\n    if (!Array.isArray(records) || records.length === 0) {\n      return null;\n    }\n\n    const sample = records.find((record: any) => record && typeof record === 'object');\n    if (!sample) {\n      return null;\n    }\n\n    const fields = Object.keys(sample)\n      .filter((key) => key !== 'id')\n      .filter((key) => {\n        const value = sample[key];\n        return value === null || ['string', 'number', 'boolean'].includes(typeof value);\n      })\n      .sort();\n\n    return ['++id', ...fields].join(', ');\n  }\n\n  private isMissingObjectStoreError(error: any): boolean {\n    const name = String(error?.name || '').toLowerCase();\n    const innerName = String(error?.inner?.name || '').toLowerCase();\n    const message = String(error?.message || error?.inner?.message || '').toLowerCase();\n\n    return (\n      name.includes('notfounderror') ||\n      innerName.includes('notfounderror') ||\n      message.includes('object store') ||\n      message.includes('one of the specified object stores was not found')\n    );\n  }\n\n  updateTableRecord(table: string, record: any) {\n    const tableName = this.cleanTableName(table);\n    console.log(`🔵 updateTableRecord: INPUT table='${table}' CLEANED='${tableName}'`);\n    return this.trackPending(this.updateTableRecords(tableName, [record])\n    .pipe(\n      map(item => item.length > 0 ? item[0] : null)\n    ));\n  }\n\n  updateTableRecords(table: string, records: any[]) {\n\n    const tableName = this.cleanTableName(table);\n    console.log(`🔵 updateTableRecords: INPUT table='${table}' CLEANED='${tableName}' recordCount=${records.length}`);\n\n    return this.trackPending(this.getDatabaseTable(tableName).pipe(\n\n      switchMap((tableData: any) => {\n\n        if (!tableData) {\n          console.warn(`❌ updateTableRecords: Table '${tableName}' not found`);\n          return EMPTY;\n        }\n        console.log(`✅ updateTableRecords: Table '${tableName}' FOUND, executing bulkPut with ${records.length} records`);\n\n        const insertRecords = records.map((record: any) => {\n          const payload = { ...(record || {}) };\n          if (payload.id === undefined || payload.id === null || payload.id === '') {\n            delete payload.id;\n          }\n          return payload;\n        });\n\n        return from(tableData.bulkPut(insertRecords)).pipe(\n            map(() => insertRecords)\n        );\n\n      })\n\n    ));\n\n  }\n\n  deleteTableRecord<T>(table: string, id: number) {\n    const tableName = this.cleanTableName(table);\n    return this.trackPending(this.deleteTableRecords(tableName, [id])\n    .pipe(\n      map(item => item.length > 0 ? item[0] : null)\n    ));\n  }\n\n  deleteTableRecords(table: string, ids: number[]) {\n    const tableName = this.cleanTableName(table);\n    return this.trackPending(this.getDatabaseTable(tableName).pipe(\n\n      switchMap((tableData: any) => {\n\n        return this.getDatabaseTableSchema(tableName).pipe(\n\n          switchMap((schema: string[]) => {\n\n            console.log(`deleteTableRecords: Starting delete of ${ids.length} records from ${table}. IDs:`, ids);\n\n            return from(tableData.bulkDelete(ids)).pipe(\n                map(() => ids)\n            );\n\n          })\n\n        )\n\n      })\n\n    ));\n\n  }\n\n  // Reconciles a table to a server's full record set: upserts every given record\n  // (add or update) and deletes any local record whose id isn't in that set. Unlike\n  // createTableRecords/updateTableRecords (plain bulkPut, additive-only), this is the\n  // only write path that removes local records — so it must only ever be called with\n  // a genuine full record set, never a partial/delta one, or it will delete records\n  // the caller simply didn't happen to include.\n  reconcileTableRecords(table: string, records: any[]) {\n    const tableName = this.cleanTableName(table);\n\n    const insertRecords = records.map((record: any) => {\n      const payload = { ...(record || {}) };\n      if (payload.id === undefined || payload.id === null || payload.id === '') {\n        delete payload.id;\n      }\n      return payload;\n    });\n\n    const serverIds = new Set(insertRecords.map((record: any) => record.id).filter((id: any) => id !== undefined));\n\n    return this.trackPending(this.getDatabaseTable(tableName).pipe(\n      switchMap((tableData: any) => {\n        if (!tableData) {\n          console.warn(`reconcileTableRecords: Table '${tableName}' not found`);\n          return EMPTY;\n        }\n\n        return from(tableData.toCollection().primaryKeys() as Promise<any[]>).pipe(\n          switchMap((existingIds: any[]) => {\n            const staleIds = existingIds.filter((id) => !serverIds.has(id));\n            const deleteStale$ = staleIds.length > 0 ? from(tableData.bulkDelete(staleIds)) : of(undefined);\n\n            return deleteStale$.pipe(\n              switchMap(() => from(tableData.bulkPut(insertRecords))),\n              map(() => ({ records: insertRecords, removedIds: staleIds }))\n            );\n          })\n        );\n      })\n    ));\n  }\n\n  clearTable(table: string) {\n\n    const tableName = this.cleanTableName(table);\n\n    this.localStorageManager.deleteStore({ name: tableName });\n\n    try {\n      const tableInstance = this.table(tableName);\n      if (!tableInstance) {\n        console.warn(`clearTable: Table '${tableName}' not found`);\n        return this.trackPending(of([]));\n      }\n\n      return this.trackPending(from(Promise.resolve().then(() => {\n        return tableInstance.clear();\n      })).pipe(\n        map(() => [])\n      ));\n    } catch (error) {\n      console.error(`clearTable: ❌ Error:`, error);\n      return this.trackPending(of([]));\n    }\n  }\n\n  // clearDatabase() is deliberately NOT piped through trackPending(): it returns\n  // void (fire-and-forget, subscribing internally — a pinned, unchanged quirk from\n  // the archived tests change), and trackPending() always returns an Observable, so\n  // wrapping it here would require changing this method's return type.\n  clearDatabase(): void {\n    this.deleteAndReinitialize().pipe(\n      tap(() => {\n        this.localStorageManager.clearAllStoredData();\n        this.refreshTableNames();\n      }),\n      catchError((error) => {\n        console.error('clearDatabase: ❌ Error clearing database:', error);\n        return of(false);\n      })\n    ).subscribe();\n  }\n\n  resetDatabase(): Observable<boolean> {\n    return this.trackPending(this.deleteAndReinitialize().pipe(\n      tap(() => this.refreshTableNames())\n    ));\n  }\n\n}\n","import { WSUser } from \"./ws-user.model\";\n\nexport interface ChannelMessageInterface {\n    messageId?: number,        // NEW: Sequential ID per channel\n    channel?: string,          // NEW: Channel name\n    isReplay?: boolean,        // NEW: Replay indicator\n    sessionId: any,\n    content: any,\n    timestamp?: string,\n}\n\nexport class ChannelMessage implements ChannelMessageInterface {\n\n  constructor(\n    public messageId?: number,\n    public channel?: string,\n    public isReplay?: boolean,\n    public sessionId: any = null,\n    public content: any = null,\n    public timestamp?: string,\n  ) {}\n\n  static adapt(item?: any): ChannelMessage {\n\n    return new ChannelMessage(\n      item?.messageId,\n      item?.channel,\n      item?.isReplay,\n      item?.sessionId || item?.id,  // Support both for backward compatibility\n      item?.content,\n      item?.timestamp,\n    )\n\n  }\n\n}\n","import { computed, inject, Inject, Injectable, InjectionToken, OnDestroy, Signal, signal, WritableSignal } from '@angular/core';\n\nimport { BehaviorSubject, Observable, of, Subject, interval, merge, Subscription } from 'rxjs';\nimport { tap, switchMap, concatMap, scan, delay, take, map, distinctUntilChanged, filter, catchError, finalize, shareReplay } from 'rxjs/operators';\nimport { DatabaseStorage } from '../../models/database-storage.model';\nimport { ApiRequest, RequestOptions, WSOptions, OperationResultModel } from './models';\nimport { WSUser } from '../ws-manager-service/models';\nimport { HTTPManagerService, DataType } from '../request-manager-services';\nimport { DatabaseManagerService } from '../database-manager-service';\nimport { TableSchemaDef } from '../database-manager-service/models/table-schema';\nimport { LocalStorageManagerService, StorageType } from '../local-storage-manager-service';\nimport { SettingOptions } from '../local-storage-manager-service/models/setting-options.model';\nimport { UtilsService } from '../..';\nimport { ChannelMessage } from '../ws-manager-service/models/channel-message.model';\nimport { WebSocketManagerService } from '../ws-manager-service/connection';\nimport { LoggerService } from '../../services/utils/logger.service';\n\nconst API_OPTS = new InjectionToken<ApiRequest>('API_OPTS');\n\n/**\n * Channel type enum for different communication purposes\n * - STATE: Private channels for state synchronization (SYS- prefix)\n * - MESSAGE: Public messaging/communication channels (PUB- prefix)\n * - NOTIFICATION: Notification channels with DB persistence (MES- prefix)\n */\nexport enum ChannelType {\n  STATE = 'SYS',\n  MESSAGE = 'PUB',\n  NOTIFICATION = 'MES'\n}\n\n/**\n * Utility function to create prefixed channel name\n * @param channelType - The type of channel\n * @param channelName - The base channel name\n * @returns Prefixed channel name (e.g., 'SYS-USERS123')\n */\nexport function createChannelName(channelType: ChannelType, channelName: string): string {\n  return `${channelType}-${channelName}`;\n}\n\nexport interface APIStateManagerData<T> {\n  data: T[]\n  dataObject: T | null\n}\n\nconst defaultState: APIStateManagerData<any> = {\n  data: [],\n  dataObject: null,\n};\n\n@Injectable()\nexport class HTTPManagerStateService<T extends { id: number|string }> implements OnDestroy {\n\n  httpManagerService = inject(HTTPManagerService)\n  dbManagerService = inject(DatabaseManagerService)\n  localStorageManagerService = inject(LocalStorageManagerService)\n  utils = inject(UtilsService)\n  logger = inject(LoggerService)\n\n  // Tracks every subscription this class creates on its own (persistent trigger-fed pipes and\n  // per-call CRUD/stream requests) so ngOnDestroy() can tear them all down — replacing the\n  // cleanup ComponentStore previously provided for free via takeUntil(this.destroy$) on every effect.\n  private readonly subscriptions = new Subscription()\n\n  // --- Reactive core state: signals are the primary form, `$` observables are derived\n  // from them below via toSyncObservable() — same convention as local-storage-manager.service.ts,\n  // database.manager.service.ts, and store-state-manager.service.ts. Not toObservable(): that\n  // backs its emissions with an effect(), and effects coalesce rapid synchronous signal writes\n  // into a single async flush — losing intermediate mutations a Subject-backed ping always\n  // delivers synchronously, one per call.\n  private readonly stateSignal: WritableSignal<APIStateManagerData<T>> = signal(defaultState)\n\n  // Pinged synchronously by every mutation across all core signals in this file (data/dataObject,\n  // isPending, error, operationSuccess, page, totalPages, percentage) — one shared ping, same\n  // pattern as store-state-manager.service.ts's stateChanged$.\n  private readonly stateChanged$ = new Subject<void>()\n\n  private toSyncObservable<V>(sig: Signal<V>): Observable<V> {\n    return new Observable<V>(subscriber => {\n      let last = sig()\n      subscriber.next(last)\n\n      const sub = this.stateChanged$.subscribe(() => {\n        const value = sig()\n        if (!Object.is(value, last)) {\n          last = value\n          subscriber.next(value)\n        }\n      })\n\n      return () => sub.unsubscribe()\n    })\n  }\n\n  private updateCoreState(updater: (state: APIStateManagerData<T>) => APIStateManagerData<T>): void {\n    this.stateSignal.update(updater)\n    this.stateChanged$.next()\n  }\n\n  private readonly pendingCountSignal: WritableSignal<number> = signal(0)\n  private readonly errorSignal: WritableSignal<boolean | string> = signal(false)\n\n  readonly isPending: Signal<boolean> = computed(() => this.pendingCountSignal() > 0)\n  readonly error: Signal<boolean | string> = this.errorSignal.asReadonly()\n\n  error$ = this.toSyncObservable(this.error)\n  isPending$ = this.toSyncObservable(this.isPending).pipe(delay(1))\n\n  private beginPending(): void {\n    this.pendingCountSignal.update(n => n + 1)\n    this.errorSignal.set(false)\n    this.stateChanged$.next()\n  }\n\n  private endPending(): void {\n    this.pendingCountSignal.update(n => Math.max(0, n - 1))\n    this.stateChanged$.next()\n  }\n\n  private track<T>(): (source: Observable<T>) => Observable<T> {\n    return (source: Observable<T>) =>\n      new Observable<T>((subscriber) => {\n        this.beginPending()\n        const sub = source.subscribe({\n          next: (value) => subscriber.next(value),\n          error: (err) => {\n            this.errorSignal.set(err instanceof Error ? err.message : String(err ?? 'Request failed'))\n            this.stateChanged$.next()\n            subscriber.error(err)\n          },\n          complete: () => subscriber.complete(),\n        })\n        return () => {\n          sub.unsubscribe()\n          this.endPending()\n        }\n      })\n  }\n\n  private readonly operationSuccessSignal: WritableSignal<OperationResultModel | null> = signal(null)\n  readonly operationSuccess: Signal<OperationResultModel | null> = this.operationSuccessSignal.asReadonly()\n  operationSuccess$ = this.toSyncObservable(this.operationSuccess)\n\n  private emitOperationSuccess(result: OperationResultModel): void {\n    this.operationSuccessSignal.set(result)\n    this.stateChanged$.next()\n  }\n\n  // PAGINATION — declared but never mutated anywhere in this class; kept as dual\n  // signal/observable pairs for API parity, same dead-but-preserved shape as before.\n  private readonly pageSignal: WritableSignal<number> = signal(0)\n  readonly page: Signal<number> = this.pageSignal.asReadonly()\n  page$ = this.toSyncObservable(this.page)\n\n  private readonly totalPagesSignal: WritableSignal<number> = signal(0)\n  readonly totalPages: Signal<number> = this.totalPagesSignal.asReadonly()\n  totalPages$ = this.toSyncObservable(this.totalPages)\n\n  private readonly percentageSignal: WritableSignal<number> = signal(0)\n  readonly percentage: Signal<number> = this.percentageSignal.asReadonly()\n  percentage$ = this.toSyncObservable(this.percentage)\n\n  private hasDatabase = false\n  private hasInitialFetch = false\n\n  streamedResponse: any[] = []\n\n  // WS\n  private maxRetries: number\n  private retryDelay: number\n  private shouldRetry = true\n\n  // Track connection status subscription to prevent duplicates\n  private connectionStatusSubscription?: Subscription\n\n  // Reconciliation (opt-in via DatabaseStorage.reconcile — see reconcile()): tracks whether the\n  // WS has connected before, so the reconnect trigger fires on recovery from a drop, not on the\n  // very first connect. reconcileIntervalSubscription is re-created (not appended) each time\n  // setupReconciliation() runs, matching connectionStatusSubscription's own duplicate-prevention\n  // pattern above, since setApiRequestOptions() can be called more than once per instance.\n  private hasConnectedOnce = false\n  private reconcileIntervalSubscription?: Subscription\n  private lastFetchOptions?: RequestOptions\n\n  private databaseOptions?: DatabaseStorage\n\n  private readonly volatileHeaders = new Set([\n    'authorization',\n    'x-request-id',\n    'x-correlation-id',\n    'x-trace-id',\n    'x-amzn-trace-id',\n    'date',\n    'if-none-match',\n    'x-modified-since'\n  ])\n\n  private requestSignatureCache: Record<string, { GET?: string; STREAM?: string }> = {}\n  private inFlightRequestSignatures = new Set<string>()\n  private _requestCachePaths = new Map<string, string[]>()\n\n  private wsRetryAttempts = new BehaviorSubject<number>(0)\n  wsRetryAttempts$ = this.wsRetryAttempts.asObservable()\n\n  private wsNextRetry: BehaviorSubject<number>\n  wsNextRetry$: Observable<number>\n\n\n  private messages = new BehaviorSubject<any[]>([])\n  messages$ = this.messages.asObservable()\n\n  private userListByChannel = new BehaviorSubject<Map<string, any[]>>(new Map())\n  userListByChannel$ = this.userListByChannel.asObservable()\n\n  // Convenience observable that returns users for a specific channel\n  getUsersForChannel$(channel: string) {\n    return this.userListByChannel$.pipe(\n      map(channelMap => channelMap.get(channel) || [])\n    )\n  }\n\n  // Returns all unique users across all channels\n  private userList = new BehaviorSubject<any[]>([])\n  userList$ = this.userList.asObservable()\n\n  private user = new BehaviorSubject<WSUser|null>(null)\n  user$ = this.user.asObservable()\n\n  private channels = new BehaviorSubject<string[]|null>(null)\n  channels$ = this.channels.asObservable()\n\n  // In-memory notification channels (from server)\n  private notificationChannels = new BehaviorSubject<string[]>([])\n  notificationChannels$ = this.notificationChannels.asObservable()\n\n  // Today's notification channels (from database - channels with data for today)\n  private todaysNotificationChannels = new BehaviorSubject<string[]>([])\n  todaysNotificationChannels$ = this.todaysNotificationChannels.asObservable()\n\n  // Notification messages (MES- channels)\n  private notificationMessages = new BehaviorSubject<any[]>([])\n  notificationMessages$ = this.notificationMessages.asObservable()\n\n  private latestNotification = new Subject<any>()\n  latestNotification$ = this.latestNotification.asObservable()\n\n  private communicationMessages = new BehaviorSubject<any[]>([])\n  communicationMessages$ = this.communicationMessages.asObservable()\n\n  private latestCommunicationMessages = new BehaviorSubject<any|null>(null)\n  latestCommunicationMessages$ = this.latestCommunicationMessages.asObservable()\n\n  private userAction = new BehaviorSubject<any|null>(null)\n  userAction$ = this.userAction.asObservable()\n\n  // Message queue for WebSocket communication (processed when connection is established)\n  private static wsCommunicationQueue: Array<{method: string, path?: string|number[]}> = [];\n\n  // Store our own sessionId for filtering out own messages\n  private ownSessionId: string | null = null;\n\n  wsOptions = WSOptions.adapt()\n\n  // Expose raw WS connection status directly to UI (from singleton WebSocketManagerService)\n  public connectionStatus$: Observable<boolean> = this.httpManagerService.connectionStatus$\n  public isConnecting$: Observable<boolean> = this.httpManagerService.isConnecting$\n  public wsRetryCount$: Observable<number> = this.httpManagerService.retryCount$\n  public wsMaxRetries$: Observable<number> = this.httpManagerService.maxRetries$\n  public connectionError$: Observable<string | null> = this.httpManagerService.connectionError$\n\n  constructor(\n    @Inject(API_OPTS) private apiOptions = ApiRequest.adapt(),\n    @Inject(\"dataType\") private dataType: DataType | undefined,\n    database?: DatabaseStorage\n  ) {\n\n    try {\n      this.databaseOptions = database\n      this.hasDatabase = (database?.table) ? true : false\n      this.maxRetries = this.apiOptions.ws?.retry?.times || 3\n      this.retryDelay = (this.apiOptions.ws?.retry?.delay && this.apiOptions.ws.retry.delay * 1000) || 5 * 1000\n\n      // Start next retry countdown at 0 to avoid showing 5000 pre-connection\n      this.wsNextRetry = new BehaviorSubject<number>(0)\n      this.wsNextRetry$ = this.wsNextRetry.asObservable()\n\n      this.setApiRequestOptions(apiOptions, dataType, database)\n\n      if (this.databaseOptions && this.databaseOptions.table) {\n\n        this.localStorageManagerService.createStore({\n          name: this.databaseOptions.table,\n          data: { ...this.databaseOptions, ...{ expires: this.utils.expires(this.databaseOptions.expiresIn)} },\n          options: SettingOptions.adapt({\n            storage: StorageType.GLOBAL,\n            encrypted: false,\n            // deltaSync owns freshness via the savedAt cursor — never let the store-level\n            // purge (startTimer/retrieveState) drop the store/cursor on TTL, even with a\n            // non-zero expiresIn. Non-deltaSync stores keep the configured expiresIn TTL.\n            expiresIn: this.databaseOptions.deltaSync ? '' : this.databaseOptions.expiresIn,\n          })\n        })\n\n        this.initSessionFlag(this.databaseOptions.table)\n        this.setupReconciliation()\n\n        // Use initDBStorageAsync directly - the effect initDBStorage requires subscription\n        this.initDBStorageAsync().subscribe({\n          next: () => this.logger.debug('Constructor', 'Database storage initialized'),\n          error: (err: any) => this.logger.error('Constructor', 'Database storage initialization failed:', err)\n        })\n\n      }\n    } catch (error) {\n      this.logger.error('HTTPManagerStateService', 'Error initializing', error);\n      // Initialize with safe defaults\n      this.databaseOptions = undefined;\n      this.maxRetries = 3;\n      this.retryDelay = 5000;\n      this.wsNextRetry = new BehaviorSubject<number>(0);\n      this.wsNextRetry$ = this.wsNextRetry.asObservable();\n    }\n\n  }\n\n  ngOnDestroy(): void {\n    this.connectionStatusSubscription?.unsubscribe()\n    this.reconcileIntervalSubscription?.unsubscribe()\n    this.initWSSubscription.unsubscribe()\n    this.initDBStorageSubscription.unsubscribe()\n    this.clearRecordsSubscription.unsubscribe()\n    this.subscriptions.unsubscribe()\n  }\n\n  /**\n   * Add appropriate prefix to a channel name if not already present\n   */\n  private prefixChannel(channel: string, type: ChannelType): string {\n    const prefix = `${type}-`;\n    if (channel.startsWith(prefix)) {\n      return channel;\n    }\n    // Remove any other known prefix before adding the correct one\n    const cleanChannel = this.stripChannelPrefix(channel);\n    return `${type}-${cleanChannel}`;\n  }\n\n  /**\n   * Remove any known prefix from a channel name\n   */\n  private stripChannelPrefix(channel: string): string {\n    for (const type of Object.values(ChannelType)) {\n      const prefix = `${type}-`;\n      if (channel.startsWith(prefix)) {\n        return channel.slice(prefix.length);\n      }\n    }\n    return channel;\n  }\n\n  /**\n   * Get the base channel name without prefix (for display/user reference)\n   */\n  getBaseChannelName(channel: string): string {\n    return this.stripChannelPrefix(channel);\n  }\n\n  setApiRequestOptions(apiOptions?: ApiRequest, dataType?: DataType, database?: DatabaseStorage) {\n\n    this.logger.debug('StateStore', '🔧 setApiRequestOptions called', {\n      hasWs: !!apiOptions?.ws,\n      wsId: apiOptions?.ws?.id,\n      wsServer: apiOptions?.ws?.wsServer,\n      path: apiOptions?.path\n    });\n\n    this.apiOptions = ApiRequest.adapt(apiOptions)\n    this.dataType = (dataType) ? dataType : DataType.ARRAY\n\n    // Only update database options if a database parameter is explicitly provided\n    if (database !== undefined) {\n      this.logger.debug('setApiRequestOptions', 'Database config:', {\n        database,\n        hasTable: !!database?.table,\n        tableValue: database?.table\n      })\n      this.hasDatabase = (database?.table) ? true : false\n      const adapted = DatabaseStorage.adapt(database)\n      this.logger.debug('setApiRequestOptions', 'DatabaseStorage.adapt result:', adapted)\n      this.databaseOptions = (this.hasDatabase) ? adapted : undefined\n\n      // Trigger database table creation if table is configured\n      if (this.hasDatabase && this.databaseOptions?.table) {\n        this.localStorageManagerService.createStore({\n          name: this.databaseOptions.table,\n          data: {\n            ...this.databaseOptions,\n            expires: this.utils.expires(this.databaseOptions.expiresIn),\n          },\n          options: SettingOptions.adapt({\n            storage: StorageType.GLOBAL,\n            encrypted: false,\n            // deltaSync owns freshness via the savedAt cursor — never let the store-level\n            // purge (startTimer/retrieveState) drop the store/cursor on TTL, even with a\n            // non-zero expiresIn. Non-deltaSync stores keep the configured expiresIn TTL.\n            expiresIn: this.databaseOptions.deltaSync ? '' : this.databaseOptions.expiresIn,\n          })\n        })\n\n        this.initSessionFlag(this.databaseOptions.table)\n        this.setupReconciliation()\n\n        this.logger.debug('setApiRequestOptions', 'Initializing database storage for table:', this.databaseOptions.table)\n        // Use initDBStorageAsync directly instead of the effect - effects need subscription to run\n        this.initDBStorageAsync().subscribe({\n          next: () => this.logger.debug('setApiRequestOptions', 'Database storage initialized successfully'),\n          error: (err: any) => this.logger.error('setApiRequestOptions', 'Database storage initialization failed:', err)\n        })\n\n        // Pre-populate _requestCachePaths so clearRequestCacheMetadata works after browser refresh\n        // (before any GET request has run to populate it via saveRequestCacheMetadata)\n        this._requestCachePaths.set(\n          this.databaseOptions.table,\n          this.resolvePath().filter(p => typeof p === 'string' || typeof p === 'number').map(String)\n        )\n      }\n    }\n\n    if (typeof this.apiOptions.ws?.id === 'string' && this.apiOptions.ws.id !== ''\n        && typeof this.apiOptions.ws.wsServer === 'string'\n        && (this.apiOptions.ws.wsServer.startsWith('ws://') || this.apiOptions.ws.wsServer.startsWith('wss://'))) {\n\n      // Auto-prefix channel ID for private state manager channels\n      // This ensures state manager channels are separate from user-defined channels\n      this.apiOptions.ws.id = this.prefixChannel(this.apiOptions.ws.id, ChannelType.STATE);\n      this.logger.debug('StateStore', `🔒 Private state channel configured`, { channelId: this.apiOptions.ws.id });\n\n      // Store our own sessionId for filtering incoming messages\n      this.ownSessionId = sessionStorage.getItem('WSID') || null;\n      this.logger.debug('StateStore', `🆔 Stored own sessionId for message filtering`, { sessionId: this.ownSessionId });\n      this.logger.debug('StateStore', `🔍 WebSocket configuration`, {\n        channelId: this.apiOptions.ws.id,\n        wsServer: this.apiOptions.ws.wsServer,\n        sessionId: this.ownSessionId,\n        path: this.apiOptions.path\n      });\n\n      // Initialize WebSocket connection if not already connected\n      this.logger.debug('StateStore', '🔌 Checking WebSocket connection status...');\n      this.logger.debug('StateStore', '🔌 Is connected?', { connected: WebSocketManagerService.isConnected() });\n\n      if (!WebSocketManagerService.isConnected()) {\n        this.logger.debug('StateStore', '🔌 WebSocket not connected, will initialize via effect');\n        // initWS is an effect that triggers when setApiRequestOptions is called with ws config\n        // The effect is already triggered by calling setApiRequestOptions above\n      }\n\n      if (this.apiOptions.ws?.retry) {\n        this.maxRetries = this.apiOptions.ws.retry.times || 3\n        this.retryDelay = (this.apiOptions.ws.retry.delay && this.apiOptions.ws.retry.delay * 1000) || 5 * 1000\n        this.wsNextRetry.next(this.retryDelay)\n      }\n\n      // Validate wsServer before attempting connection\n      if (!this.apiOptions.ws.wsServer || this.apiOptions.ws.wsServer === '') {\n        this.logger.error('StateStore', 'WSOptions invalid: wsServer is missing or empty');\n        return;\n      }\n\n      // Clean up previous subscription to prevent duplicate handlers\n      if (this.connectionStatusSubscription) {\n        this.connectionStatusSubscription.unsubscribe();\n        this.connectionStatusSubscription = undefined;\n      }\n\n      // Setup connection status monitoring (internal subscription to drive retry counters)\n      this.connectionStatusSubscription = this.setupConnectionStatus().subscribe();\n\n      // Make initial connection attempt\n      this.logger.debug('StateStore', '🔄 Initial WebSocket connection attempt...');\n      this.httpManagerService.connect(this.apiOptions.ws as WSOptions, this.apiOptions.ws.jwtToken || '');\n\n      // Initialize WS effect to handle messages\n      this.initWS(this.apiOptions.ws as WSOptions);\n\n    } else {\n      this.logger.debug('StateStore', 'WS skipped: no valid wsServer or channel id configured');\n      // Reset any stale connection error so the UI shows clean \"Disconnected\" state\n      this.httpManagerService.clearConnectionError();\n    }\n  }\n\n  // WebSocket\n  private setupConnectionStatus(): Observable<boolean> {\n    return this.httpManagerService.connectionStatus$.pipe(\n      distinctUntilChanged(),\n      tap(status => {\n        if (status === true) {\n          this.logger.debug('StateStore', '🟢 WebSocket connection is open')\n        } else {\n          this.logger.debug('StateStore', '🔴 WebSocket connection is closed')\n        }\n      }),\n      map(status => {\n\n        if (status === true) {\n          this.shouldRetry = true\n          this.wsRetryAttempts.next(0)\n          this.wsNextRetry.next(0)\n          return true\n        }\n\n        // Retry orchestration is centralized in WebSocketManagerService.connect/onclose\n        // and uses ws.retry from request options. Keep this stream as status/state only.\n        if (!this.shouldRetry) {\n          this.wsRetryAttempts.next(0)\n          this.wsNextRetry.next(0)\n          return false\n        }\n\n        const nextAttempt = Math.min(this.wsRetryAttempts.value + 1, this.maxRetries)\n        this.wsRetryAttempts.next(nextAttempt)\n        this.wsNextRetry.next(nextAttempt >= this.maxRetries ? 0 : this.retryDelay / 1000)\n        return false\n      })\n    );\n  }\n\n  // WebSocket\n  // A plain Subject, not a signal+toObservable(): toObservable() backs its emissions with an\n  // effect(), which flushes asynchronously (a microtask later) even for the very first value —\n  // a real WebSocket connecting in the same synchronous tick as construction would be missed.\n  // A Subject's .next() is always synchronous, matching what ComponentStore's own effect() did.\n  private readonly wsOptionsTrigger$ = new Subject<WSOptions>()\n  readonly initWS = (wsOptions: WSOptions): void => this.wsOptionsTrigger$.next(wsOptions)\n\n  // Repeat triggers with the same connection identity (id/wsServer/jwtToken) must not\n  // re-subscribe below: messages$ is a BehaviorSubject, so a switchMap re-subscribe would\n  // replay the last cached message as if it were newly received. See design.md Decision #1.\n  private static sameWsConnection(a: WSOptions, b: WSOptions): boolean {\n    return a?.id === b?.id && a?.wsServer === b?.wsServer && a?.jwtToken === b?.jwtToken\n  }\n\n  private readonly initWSSubscription = this.wsOptionsTrigger$.pipe(\n      distinctUntilChanged(HTTPManagerStateService.sameWsConnection),\n      switchMap((wsOptions) =>\n        merge(\n          this.httpManagerService.connectionStatus$.pipe(\n            tap((isConnected: any) => {\n              if (isConnected) {\n                // Reconciliation guarantee: a WS reconnect means broadcasts may have been missed\n                // while disconnected (the server doesn't persist/replay them), so recovering from\n                // a drop is exactly when a full reconcile is most valuable. Gated on\n                // hasConnectedOnce so this fires on recovery, not on the very first connect.\n                if (this.hasConnectedOnce && this.databaseOptions?.reconcile) {\n                  this.logger.debug('RECONCILE', 'WebSocket reconnected — triggering reconciliation', { table: this.databaseOptions?.table })\n                  this.reconcile()\n                }\n                this.hasConnectedOnce = true\n\n                // Subscribe to our private SYS- state channel so we receive stateMangerMessage broadcasts\n                // This is the critical subscription that enables multi-client state syncing\n                const stateChannel = wsOptions?.id || this.apiOptions.ws?.id;\n                if (stateChannel) {\n                  this.logger.debug('STATE STORE', `Subscribing to state channel: ${stateChannel}`);\n                  this.httpManagerService.subscribeToChannel(stateChannel);\n\n                  // The server (channel-server.js) only reports channel membership on explicit\n                  // request — it never pushes updates on its own when someone else joins or\n                  // leaves — so without this, userList$/userListByChannel$ would just stay empty\n                  // forever. This gives a snapshot as of connect/reconnect time; it won't reflect\n                  // someone else joining afterwards without their own reconnect or a fresh request.\n                  this.httpManagerService.getUsersInChannel(stateChannel);\n                }\n\n                // Process queued wsCommunication calls when connection becomes true\n                if (HTTPManagerStateService.wsCommunicationQueue.length > 0) {\n                  this.logger.debug('STATE STORE', `Processing ${HTTPManagerStateService.wsCommunicationQueue.length} queued WS messages`);\n                  while (HTTPManagerStateService.wsCommunicationQueue.length > 0) {\n                    const queued = HTTPManagerStateService.wsCommunicationQueue.shift()!;\n                    this.sendWsCommunication(queued.method, queued.path);\n                  }\n                }\n              }\n            })\n          ),\n          this.httpManagerService.messages$.pipe(\n            tap((message: any) => {\n              if (!message) return\n\n              // CRITICAL DEBUG: Log EVERY message received\n              this.logger.debug('STATE STORE', 'Received WebSocket message:', {\n                type: message.type,\n                channel: message.channel,\n                sessionId: message.data?.sessionId?.id || message.sessionId?.id,\n                content: message.content || message.data?.content,\n                timestamp: new Date().toISOString()\n              });\n\n              // Add message to messages array\n              const currentMessages = this.messages.value\n              this.messages.next([...currentMessages, message])\n\n              this.logger.debug('StateStore', 'Received:', message)\n\n              // Debug: Log all message types\n              this.logger.debug('StateStore', '📨 Message type', { type: message.type })\n\n              if (message.error === 'JWT_INVALID' || message.error === 'AUTH_BLOCKED') {\n                this.shouldRetry = false\n                this.httpManagerService.disconnect()\n              }\n\n              if (message.type === 'success') {\n                // channel-server.js also sends type:'success' for a plain subscribe\n                // confirmation ({ type: 'success', message: 'Subscribed to channel: ...' }),\n                // with no `data` at all — this branch is meant for auth-style success\n                // responses that carry a user payload, so guard for that shape specifically.\n                if (message.data && message.data.id !== this.user.value?.id) {\n                  const user = WSUser.adapt(message.data)\n                  this.user.next(user)\n                }\n              }\n\n              switch (message.type) {\n                case 'channelsList':\n\n                  this.logger.debug('StateStore', '💬 Channels', { channels: message.channels })\n                  this.logger.debug('StateStore', '🔍 channelsList received, checking connection status...')\n                  this.logger.debug('StateStore', '🔍 WebSocket connected', { connected: WebSocketManagerService.isConnected() })\n\n                  // Extract channel names from metadata objects (new format) or use strings directly (old format)\n                  const channelNames = message.channels.map((c: any) => {\n                    // Handle new format: {name: string, canSubscribe: boolean}\n                    if (typeof c === 'object' && c.name) {\n                      return c.name;\n                    }\n                    // Handle old format: string\n                    return c;\n                  });\n\n                  this.channels.next(channelNames)\n\n                  break;\n\n                case 'success':\n                  // Success messages - check for subscription confirmation\n                  this.logger.info('StateStore', `✅ Success`, { message: message.message })\n                  if (message.message?.includes('Subscribed to channel:')) {\n                    // Extract channel name from message: \"Subscribed to channel: PUB-chat\"\n                    const channelName = message.message.split('Subscribed to channel:')[1]?.trim()\n                    this.logger.debug('StateStore', `✅ Subscription confirmed for channel`, { channel: channelName })\n                    WebSocketManagerService.addSubscribedChannel(channelName)\n                  }\n                  break;\n\n                case 'subscribed':\n                  this.logger.debug('StateStore', `✅ Subscription confirmed`, { channel: message.channel })\n                  // Track as subscribed now that server confirmed\n                  WebSocketManagerService.addSubscribedChannel(message.channel);\n                  break;\n\n                case 'unsubscribed':\n                  this.logger.debug('StateStore', `🔓 Unsubscription confirmed`, { channel: message.channel })\n                  break;\n\n                case 'info':\n                  // Already subscribed or other info messages\n                  this.logger.info('StateStore', `ℹ️ Info`, { message: message.message })\n                  // If it's an \"Already subscribed\" message, treat it as subscription confirmation\n                  if (message.message?.includes('Already subscribed to channel:')) {\n                    // Extract channel name from message: \"Already subscribed to channel: PUB-chat\"\n                    const channelName = message.message.split('Already subscribed to channel:')[1]?.trim()\n                    this.logger.debug('StateStore', `✅ Treating info as subscription confirmation for channel: ${channelName}`)\n                    WebSocketManagerService.addSubscribedChannel(channelName)\n                  }\n                  break;\n\n                case 'statemanagerMessage':\n                case 'stateMangerMessage':\n                  this.logger.debug('STATE STORE', 'stateMangerMessage received:', {\n                    messageChannel: message.channel,\n                    ourChannel: this.apiOptions.ws?.id,\n                    channelsMatch: message.channel === this.apiOptions.ws?.id,\n                    senderSessionId: message.data?.sessionId?.id || message.data?.sessionId,\n                    ourSessionId: this.ownSessionId\n                  });\n\n                  // Handle both direct payload and StateMessage-wrapped payload:\n                  // Direct: { method, path, user }\n                  // Wrapped: { sessionId, content: { method, path } }\n                  const stateManagerSenderId = message.data?.sessionId?.id || message.data?.sessionId;\n                  const stateManagerContent = message.data?.content?.content\n                    ? message.data.content.content\n                    : message.data?.content;\n\n                  this.logger.debug('StateStore', 'State Manager: Sender sessionId:', { senderSessionId: stateManagerSenderId, ownSessionId: this.ownSessionId });\n\n                  this.userAction.next(message.data);\n\n                  // Skip fetchRecord() for our own broadcast: createRecord()/updateRecord()/\n                  // deleteRecord() already apply their own HTTP response directly to local\n                  // state and the DB, so re-fetching here is a redundant network call for the\n                  // very instance that just made the change — confirmed live: a PUT followed\n                  // immediately by a self-triggered GET on the same instance. Other instances\n                  // (sessionId won't match) still need this — it's their only way to learn a\n                  // mutation happened at all.\n                  if (stateManagerSenderId === this.ownSessionId) {\n                    this.logger.debug('StateStore', '🔇 Skipping fetchRecord for own state manager message (sessionId match)');\n                    break;\n                  }\n\n                  this.fetchRecord(\n                    RequestOptions.adapt({ path: stateManagerContent?.path }),\n                    stateManagerContent?.method\n                  );\n                  break;\n\n                case 'channelMessage':\n                  // Handle channel-based messages (from sendChannelMessage)\n                  // Structure: { type: 'channelMessage', messageId, channel, sessionId, content, timestamp }\n                  // Skip messages from self\n                  const senderSessionId = message.sessionId?.id || message.sessionId;\n                  if (senderSessionId === this.ownSessionId) {\n                    this.logger.debug('StateStore', '🔇 Skipping message from self (sessionId match)');\n                    break;\n                  }\n\n                  this.logger.debug('StateStore', '💬 Channel Message received:', message);\n\n                  // Determine which channels this message was sent to\n                  const messageChannels = message.channel ? [message.channel] : [];\n\n                  // Construct expected channel path (without env prefix)\n                  const myPath = this.apiOptions.path || [];\n                  const myPathString = myPath.join('/');\n\n                  // Check if any of the message channels CONTAIN our path\n                  const isWsUpdateChannel = messageChannels.some((ch: string) => {\n                    // Strip SYS- prefix if present for comparison\n                    const cleanChannel = ch.replace('SYS-', '');\n                    // Check if channel contains our path (or starts with it)\n                    const matches = cleanChannel === myPathString ||\n                                   cleanChannel.startsWith(myPathString + '/') ||\n                                   cleanChannel.includes(myPathString);\n                    this.logger.debug('StateStore', `🔍 Channel check: ${ch} contains ${myPathString}?`, { matches });\n                    return matches;\n                  });\n\n                  // If it's the expected channel, trigger fetchRecord like stateManagerMessage\n                  if (isWsUpdateChannel && message.content?.path) {\n                    this.logger.debug('StateStore', '🔍 Message received on expected channel (path match):', { myPathString });\n                    this.logger.debug('StateStore', '📄 Content:', message.content);\n\n                    this.logger.debug('StateStore', '📥 Fetching record for channel:', { myPathString });\n                    const path = message.content.path;\n                    const method = message.content.method || 'UPDATE';\n                    this.userAction.next({ sessionId: message.sessionId, content: message.content });\n                    this.fetchRecord(RequestOptions.adapt({ path }), method);\n\n                  } else if (message.content) {\n                    // Handle message content directly\n                    this.logger.debug('StateStore', '📄 Processing message content:', message.content);\n                    this.appendMessages(ChannelMessage.adapt({\n                      sessionId: message.sessionId,\n                      content: message.content,\n                    }), { silent: !!message.isReplay });\n\n                  } else {\n                    this.logger.warn('StateStore', '⚠️ Message does not contain data.content.path, skipping fetchRecord');\n                  }\n\n                  // Keep existing functionality for backward compatibility\n                  if (message.data?.content && !isWsUpdateChannel) {\n                    this.appendMessages(ChannelMessage.adapt({\n                      sessionId: message.data.sessionId,\n                      content: message.data.content,\n                    }));\n                  }\n                  break;\n\n                case 'usersInChannel':\n                  this.logger.debug('StateStore', `👥 Users in channel \"${message.channel}\":`, message.data.users)\n\n                  // Update channel-specific user list\n                  const currentMap = new Map(this.userListByChannel.value)\n                  currentMap.set(message.channel, message.data.users)\n                  this.userListByChannel.next(currentMap)\n\n                  // Update legacy userList with unique users across all channels\n                  const allUsers = Array.from(currentMap.values()).flat()\n                  const uniqueUsers = allUsers.filter((user, index, self) =>\n                    index === self.findIndex(u => u.id === user.id)\n                  )\n                  this.userList.next(uniqueUsers)\n                  break;\n\n                case 'notificationChannelsList':\n                  this.logger.debug('StateStore', '📢 Notification Channels (in-memory):', message.channels)\n                  // Extract channel names from metadata objects (new format) or use strings directly (old format)\n                  const notifyChannelNames = message.channels.map((c: any) => {\n                    if (typeof c === 'object' && c.name) {\n                      return c.name;\n                    }\n                    return c;\n                  });\n                  this.notificationChannels.next(notifyChannelNames || [])\n                  break;\n\n                case 'todaysNotificationChannelsList':\n                  this.logger.debug('StateStore', '📢 Today\\'s Notification Channels (from DB):', message.channels)\n                  // Extract channel names from metadata objects (new format) or use strings directly (old format)\n                  const todaysNotifyChannelNames = message.channels.map((c: any) => {\n                    if (typeof c === 'object' && c.name) {\n                      return c.name;\n                    }\n                    return c;\n                  });\n                  this.todaysNotificationChannels.next(todaysNotifyChannelNames || [])\n                  break;\n\n                case 'notificationSubscribed':\n                  this.logger.debug('StateStore', `📢 Notification subscription confirmed: ${message.channel}`, message.notifications)\n                  // Set historical notifications from subscription\n                  if (message.notifications && Array.isArray(message.notifications)) {\n                    this.notificationMessages.next(message.notifications)\n                  }\n                  break;\n\n                case 'notificationUnsubscribed':\n                  this.logger.debug('StateStore', `📢 Notification unsubscription confirmed: ${message.channel}`)\n                  break;\n\n                case 'notification':\n                  this.logger.debug('StateStore', '📢 Notification received:', message)\n                  // Add to notifications array\n                  const currentNotifications = this.notificationMessages.value\n                  this.notificationMessages.next([...currentNotifications, message])\n                  // Emit as latest notification\n                  this.latestNotification.next(message)\n                  break;\n\n                default:\n                  // Messages are already added at the beginning of the tap\n                  break\n              }\n            })\n          )\n        )\n      )\n    ).subscribe()\n\n  appendMessages(message: any, opts?: { silent?: boolean }) {\n    const currentMessages = this.communicationMessages.value\n    this.communicationMessages.next([...currentMessages, message])\n    if (!opts?.silent) this.latestMessage()\n  }\n\n  latestMessage() {\n    const messages = this.communicationMessages.value\n    const latestMessage = messages[messages.length -1]\n    this.latestCommunicationMessages.next(latestMessage)\n  }\n\n  clearMessages() {\n    this.communicationMessages.next([])\n  }\n\n  get ApiRequestOptions() {\n    return this.apiOptions\n  }\n\n  private readonly initDBStorageTrigger$ = new Subject<void>()\n  readonly initDBStorage = (): void => this.initDBStorageTrigger$.next()\n\n  private readonly initDBStorageSubscription = this.initDBStorageTrigger$.pipe(\n    tap(() => {\n      this.logger.debug('initDBStorage effect', 'Triggered, checking conditions:', {\n        dataType: this.dataType,\n        isARRAY: this.dataType === DataType.ARRAY,\n        hasAdapter: !!this.apiOptions?.adapter,\n        hasTable: !!this.databaseOptions?.table,\n        tableValue: this.databaseOptions?.table\n      })\n      if (this.dataType !== DataType.ARRAY) this.logger.warn('initDBStorage effect', 'Database storage requires dataType to be ARRAY')\n      if (!this.apiOptions.adapter) this.logger.warn('initDBStorage effect', 'Database storage adapter missing, using minimal or inferred schema')\n      if (this.databaseOptions && this.databaseOptions?.table === '') this.logger.warn('initDBStorage effect', 'Database storage requires a table name')\n    }),\n    filter(() => {\n      const shouldProceed = this.dataType === DataType.ARRAY && !!this.databaseOptions?.table\n      this.logger.debug('initDBStorage effect', 'Filter result:', shouldProceed)\n      return shouldProceed\n    }),\n    switchMap(() => {\n      const schema = this.buildSchemaFromAdapter()\n\n      const tableDef = TableSchemaDef.adapt({\n        table: this.databaseOptions?.table,\n        schema: schema\n      });\n\n      return this.dbManagerService.createDatabaseTable(tableDef)\n    })\n  ).subscribe()\n\n  initializeState(data: any) {\n    this.setData$(data)\n  }\n\n  // --------------------------------------------------------------------------------------------------\n  // SELECTORS\n  readonly data = computed(() => {\n    const { data, dataObject } = this.stateSignal()\n    const isArray = (this.dataType === DataType.ARRAY) ? true : false\n    return (isArray) ? data : dataObject\n  })\n  readonly data$ = this.toSyncObservable(this.data)\n\n  readonly selectRecord = (id: number) => computed(() => {\n    const data = this.data()\n    if (this.dataType === DataType.ARRAY && Array.isArray(data)) {\n      return data.find(item => item.id === id) as T | null\n    } else {\n      return (data as T).id === id ? data : null\n    }\n  })\n  readonly selectRecord$ = (id: number) => this.toSyncObservable(this.selectRecord(id))\n\n  // --------------------------------------------------------------------------------------------------\n\n  // UPDATERS\n  private setData$(data: T | T[] | any): void {\n    this.updateCoreState((state: APIStateManagerData<T>) => {\n\n      if (!data) return state;\n\n      if (this.dataType === DataType.ARRAY) {\n\n        const dataArray = Array.isArray(data) ? data : [data]\n\n        const stateDataSample = (state.data.length > 0) ? Object.keys(state.data[0]) : []\n        const newDataSample = (dataArray.length > 0) ? Object.keys(dataArray[0]) : []\n\n        const isSame = (state.data.length === 0) ? false : stateDataSample.every((value, index) => value === newDataSample[index])\n        const updatedData = (!isSame && dataArray.length !== 0) ? this.updateArrayState([], dataArray) : this.updateArrayState(state.data, dataArray)\n\n        return { ...state, data: updatedData, dataObject: null } as APIStateManagerData<T>;\n\n      } else {\n        const dataObject = this.isEmpty(data) ? null : data;\n        return { ...state, data: [], dataObject: dataObject } as APIStateManagerData<T>;\n      }\n\n    })\n  }\n\n  private mergeDeltaData$(records: T[]): void {\n    this.updateCoreState((state: APIStateManagerData<T>) => {\n\n      if (this.dataType !== DataType.ARRAY || !Array.isArray(records) || records.length === 0) {\n        return state;\n      }\n\n      const existing = [...state.data];\n      for (const record of records) {\n        const idx = existing.findIndex((r: any) => r?.id != null && record?.id != null && r.id === record.id);\n        if (idx > -1) {\n          existing[idx] = { ...existing[idx], ...record };\n        } else {\n          existing.push(record);\n        }\n      }\n\n      return { ...state, data: existing, dataObject: null } as APIStateManagerData<T>;\n\n    })\n  }\n\n  private updateArrayState(currentData: any[], newData: any[]): any[] {\n\n    // For non-streaming requests (GET), REPLACE data entirely\n    // For streaming requests, MERGE with existing data incrementally\n    if (this.streamedResponse.length === 0) {\n      // GET request: return new data as-is (replace)\n      return newData\n    }\n\n    // Streaming: merge with existing data\n    const filterCurrentData = () => {\n      const ids = this.streamedResponse.map((obj: any) => obj.id)\n      return currentData.filter(obj => (obj.id) ? ids.includes(obj.id) : obj)\n    }\n\n    const filteredCurrentData = (this.httpManagerService.isPending())\n      ? currentData\n      : filterCurrentData()\n\n    const updatedData = filteredCurrentData.map(item => {\n        const newItem = newData.find(newItem => {\n          const hasId = (newItem?.id && item?.id) ? true : false\n          return (hasId) ? newItem.id === item.id : JSON.stringify(newItem) === JSON.stringify(item)\n        })\n        return (newItem) ? { ...item, ...newItem } : item\n    })\n\n    const addedData = newData.filter(newItem => {\n      return !filteredCurrentData.some(item => {\n          const hasId = (newItem?.id && item?.id) ? true : false\n          return (hasId) ? item.id === newItem.id : JSON.stringify(newItem) === JSON.stringify(item)\n      })\n    })\n\n    return [...updatedData, ...addedData]\n\n  }\n\n  private addData$(data: T): void {\n    this.updateCoreState((state: APIStateManagerData<T>) => {\n\n      if (this.dataType === DataType.ARRAY) {\n        const exists = state.data.some(item => item.id === data.id);\n\n        if (exists) {\n            const updatedData = state.data.map(item =>\n            item.id === data.id ? data : item\n          );\n\n          return { ...state, data: updatedData };\n        } else {\n          const newState = [...state.data, data];\n          return { ...state, data: newState };\n        }\n      } else {\n        return { ...state, dataObject: data };\n      }\n\n    })\n  }\n\n  private deleteData$(data: T & { id: number }): void {\n    this.updateCoreState((state: APIStateManagerData<T>) => {\n      if (this.dataType === DataType.ARRAY) {\n      const newState = state.data.filter(item => item.id !== data.id)\n      return { ...state, ...{ data: newState } }\n      } else {\n        return { ...state, ...{ dataObject: null } }\n      }\n    })\n  }\n\n  private updateData$(data: T): void {\n    this.updateCoreState((state: APIStateManagerData<T>) => {\n\n      if (this.dataType === DataType.ARRAY) {\n\n        const objIndex = state.data.findIndex(item => item.id === data.id)\n\n        if (objIndex > -1) {\n          const newState = [...state.data]\n          newState[objIndex] = data\n          return { ...state, ...{ data: newState } }\n        }\n\n        return state\n\n      } else {\n        return { ...state, ...{ dataObject: data } }\n      }\n\n    })\n  }\n\n  // --------------------------------------------------------------------------------------------------\n  // EFFECTS\n  private readonly clearRecordsTrigger$ = new Subject<any>()\n  readonly clearRecords = (data?: any): void => this.clearRecordsTrigger$.next(data)\n\n  private readonly clearRecordsSubscription = this.clearRecordsTrigger$.pipe(\n\n      tap(() => {\n\n        // Reset hasInitialFetch synchronously so the next fetchRecords/fetchStream\n        // sees it immediately, before the async pipeline below completes.\n        this.hasInitialFetch = false\n\n        // Also nuke requestCache synchronously — writes bare store data so the\n        // defensive updateStore guard (which requires schemaSignature) won't\n        // preserve savedAt. Without this, fetchRecords races the async clear below\n        // and still sends X-Modified-Since.\n        if (this.hasDatabase && this.databaseOptions?.table) {\n          this.localStorageManagerService.updateStore({\n            name: this.databaseOptions.table,\n            data: { ...this.databaseOptions, expires: 0 }\n          })\n        }\n\n        if (this.dataType === DataType.ARRAY) {\n          this.setData$([])\n        } else {\n          this.setData$({})\n        }\n\n      }),\n      concatMap(() => {\n        if (this.hasDatabase && this.databaseOptions?.table) {\n\n          this.clearSessionFlag()\n\n          // Wait for clearRequestCacheMetadata to complete before clearing the DB table,\n          // so the next fetchRecords/fetchStream sees clean state (no savedAt cursor).\n          return this.clearRequestCacheMetadataAsync(this.databaseOptions.table).pipe(\n            concatMap(() => this.dbManagerService.clearTable(this.databaseOptions!.table))\n          )\n\n        }\n        return of(null);\n      })\n  ).subscribe()\n\n  // --------------------------------------------------------------------------------------------------\n  // CRUD OPERATIONS\n\n  // FETCH RECORDS\n  fetchRecords(options?: RequestOptions): void {\n    // Remembered so reconcile() knows which resource path to re-fetch: apiOptions.path (the\n    // store's own base path) is [] for consumers like the WS demo that track their target path\n    // externally and pass it explicitly on every call instead — reconciliation has no caller-\n    // supplied options of its own, so this is the only reliable source it has.\n    this.lastFetchOptions = options\n    const sub = of(RequestOptions.adapt(options)).pipe(\n      switchMap(() => {\n\n        this.streamedResponse = []\n        const requestOptions = this.updateRequestOptions(options?.headers, options?.selector)\n        const effectiveParams = this.getEffectiveParams(options?.path)\n        const requestSignature = this.buildRequestSignature('GET', requestOptions, effectiveParams)\n\n        const fetchFromAPI = () => {\n\n          if (this.hasDatabase && this.databaseOptions?.table) {\n            this.setCachedRequestSignature(this.databaseOptions.table, 'GET', requestSignature)\n\n            if (!this.tryBeginInFlightRequest(requestSignature)) {\n              const currentStateData = this.stateSignal()?.data\n              if (Array.isArray(currentStateData) && currentStateData.length > 0) {\n                return of(this.applyAdapter(currentStateData))\n              }\n\n              if (\n                currentStateData &&\n                !Array.isArray(currentStateData) &&\n                Object.keys(currentStateData).length > 0\n              ) {\n                return of(this.applyAdapter(currentStateData))\n              }\n\n              return of(this.dataType === DataType.ARRAY ? [] : {})\n            }\n          }\n\n          // adapter is stripped from this specific call: RequestService.request() decides\n          // \"array or single item\" from the RAW response BEFORE any unwrapping the store does\n          // below — with an envelope like { data: [...] } (not an array itself), it would adapt\n          // the whole envelope as one bogus record. extractListPayload()+applyAdapter() below do\n          // that job instead, in the right order (unwrap the envelope, then adapt each item).\n          return this.httpManagerService.getRequest({ ...requestOptions, adapter: undefined }, effectiveParams).pipe(\n            this.track(),\n            tap((data: any) => {\n              const arrayData = this.applyAdapter(this.extractListPayload(data))\n              // Empty array responses keep existing in-memory state (no wipe / no flicker) —\n              // mirrors the fetchStream guard so GET and STREAM behave consistently.\n              if (this.dataType === DataType.ARRAY && Array.isArray(arrayData) && arrayData.length === 0) {\n                return\n              }\n              this.setData$(arrayData)\n            }),\n            concatMap((data: any) => {\n              const dbData = this.applyAdapter(this.extractListPayload(data))\n              if (this.hasDatabase && this.databaseOptions?.table && Array.isArray(dbData) && dbData.length > 0) {\n                const tableName = this.databaseOptions.table\n\n                const schema = this.buildSchemaFromSample(dbData[0]);\n                const tableDef = TableSchemaDef.adapt({ table: tableName, schema });\n                const schemaSignature = this.buildSchemaSignature(schema)\n\n                // Always ensure table exists immediately before writing to avoid stale schema/store races.\n                const storeData = this.localStorageManagerService.store(tableName)()\n                this.localStorageManagerService.updateStore({\n                  name: tableName,\n                  data: { ...(storeData || {}), ...this.databaseOptions, expires: this.utils.expires(this.databaseOptions!.expiresIn) }\n                })\n\n                const ensureTable$ = this.dbManagerService.createDatabaseTable(tableDef)\n\n                return ensureTable$.pipe(\n                  switchMap((created) => {\n                    if (!created) {\n                      this.logger.warn('DB STORAGE', 'Table create/open not ready, skipping DB write for this payload:', { table: tableName });\n                      return of(data);\n                    }\n                    return this.dbManagerService.createTableRecords(tableName, dbData).pipe(\n                      tap(() => this.saveRequestCacheMetadata(tableName, 'GET', requestSignature, schemaSignature, options))\n                    );\n                  }),\n                  catchError((error) => {\n                    this.logger.error('DB STORAGE', 'Failed to ensure table and write records:', { table: tableName, schema, error });\n                    return of(data);\n                  })\n                );\n              }\n              return of(data);\n            }),\n            tap((data: any) => {\n              // Persist savedAt after a successful API response so delta sync activates\n              // on the next call, even if the DB write path was skipped (non-array\n              // response or table creation failure). BUT skip an empty response: an\n              // empty full fetch must not leave a cursor that turns the next call into\n              // a guaranteed-empty delta — see fix-delta-empty-first-fetch-cursor.\n              if (this.hasDatabase && this.databaseOptions?.table) {\n                const tableName = this.databaseOptions.table;\n                const dbData = this.applyAdapter(this.extractListPayload(data));\n                if (Array.isArray(dbData) && dbData.length === 0) return;\n                const schema = Array.isArray(dbData) && dbData.length > 0\n                  ? this.buildSchemaFromSample(dbData[0])\n                  : this.buildSchemaFromAdapter();\n                const schemaSignature = this.buildSchemaSignature(schema);\n                this.saveRequestCacheMetadata(tableName, 'GET', requestSignature, schemaSignature, options);\n              }\n            }),\n            finalize(() => {\n              if (this.hasDatabase && this.databaseOptions?.table) {\n                this.endInFlightRequest(requestSignature)\n              }\n            })\n          );\n\n        }\n\n        // New session: fetch on first call, then mark session as initialized.\n        // When deltaSync=true, use savedAt cursor for a delta fetch if available;\n        // otherwise full fetch. When deltaSync=false, always full fetch.\n        if (!this.hasInitialFetch && this.hasDatabase && this.databaseOptions?.table) {\n          const tableName = this.databaseOptions.table\n\n          if (this.databaseOptions.deltaSync) {\n            return this.dbManagerService.hasDatabaseTable(tableName).pipe(\n              switchMap((tableExists: boolean) => {\n                if (!tableExists) {\n                  return this.initDBStorageAsync().pipe(\n                    switchMap(() => fetchFromAPI()),\n                    catchError(() => fetchFromAPI()),\n                    tap(() => {\n                      this.hasInitialFetch = true\n                      this.persistInitialFetch(true)\n                    })\n                  )\n                }\n                // ponytail: when deltaSync=true the savedAt cursor owns freshness, so the\n                // TTL (expiresIn) expiry branch is skipped — an expired TTL must not wipe\n                // requestCache and force a full fetch. runGetDeltaOrFullFetch already falls\n                // back to a full fetch when there is no savedAt cursor.\n                return this.runGetDeltaOrFullFetch(\n                  this.localStorageManagerService.store(tableName)(),\n                  requestOptions, effectiveParams, requestSignature, options, fetchFromAPI\n                )\n              })\n            )\n          }\n\n          return fetchFromAPI().pipe(\n            tap(() => {\n              this.hasInitialFetch = true\n              this.persistInitialFetch(true)\n            })\n          )\n        }\n\n        // console.log('[DB STORAGE] Checking database storage:', {\n        //   hasDatabase: this.hasDatabase,\n        //   table: this.databaseOptions?.table,\n        //   databaseOptions: this.databaseOptions\n        // })\n\n        if (this.hasDatabase && this.databaseOptions?.table) {\n\n          return this.dbManagerService.databaseExists().pipe(\n            switchMap((dbExists: boolean) => {\n\n              if (!dbExists) {\n                const initObs: Observable<any> = this.initDBStorageAsync();\n                return initObs.pipe(\n                  switchMap(() => fetchFromAPI()),\n                  catchError((error) => {\n                        this.logger.warn('DB STORAGE', 'initDBStorageAsync failed when DB did not exist, continuing with API:', error);\n                        return fetchFromAPI();\n                      })\n                );\n              }\n\n              return this.dbManagerService.hasDatabaseTable(this.databaseOptions!.table).pipe(\n                switchMap((tableExists: boolean): Observable<any> => {\n\n                  if (!tableExists) {\n                    const initObs: Observable<any> = this.initDBStorageAsync();\n                    return initObs.pipe(\n                      switchMap(() => fetchFromAPI()),\n                      catchError((error) => {\n                        this.logger.warn('DB STORAGE', 'initDBStorageAsync failed when table missing, continuing with API:', error);\n                        return fetchFromAPI();\n                      })\n                    );\n                  }\n\n                  {\n                    const storeData = this.localStorageManagerService.store(this.databaseOptions!.table)()\n                      // console.log('[CacheDebug] storeData for table:', this.databaseOptions!.table, { storeData, requestCache: storeData?.requestCache, expires: storeData?.expires })\n\n                      const forceRefresh = !!(options as any)?.forceRefresh\n                      const storedSchemaSignature = this.getStoredSchemaSignature(storeData)\n\n                      const expires = storeData?.expires || 0;\n                      const hasExpired = expires > 0 && this.utils.hasExpired(expires);\n\n                      if (forceRefresh) {\n                        return fetchFromAPI();\n                      }\n\n                      // ponytail: with deltaSync=true the savedAt cursor owns freshness, so TTL\n                      // expiry must not wipe requestCache and force a full fetch.\n                      if (hasExpired && !this.databaseOptions?.deltaSync) {\n                        this.clearRequestCacheMetadata(this.databaseOptions!.table)\n                        this.hasInitialFetch = false\n                        this.clearSessionFlag()\n                        return this.dbManagerService.clearTable(this.databaseOptions!.table).pipe(\n                          switchMap(() => fetchFromAPI())\n                        );\n                      }\n\n                      const expectedSchema = this.buildSchemaFromAdapter()\n                      const expectedSchemaSignature = this.buildSchemaSignature(expectedSchema)\n                      // console.log('[CacheDebug] schema check:', { tableName: this.databaseOptions!.table, storedSchemaSignature, expectedSchemaSignature, mismatch: storedSchemaSignature && storedSchemaSignature !== expectedSchemaSignature })\n                      if (storedSchemaSignature && storedSchemaSignature !== expectedSchemaSignature) {\n                        const tableDef = TableSchemaDef.adapt({ table: this.databaseOptions!.table, schema: expectedSchema })\n                        this.clearRequestCacheMetadata(this.databaseOptions!.table)\n                        this.hasInitialFetch = false\n                        this.clearSessionFlag()\n                        return this.dbManagerService.clearTable(this.databaseOptions!.table).pipe(\n                          switchMap(() => this.dbManagerService.createDatabaseTable(tableDef)),\n                          switchMap(() => fetchFromAPI())\n                        )\n                      }\n\n                      // Delta sync branch: on every call (not just the first one this tab\n                      // session), re-check the server for anything modified since the DB's\n                      // last savedAt cursor and merge just that delta in — see design.md\n                      // Decision #1. Falls back to a full fetch if the table is missing.\n                      if (this.databaseOptions?.deltaSync) {\n                        const tableName = this.databaseOptions!.table;\n                        return this.dbManagerService.hasDatabaseTable(tableName).pipe(\n                          switchMap((tableExists: boolean) => {\n                            if (!tableExists) {\n                              return this.initDBStorageAsync().pipe(\n                                switchMap(() => fetchFromAPI()),\n                                catchError(() => fetchFromAPI())\n                              );\n                            }\n                            return this.runGetDeltaOrFullFetch(storeData, requestOptions, effectiveParams, requestSignature, options, fetchFromAPI)\n                              .pipe(catchError(() => fetchFromAPI()));\n                          })\n                        );\n                      }\n\n                      return this.checkTrackerAllowsRequest(\n                        this.databaseOptions!.table,\n                        'GET',\n                        this.resolvePath(effectiveParams),\n                        options,\n                        storeData\n                      ).pipe(\n                        switchMap((trackerAllowsRequest: boolean) => {\n                          if (trackerAllowsRequest) {\n                            const normalizedPath = this.trackerNormalizePath(this.resolvePath(effectiveParams));\n\n                            if (!normalizedPath.hasQuery) {\n                              return this.dbManagerService.getTableRecords(this.databaseOptions!.table).pipe(\n                                switchMap((dbData: any) => {\n                                    if (Array.isArray(dbData) && dbData.length > 0) {\n                                    const adaptedData = this.applyAdapter(dbData);\n                                    this.setData$(adaptedData);\n                                    // Save cache metadata for both GET and STREAM request types so\n                                    // tracker/check logic can detect cached responses regardless\n                                    // of whether a subsequent call is a normal GET or a streaming GET.\n                                    const getSignature = requestSignature;\n                                    const streamRequestOptions = { ...(requestOptions || {}), stream: true } as any;\n                                    const streamSignature = this.buildRequestSignature('STREAM', streamRequestOptions, effectiveParams);\n                                    this.saveRequestCacheMetadata(\n                                      this.databaseOptions!.table,\n                                      'GET',\n                                      getSignature,\n                                      storedSchemaSignature ?? expectedSchemaSignature ?? undefined,\n                                      options\n                                    );\n                                    this.saveRequestCacheMetadata(\n                                      this.databaseOptions!.table,\n                                      'STREAM',\n                                      streamSignature,\n                                      storedSchemaSignature ?? expectedSchemaSignature ?? undefined,\n                                      options\n                                    );\n                                    return of({ data: adaptedData, fromCache: true });\n                                  }\n                                  return fetchFromAPI();\n                                }),\n                                catchError((error) => {\n                                  const tableName = this.databaseOptions!.table;\n                                  this.logger.warn('DB STORAGE', 'fallback cache read failed, falling back to API:', { table: tableName, error });\n                                  return fetchFromAPI();\n                                })\n                              );\n                            }\n\n                            return fetchFromAPI();\n                          }\n\n                          return this.dbManagerService.getTableRecords(this.databaseOptions!.table).pipe(\n                            switchMap((dbData: any) => {\n\n                              if (Array.isArray(dbData) && dbData.length > 0) {\n                                const adaptedData = this.applyAdapter(dbData);\n                                this.setData$(adaptedData);\n                                this.saveRequestCacheMetadata(\n                                  this.databaseOptions!.table,\n                                  'GET',\n                                  requestSignature,\n                                  storedSchemaSignature ?? expectedSchemaSignature ?? undefined,\n                                  options\n                                );\n                                return of(adaptedData);\n                              }\n\n                              return fetchFromAPI();\n\n                            })\n                            ,\n                            catchError((error) => {\n                              const tableName = this.databaseOptions!.table;\n                              this.logger.warn('DB STORAGE', 'getTableRecords failed, recreating table and falling back to API:', { table: tableName, error });\n                              const schema = this.buildSchemaFromAdapter();\n                              const tableDef = TableSchemaDef.adapt({ table: tableName, schema });\n                              return this.dbManagerService.createDatabaseTable(tableDef).pipe(\n                                switchMap(() => fetchFromAPI()),\n                                catchError((recreateError) => {\n                                  this.logger.error('DB STORAGE', 'Failed to recreate table after read error, continuing with API only:', recreateError);\n                                  return fetchFromAPI();\n                                })\n                              );\n                            })\n                          );\n                        })\n                      );\n                  }\n\n                })\n              );\n            })\n          );\n\n        }\n\n        return fetchFromAPI();\n\n      })\n    ).subscribe()\n    this.subscriptions.add(sub)\n  }\n\n  private initDBStorageAsync(): Observable<any> {\n\n    this.logger.debug('initDBStorageAsync', 'Starting initialization:', {\n      dataType: this.dataType,\n      hasAdapter: !!this.apiOptions?.adapter,\n      table: this.databaseOptions?.table,\n      databaseOptions: this.databaseOptions\n    })\n\n    if (this.dataType !== DataType.ARRAY) {\n      this.logger.warn('initDBStorageAsync', 'Database storage requires dataType to be ARRAY');\n      return of(null);\n    }\n\n    if (!this.apiOptions.adapter) {\n      this.logger.warn('initDBStorageAsync', 'Database storage adapter missing, using minimal or inferred schema');\n    }\n\n    if (!this.databaseOptions?.table) {\n      this.logger.warn('initDBStorageAsync', 'Database storage requires a table name');\n      return of(null);\n    }\n\n    const schema = this.buildSchemaFromAdapter();\n\n    const tableDef = TableSchemaDef.adapt({\n      table: this.databaseOptions?.table,\n      schema: schema\n    });\n\n    return this.dbManagerService.createDatabaseTable(tableDef).pipe(\n      tap((created) => {\n        if (created && this.databaseOptions?.table) {\n          this.saveSchemaSignature(this.databaseOptions.table, this.buildSchemaSignature(schema))\n        }\n      })\n    );\n\n  }\n\n  private buildSchemaFromAdapter(): string {\n    const sampleData = this.apiOptions.adapter?.({}) || {};\n    return this.buildSchemaFromSample(sampleData);\n  }\n\n  private buildSchemaFromSample(sampleData: any): string {\n    const schemaKeys = Object.keys(sampleData || {}).filter(key => sampleData[key] !== undefined);\n    let schema = '++id';\n\n    if (schemaKeys.length > 0) {\n      const otherKeys = schemaKeys.filter((k) => k !== 'id').sort();\n      if (otherKeys.length > 0) {\n        schema += ', ' + otherKeys.join(', ');\n      }\n    }\n\n    return schema;\n  }\n\n  private persistStreamDataToDb(payload: any, streamOptions?: RequestOptions): Observable<any> {\n    if (!this.hasDatabase || !this.databaseOptions?.table) {\n      return of(payload);\n    }\n\n    const tableName = this.databaseOptions.table;\n    const requestOptions = this.updateRequestOptions(streamOptions?.headers)\n    requestOptions.stream = true\n    const effectiveParams = this.getEffectiveParams(streamOptions?.path)\n    const requestSignature = this.buildRequestSignature('STREAM', requestOptions, effectiveParams)\n\n    // Payload is already adapted by RequestService.requestStreaming() pipe - no need to adapt again\n    const dbData = (payload?.results && Array.isArray(payload.results))\n      ? payload.results\n      : Array.isArray(payload)\n        ? payload\n        : payload\n          ? [payload]\n          : [];\n\n    if (dbData.length === 0) {\n      // Empty stream still advances the STREAM cursor so the next refresh deltas\n      // instead of re-running a full stream (spec: empty full-stream persists cursor).\n      this.saveRequestCacheMetadata(tableName, 'STREAM', requestSignature, undefined, streamOptions)\n      return of(payload);\n    }\n\n    const schema = this.buildSchemaFromSample(dbData[0]);\n    const schemaSignature = this.buildSchemaSignature(schema)\n    const tableDef = TableSchemaDef.adapt({ table: tableName, schema });\n\n    // ponytail: skip per-chunk updateStore — it triggers persistState → 3× localStorage.setItem\n    // on every chunk. The expires timestamp from the first chunk is sufficient; saveRequestCacheMetadata\n    // at the end handles the savedAt cursor.\n    const ensureTable$ = this.dbManagerService.createDatabaseTable(tableDef)\n\n    return ensureTable$.pipe(\n      switchMap((created) => {\n        if (!created) {\n          this.logger.warn('DB STORAGE', 'Stream table create/open not ready, skipping DB write for this chunk:', { table: tableName });\n          return of(payload);\n        }\n        return this.dbManagerService.createTableRecords(tableName, dbData).pipe(\n          tap(() => this.saveRequestCacheMetadata(tableName, 'STREAM', requestSignature, schemaSignature, streamOptions)),\n          map(() => payload)\n        );\n      }),\n      map(() => payload),\n      catchError((error) => {\n        this.logger.error('DB STORAGE', 'Failed to persist streaming payload:', { table: tableName, schema, error });\n        return of(payload);\n      })\n    );\n  }\n\n  // Shared by both fetchRecords() call sites (first-call and subsequent-call branches) so\n  // deltaSync's \"check cursor, delta-fetch or full-fetch\" behavior runs identically on every\n  // call rather than only the first one per tab session — see design.md Decision #1.\n  private runGetDeltaOrFullFetch(\n    storeData: any,\n    requestOptions: any,\n    effectiveParams: any,\n    requestSignature: string,\n    options: any,\n    fetchFromAPI: () => Observable<any>\n  ): Observable<any> {\n    const combo = this.buildQueryCombinationString(requestOptions, effectiveParams)\n    const savedAt = this.getSavedAtForCombo(storeData, 'GET', combo)\n    if (savedAt) {\n      return this.deltaFetch(savedAt, requestOptions, effectiveParams, requestSignature, options, storeData, fetchFromAPI)\n    }\n    return fetchFromAPI().pipe(\n      tap(() => {\n        this.hasInitialFetch = true\n        this.persistInitialFetch(true)\n      })\n    )\n  }\n\n  // STREAM equivalent of runGetDeltaOrFullFetch(), shared by fetchStream()'s two call sites.\n  private runStreamDeltaOrFullFetch(\n    storeData: any,\n    requestOptions: any,\n    effectiveParams: any,\n    requestSignature: string,\n    options: any,\n    fetchStreamFromAPI: () => Observable<any>\n  ): Observable<any> {\n    const combo = this.buildQueryCombinationString(requestOptions, effectiveParams)\n    const streamSavedAt = this.getSavedAtForCombo(storeData, 'STREAM', combo)\n    if (streamSavedAt) {\n      if (!this.tryBeginInFlightRequest(requestSignature)) {\n        const currentStateData = this.stateSignal()?.data\n        if (Array.isArray(currentStateData) && currentStateData.length > 0) {\n          return of({ data: this.applyAdapter(currentStateData), fromCache: true })\n        }\n        if (currentStateData && !Array.isArray(currentStateData) && Object.keys(currentStateData).length > 0) {\n          return of({ data: this.applyAdapter(currentStateData), fromCache: true })\n        }\n        return of({ data: this.dataType === DataType.ARRAY ? [] : {}, fromCache: true })\n      }\n      this.setCachedRequestSignature(this.databaseOptions!.table, 'STREAM', requestSignature)\n      return this.deltaFetch(streamSavedAt, requestOptions, effectiveParams, requestSignature, options, storeData, fetchStreamFromAPI, 'STREAM')\n    }\n    return fetchStreamFromAPI().pipe(\n      tap(() => {\n        this.hasInitialFetch = true\n        this.persistInitialFetch(true)\n      })\n    )\n  }\n\n  /**\n   * Resolves the savedAt cursor for a specific query combination. Each query combo keeps\n   * its OWN cursor (savedAtByQuery map), so switching views back and forth delta-fetches\n   * against the correct per-combo cursor instead of full-fetching or reusing a cursor\n   * that belongs to a different dataset.\n   */\n  private getSavedAtForCombo(storeData: any, type: 'GET'|'STREAM', combo: string): number | undefined {\n    const meta = this.getRequestCacheMetadata(storeData, type)\n    if (!meta) return undefined\n    // Per-combination cursors (newer) take precedence\n    if (meta.savedAtByQuery && typeof meta.savedAtByQuery === 'object') {\n      const cursor = meta.savedAtByQuery[combo]\n      if (typeof cursor === 'number') return cursor\n      return undefined\n    }\n    // Legacy single cursor: only reuse it when the current query has no params (matches\n    // how the old single-cursor path recorded it) or when there is no query at all.\n    if (typeof meta.savedAt === 'number') {\n      if (combo === '') return meta.savedAt\n      const legacyCombo = typeof meta.savedAtQuery === 'string' ? meta.savedAtQuery : ''\n      return legacyCombo === combo ? meta.savedAt : undefined\n    }\n    return undefined\n  }\n\n  /**\n   * Deterministic, normalized query combination string for a request — same logic used by\n   * checkTrackerAllowsRequest so cursor-query comparisons are consistent.\n   */\n  private buildQueryCombinationString(requestOptions: any, effectiveParams: any): string {\n    const ignoreQueryParams = Array.isArray(requestOptions?.ignoreQueryParams) ? requestOptions!.ignoreQueryParams : []\n    const normalized = this.trackerNormalizePath(this.resolvePath(effectiveParams))\n    const filtered = this.trackerFilterQuery(normalized.query, ignoreQueryParams)\n    const keys = Object.keys(filtered).sort()\n    if (keys.length === 0) return ''\n    return keys.map((k) => `${k}=${filtered[k]}`).join('&')\n  }\n\n  private deltaFetch(\n    savedAt: number,\n    requestOptions: any,\n    effectiveParams: any,\n    requestSignature: string,\n    options: any,\n    storeData: any,\n    fullFetch: () => Observable<any>,\n    type: 'GET' | 'STREAM' = 'GET'\n  ): Observable<any> {\n    const tableName = this.databaseOptions!.table;\n    const storedSchemaSignature = this.getStoredSchemaSignature(storeData);\n    const expectedSchema = this.buildSchemaFromAdapter();\n    const expectedSchemaSignature = this.buildSchemaSignature(expectedSchema);\n    const schemaSig = storedSchemaSignature ?? expectedSchemaSignature ?? undefined;\n\n    const modifiedSince = Math.ceil(savedAt / 1000);\n    const deltaHeaders = {\n      ...(requestOptions?.headers || {}),\n      'X-Modified-Since': modifiedSince\n    };\n    // adapter stripped here for the same reason as fetchFromAPI's plain GET: this call's raw\n    // response can be an envelope (e.g. { data: [...] }), and RequestService.request() would\n    // adapt that whole envelope as one bogus record before this method's own applyAdapter()\n    // call below ever sees it.\n    const deltaOptions = ApiRequest.adapt({\n      ...requestOptions,\n      headers: deltaHeaders,\n      stream: type === 'STREAM',\n      adapter: undefined\n    });\n    const wrapAsStreamPacket = (result: any) => type === 'STREAM' ? { data: result, fromCache: false } : result;\n\n    return this.httpManagerService.getRequest(deltaOptions, effectiveParams).pipe(\n      this.track(),\n      switchMap((data: any) => {\n        const rawData = this.extractListPayload(data);\n        const deltaRecords = Array.isArray(rawData) ? rawData : (rawData == null ? [] : [rawData]);\n\n        if (deltaRecords.length === 0) {\n          return this.dbManagerService.getTableRecords(tableName).pipe(\n            switchMap((dbData: any) => {\n              // Empty delta against an EMPTY DB means the cursor is stale (e.g. an\n              // empty first full fetch left a cursor but no rows, or a cleared DB).\n              // Fall back to a full fetch so real data is never hidden behind an\n              // empty, non-recoverable state — see fix-delta-empty-first-fetch-cursor.\n              if (Array.isArray(dbData) && dbData.length === 0) {\n                // The STREAM path holds an in-flight marker for the (now completed) delta\n                // request; release it so the full-fetch fallback can issue a fresh request.\n                // No-op for GET, which doesn't begin in-flight before deltaFetch.\n                this.endInFlightRequest(requestSignature);\n                return fullFetch();\n              }\n              this.saveRequestCacheMetadata(tableName, type, requestSignature, schemaSig, options);\n              if (Array.isArray(dbData) && dbData.length > 0) {\n                this.setData$(this.applyAdapter(dbData));\n              }\n              this.hasInitialFetch = true;\n              this.persistInitialFetch(true);\n              return of(wrapAsStreamPacket(this.applyAdapter(dbData) || []));\n            })\n          );\n        }\n\n        const adaptedDelta = this.applyAdapter(deltaRecords);\n        const dbRecords = Array.isArray(adaptedDelta) ? adaptedDelta : (adaptedDelta == null ? [] : [adaptedDelta]);\n        return this.dbManagerService.createTableRecords(tableName, dbRecords).pipe(\n          tap(() => {\n            this.saveRequestCacheMetadata(tableName, type, requestSignature, schemaSig, options);\n            this.hasInitialFetch = true;\n            this.persistInitialFetch(true);\n          }),\n          switchMap(() => this.dbManagerService.getTableRecords(tableName).pipe(\n            tap((dbData: any) => {\n              if (Array.isArray(dbData) && dbData.length > 0) {\n                this.setData$(this.applyAdapter(dbData));\n              }\n            }),\n            map((dbData: any) => wrapAsStreamPacket(this.applyAdapter(dbData) || []))\n          )),\n          catchError((error) => {\n            this.logger.warn('DELTA SYNC', 'createTableRecords failed, skipping DB write for delta records:', { table: tableName, error });\n            this.mergeDeltaData$(dbRecords);\n            this.hasInitialFetch = false;\n            this.persistInitialFetch(false);\n            return of(wrapAsStreamPacket(dbRecords));\n          })\n        );\n      }),\n      catchError((error) => {\n        this.logger.warn('DELTA SYNC', 'Delta fetch failed, preserving savedAt for retry:', { table: tableName, error });\n        return this.dbManagerService.getTableRecords(tableName).pipe(\n          tap((dbData: any) => {\n            if (Array.isArray(dbData) && dbData.length > 0) {\n              this.setData$(this.applyAdapter(dbData));\n            }\n          }),\n          map((dbData: any) => wrapAsStreamPacket(this.applyAdapter(dbData) || []))\n        );\n      }),\n      finalize(() => {\n        this.endInFlightRequest(requestSignature);\n      })\n    );\n  }\n\n  // Shared across every HTTPManagerStateService instance (e.g. StateServiceDemo and\n  // StateDataRequestService both resyncing the same record after one stateManagerMessage\n  // broadcast): keyed by server+path, holds the one real in-flight GET so that N independent\n  // instances each still run their own local state update from the result, without N network\n  // round-trips for what is the same underlying record.\n  private static readonly inFlightFetchRecordRequests = new Map<string, Observable<any>>();\n\n  // FETCH RECORD\n  fetchRecord(options: RequestOptions, method: string): void {\n    const sub = of(RequestOptions.adapt(options)).pipe(\n      tap(() => this.logger.debug('fetchRecord', '🔄 fetchRecord effect triggered', { path: options?.path, method })),\n      switchMap((options) => {\n\n        this.streamedResponse = []\n\n        const idFromPath = (options as any).path?.length ? options.path[options.path.length - 1] : null\n\n        if (method === 'DELETE') {\n          // Nothing to fetch: the record is already gone. Doing a GET first (like CREATE/UPDATE\n          // below, to pick up server-side computed fields) would just 404 — and since this whole\n          // pipe has no catchError, that abort skipped deleteData$/deleteTableRecord entirely,\n          // silently leaving the \"deleted\" record behind on every other instance that received\n          // this broadcast. Remove it directly instead.\n          if (idFromPath == null) {\n            this.logger.warn('fetchRecord', 'DELETE method called but id is missing from path', { options })\n            return of(null)\n          }\n          this.logger.debug('fetchRecord', '🗑️ Deleting record with id (no GET needed):', idFromPath)\n          this.deleteData$({ id: idFromPath } as T & { id: number })\n\n          const tableName = this.databaseOptions?.table\n          const dbDelete$ = (this.hasDatabase && tableName)\n            ? this.dbManagerService.deleteTableRecord(tableName, idFromPath).pipe(\n                tap(() => this.saveRequestCacheMetadata(\n                  tableName, 'GET',\n                  this.buildRequestSignature('GET', this.updateRequestOptions(options?.headers), this.getEffectiveParams(options?.path)),\n                  this.getStoredSchemaSignature(undefined) ?? undefined,\n                  options\n                ))\n              )\n            : of(null)\n          return dbDelete$.pipe(this.track())\n        }\n\n        const requestOptions = this.updateRequestOptions(options?.headers)\n        const effectiveParams = this.getEffectiveParams(options?.path)\n\n        const requestKey = `${requestOptions.server}::${JSON.stringify(options?.path)}`\n        let shared$ = HTTPManagerStateService.inFlightFetchRecordRequests.get(requestKey)\n        if (!shared$) {\n          shared$ = this.httpManagerService.getRequest(requestOptions, effectiveParams).pipe(\n            finalize(() => HTTPManagerStateService.inFlightFetchRecordRequests.delete(requestKey)),\n            shareReplay({ bufferSize: 1, refCount: true })\n          )\n          HTTPManagerStateService.inFlightFetchRecordRequests.set(requestKey, shared$)\n        }\n\n        return shared$\n        .pipe(\n          this.track(),\n          tap((data: any) => {\n            this.logger.debug('fetchRecord', '📦 fetchRecord received data:', data)\n\n            // Data is already adapted by RequestService.request() pipe - no need to adapt again\n            const arrayData = this.extractListPayload(data)\n            const finalData = (!arrayData) ? (this.dataType === DataType.ARRAY) ? [] : {} : arrayData\n\n            // For single-record operations (CREATE, UPDATE), detect array vs object\n            const isArrayResponse = Array.isArray(finalData) && finalData.length > 0;\n\n            if(method === 'UPDATE') {\n              if (isArrayResponse) {\n                this.logger.debug('fetchRecord', '✏️ Updating records (array):', { count: finalData.length })\n                this.mergeDeltaData$(finalData)\n              } else {\n                this.logger.debug('fetchRecord', '✏️ Updating record:', finalData)\n                this.updateData$(finalData)\n              }\n            }\n            if(method === 'CREATE') {\n              this.logger.debug('fetchRecord', '➕ Adding record:', finalData)\n              this.addData$(finalData)\n            }\n\n          }),\n          concatMap((data: any) => {\n            // Data is already adapted by RequestService.request() pipe - no need to adapt again\n            const dbData = this.extractListPayload(data)\n            const tableName = this.databaseOptions?.table;\n\n            // For single-record operations, detect array vs object\n            const dbIsArrayResponse = Array.isArray(dbData) && dbData.length > 0;\n\n            if (this.hasDatabase && tableName) {\n              switch (method) {\n                case 'UPDATE':\n                  if (dbIsArrayResponse) {\n                    this.logger.debug('fetchRecord', 'Upserting array of records to database', { table: tableName, count: dbData.length });\n                    return this.dbManagerService.createTableRecords(tableName, dbData).pipe(\n                      tap(() => this.saveRequestCacheMetadata(\n                        tableName, 'GET',\n                        this.buildRequestSignature('GET', this.updateRequestOptions(options?.headers), this.getEffectiveParams(options?.path)),\n                        this.getStoredSchemaSignature(undefined) ?? undefined,\n                        options\n                      ))\n                    );\n                  }\n                  if (dbData && dbData.id != null) {\n                    this.logger.debug('fetchRecord', 'Updating database record', { table: tableName, id: dbData.id, data: dbData });\n                    return this.dbManagerService.updateTableRecord(tableName, dbData).pipe(\n                      tap(() => this.saveRequestCacheMetadata(\n                        tableName, 'GET',\n                        this.buildRequestSignature('GET', this.updateRequestOptions(options?.headers), this.getEffectiveParams(options?.path)),\n                        this.getStoredSchemaSignature(undefined) ?? undefined,\n                        options\n                      ))\n                    );\n                  }\n                  this.logger.warn('fetchRecord', 'UPDATE method called but data or id is missing', { dbData, hasData: !!dbData, hasId: !!dbData?.id });\n                  break;\n\n                case 'CREATE':\n                  if (dbData && dbData.id != null && dbData.id !== '') {\n                    this.logger.debug('fetchRecord', 'Creating database record', { table: tableName, id: dbData.id, data: dbData });\n                    return this.dbManagerService.createTableRecord(tableName, dbData).pipe(\n                      tap(() => this.saveRequestCacheMetadata(\n                        tableName, 'GET',\n                        this.buildRequestSignature('GET', this.updateRequestOptions(options?.headers), this.getEffectiveParams(options?.path)),\n                        this.getStoredSchemaSignature(undefined) ?? undefined,\n                        options\n                      ))\n                    );\n                  }\n                  this.logger.warn('fetchRecord', 'CREATE method called but data.id is invalid', { dbData });\n                  break;\n\n                default:\n                  this.logger.debug('fetchRecord', 'Method does not require database operation', { method });\n              }\n            } else {\n              this.logger.debug('fetchRecord', 'Database not configured, skipping database operation', {\n                hasDatabase: this.hasDatabase,\n                hasTable: !!tableName\n              });\n            }\n\n            return of(this.applyAdapter(dbData));\n          })\n        )\n\n      })\n    ).subscribe()\n    this.subscriptions.add(sub)\n  }\n\n  // The reconciliation guarantee (see design.md): fetchRecord() above patches in one record at\n  // a time from a WS broadcast and is best-effort — a missed/failed message leaves it silently\n  // stale. reconcile() instead fetches the server's complete current record set for this store's\n  // configured path and makes local state match it exactly, upserting AND pruning — the only\n  // sync path that removes a local record the server no longer has. It deliberately bypasses\n  // fetchRecords()'s delta cursor (a delta response is partial by design, so pruning against one\n  // would wrongly delete unmodified records) and its request-dedup tracker (which would often\n  // just serve the cached local database back instead of reaching the network). Triggered\n  // automatically by setupReconciliation()'s interval and by the reconnect handler in\n  // initWSSubscription; public so a consumer can also force an immediate correction on demand\n  // (e.g. a \"Get Data\" action) instead of waiting for the next tick. Accepts an optional explicit\n  // options argument for that on-demand case — ngOnInit() no longer calls fetchRecords() on its\n  // own in the WS demo, so the very first \"Get Data\" click has to be able to establish the path\n  // itself rather than depending on lastFetchOptions already being set. When provided, it's also\n  // saved as the new lastFetchOptions so later automatic triggers (interval, reconnect) pick it\n  // up too. Without an explicit argument, falls back to lastFetchOptions as before. Opt-in via\n  // DatabaseStorage.reconcile; no-ops otherwise.\n  reconcile(options?: RequestOptions): void {\n    const effectiveOptions = options ?? this.lastFetchOptions\n    // No options were given and no fetchRecords()/reconcile() call has happened yet, so there's\n    // no known resource path to reconcile against — nothing to correct before the first real\n    // fetch establishes one.\n    if (!this.databaseOptions?.reconcile || !this.hasDatabase || !this.databaseOptions?.table || !effectiveOptions) {\n      return\n    }\n    this.lastFetchOptions = effectiveOptions\n\n    const tableName = this.databaseOptions.table\n    const requestOptions = this.updateRequestOptions(effectiveOptions.headers, effectiveOptions.selector)\n    const effectiveParams = this.getEffectiveParams(effectiveOptions.path)\n    const requestSignature = this.buildRequestSignature('GET', requestOptions, effectiveParams)\n\n    // Reuses the same in-flight tracking fetchRecords()/fetchStream() use, keyed by the same\n    // signature a plain GET for this path would have — so a reconciliation tick that lands\n    // while an ordinary fetch for this table is already in flight defers to it instead of\n    // racing it, rather than adding a separate lock.\n    if (!this.tryBeginInFlightRequest(requestSignature)) {\n      this.logger.debug('RECONCILE', 'Skipping reconciliation: a request is already in flight for this table', { table: tableName })\n      return\n    }\n\n    // adapter stripped for this call, same reason as fetchFromAPI/deltaFetch: the raw response\n    // can be an envelope (e.g. { data: [...] }), and RequestService.request() would adapt that\n    // whole envelope as one bogus record before extractListPayload() below ever unwraps it. The\n    // extracted records are written to the DB as-is (reconcileTableRecords only needs `id`);\n    // applyAdapter() runs on the read-back from getTableRecords() further down instead.\n    const sub = this.httpManagerService.getRequest({ ...requestOptions, adapter: undefined }, effectiveParams).pipe(\n      map((data: any) => this.extractListPayload(data)),\n      switchMap((rawData: any) => {\n        const serverRecords = Array.isArray(rawData) ? rawData : (rawData == null ? [] : [rawData])\n\n        const reconcileRecords$ = () => this.dbManagerService.reconcileTableRecords(tableName, serverRecords).pipe(\n          switchMap(() => this.dbManagerService.getTableRecords(tableName)),\n          // Read the DB back after reconciling and feed THAT into setData$, rather than the raw\n          // server response, so memory and the database can never diverge from each other as a\n          // result of this run — unlike fetchFromAPI's ordinary GET path, an empty result here\n          // is a real \"the table is now empty\" outcome to apply, not a transient response to\n          // ignore, since reconciliation's whole point is exact parity with the server.\n          tap((dbData: any) => this.setData$(this.applyAdapter(dbData) ?? []))\n        )\n\n        // Unlike fetchRecords()/fetchStream(), reconcile() had no ensure-table-exists step —\n        // reconcileTableRecords() silently no-ops (getDatabaseTable → null → EMPTY) when the\n        // local table doesn't exist yet, so a successful GET here never reached setData$(). No\n        // schema to infer from an empty response, so an empty result skips straight to\n        // reconcileRecords$() (matches fetchRecords()'s own empty-first-fetch handling).\n        if (serverRecords.length === 0) {\n          return reconcileRecords$()\n        }\n\n        const schema = this.buildSchemaFromSample(serverRecords[0])\n        const tableDef = TableSchemaDef.adapt({ table: tableName, schema })\n\n        return this.dbManagerService.createDatabaseTable(tableDef).pipe(\n          switchMap((created) => {\n            if (!created) {\n              this.logger.warn('RECONCILE', 'Table create/open not ready, skipping reconciliation for this run:', { table: tableName })\n              return of(null)\n            }\n            return reconcileRecords$()\n          })\n        )\n      }),\n      catchError((error) => {\n        this.logger.warn('RECONCILE', 'Reconciliation failed; local state left unchanged, will retry on the next trigger:', { table: tableName, error })\n        return of(null)\n      }),\n      finalize(() => this.endInFlightRequest(requestSignature))\n    ).subscribe()\n    this.subscriptions.add(sub)\n  }\n\n  // CREATE RECORD\n  createRecord(data: any|null, options?: RequestOptions): void {\n    const sub =\n      of(data).pipe(\n        switchMap((data: any) => {\n          this.streamedResponse = []\n          const requestOptions = this.updateRequestOptions(options?.headers)\n          const effectiveParams = this.getEffectiveParams(options?.path)\n\n          return this.httpManagerService.postRequest(data, requestOptions, effectiveParams)\n            .pipe(\n              this.track(),\n              tap((adaptedData: any) => {\n                // Data is already adapted by RequestService\n                const safeData = (!adaptedData) ? (this.dataType === DataType.ARRAY ? [] : {}) : adaptedData\n                this.addData$(safeData)\n                this.emitOperationSuccess(OperationResultModel.adapt({ success: true, operation: 'CREATE' }))\n                this.wsCommunication('CREATE', [...options?.path || [], safeData.id])\n              }),\n              concatMap((adaptedData: any) => {\n                if (this.hasDatabase && this.databaseOptions?.table && adaptedData?.id) {\n                  return this.dbManagerService.createTableRecord(this.databaseOptions.table, adaptedData)\n                }\n                return of(adaptedData)\n              })\n            )\n        })\n      ).subscribe()\n    this.subscriptions.add(sub)\n  }\n\n  // UPDATE RECORD\n  updateRecord(data: any|null, options?: RequestOptions): void {\n    const sub =\n      of(data).pipe(\n        concatMap((data: any) => {\n          this.streamedResponse = []\n          const requestOptions = this.updateRequestOptions(options?.headers)\n          const effectiveParams = this.getEffectiveParams(options?.path)\n\n          return this.httpManagerService.putRequest(data, requestOptions, effectiveParams)\n            .pipe(\n              this.track(),\n              tap((adaptedData: any) => {\n                // Data is already adapted by RequestService\n                const safeData = (!adaptedData) ? (this.dataType === DataType.ARRAY ? [] : {}) : adaptedData\n                this.updateData$(safeData)\n                this.emitOperationSuccess(OperationResultModel.adapt({ success: true, operation: 'UPDATE' }))\n                this.wsCommunication('UPDATE', [...options?.path || []])\n              }),\n              concatMap((adaptedData: any) => {\n                if (this.hasDatabase && this.databaseOptions?.table && adaptedData?.id) {\n                  return this.dbManagerService.updateTableRecord(this.databaseOptions.table, adaptedData)\n                }\n                return of(adaptedData)\n              })\n            )\n        })\n      ).subscribe()\n    this.subscriptions.add(sub)\n  }\n\n  // PATCH RECORD\n  patchRecord(data: any|null, options?: RequestOptions): void {\n    const sub =\n      of(data).pipe(\n        concatMap((data: any) => {\n          this.streamedResponse = []\n          const requestOptions = this.updateRequestOptions(options?.headers)\n          const effectiveParams = this.getEffectiveParams(options?.path)\n\n          return this.httpManagerService.patchRequest(data, requestOptions, effectiveParams)\n            .pipe(\n              this.track(),\n              tap((adaptedData: any) => {\n                // Data is already adapted by RequestService\n                const safeData = (!adaptedData) ? (this.dataType === DataType.ARRAY ? [] : {}) : adaptedData\n                this.updateData$(safeData)\n                this.emitOperationSuccess(OperationResultModel.adapt({ success: true, operation: 'PATCH' }))\n                this.wsCommunication('PATCH', [...options?.path || []])\n              }),\n              concatMap((adaptedData: any) => {\n                if (this.hasDatabase && this.databaseOptions?.table && adaptedData?.id) {\n                  return this.dbManagerService.updateTableRecord(this.databaseOptions.table, adaptedData)\n                }\n                return of(adaptedData)\n              })\n            )\n        })\n      ).subscribe()\n    this.subscriptions.add(sub)\n  }\n\n  // DELETE RECORD\n  deleteRecord(options?: RequestOptions): void {\n    const sub =\n      of(options).pipe(\n        concatMap((data: any) => {\n          this.streamedResponse = []\n          const requestOptions = this.updateRequestOptions(options?.headers)\n          const effectiveParams = this.getEffectiveParams(options?.path)\n\n          return this.httpManagerService.deleteRequest(requestOptions, effectiveParams)\n            .pipe(\n              this.track(),\n              tap((adaptedData: any) => {\n                // Data is already adapted by RequestService\n                const safeData = (!adaptedData) ? (this.dataType === DataType.ARRAY ? [] : {}) : adaptedData\n                this.deleteData$(safeData)\n                this.emitOperationSuccess(OperationResultModel.adapt({ success: true, operation: 'DELETE' }))\n                this.wsCommunication('DELETE', [...options?.path || []])\n              }),\n              concatMap((adaptedData: any) => {\n                if (this.hasDatabase && this.databaseOptions?.table && adaptedData?.id) {\n                  return this.dbManagerService.deleteTableRecord(this.databaseOptions.table, adaptedData.id)\n                }\n                return of(adaptedData)\n              })\n            )\n        })\n      ).subscribe()\n    this.subscriptions.add(sub)\n  }\n\n  // --------------------------------------------------------------------------------------------------\n  // FETCH STREAM\n  createStream(data: any|null, options?: RequestOptions): void {\n    const sub =\n      of(data).pipe(\n        tap(() => this.beginPending()),\n        switchMap((data: any) => {\n          const requestOptions = this.updateRequestOptions(options?.headers)\n          const effectiveParams = this.getEffectiveParams(options?.path)\n\n          return this.httpManagerService.postRequest(data, requestOptions, effectiveParams)\n            .pipe(\n              tap((adaptedRes: any) => {\n                // Data is already adapted by RequestService\n                if (adaptedRes.length > 0) this.setData$(adaptedRes)\n                this.streamedResponse = adaptedRes\n              }),\n              scan((acc, res: any) => {\n                const previous = acc.current\n                const current = res\n                return { previous, current }\n              }, { previous: null, current: null }),\n              tap(({ previous, current }) => {\n                if (previous && JSON.stringify(previous) === JSON.stringify(current)) {\n                  this.setData$([])\n                }\n              }),\n              finalize(() => this.endPending())\n            )\n        })\n      ).subscribe()\n    this.subscriptions.add(sub)\n  }\n\n  fetchStream(options?: RequestOptions): void {\n    const sub =\n      of(options).pipe(\n        tap(() => {\n          this.streamedResponse = []\n          this.beginPending()\n        }),\n        switchMap((options: any) => {\n          const requestOptions = this.updateRequestOptions(options?.headers)\n          requestOptions.stream = true\n          const effectiveParams = this.getEffectiveParams(options?.path)\n\n          if (this.hasDatabase && this.databaseOptions?.table) {\n            const requestSignature = this.buildRequestSignature('STREAM', requestOptions, effectiveParams)\n            const fetchStreamFromAPI = () => {\n              if (!this.tryBeginInFlightRequest(requestSignature)) {\n                const currentStateData = this.stateSignal()?.data\n                if (Array.isArray(currentStateData) && currentStateData.length > 0) {\n                  return of({ data: this.applyAdapter(currentStateData), fromCache: true })\n                }\n                if (currentStateData && !Array.isArray(currentStateData) && Object.keys(currentStateData).length > 0) {\n                  return of({ data: this.applyAdapter(currentStateData), fromCache: true })\n                }\n                return of({ data: this.dataType === DataType.ARRAY ? [] : {}, fromCache: true })\n              }\n              this.setCachedRequestSignature(this.databaseOptions!.table, 'STREAM', requestSignature)\n              return this.httpManagerService.getRequest(requestOptions, effectiveParams).pipe(\n                map((apiData: any) => ({ data: apiData, fromCache: false })),\n                finalize(() => this.endInFlightRequest(requestSignature))\n              )\n            }\n            return (() => {\n              const storeData = this.localStorageManagerService.store(this.databaseOptions.table)()\n                const forceRefresh = !!(options as any)?.forceRefresh\n                const expires = storeData?.expires || 0\n                const hasExpired = expires > 0 && this.utils.hasExpired(expires)\n\n                // INIT branch: first call in this session. Mirrors fetchRecords GATE 1.\n                // Only takes over when deltaSync=true: honors expiresIn (clear+full stream\n                // if expired) and uses the STREAM savedAt cursor for a delta fetch.\n                // When deltaSync=false, fall through to the existing queryParams-tracked\n                // flow (which already handles init correctly via requestCache gating).\n                if (!this.hasInitialFetch && this.databaseOptions?.deltaSync) {\n                  return this.dbManagerService.hasDatabaseTable(this.databaseOptions!.table).pipe(\n                    switchMap((tableExists: boolean) => {\n                      if (!tableExists) {\n                        return this.initDBStorageAsync().pipe(\n                          switchMap(() => fetchStreamFromAPI()),\n                          catchError(() => fetchStreamFromAPI()),\n                          tap(() => {\n                            this.hasInitialFetch = true\n                            this.persistInitialFetch(true)\n                          })\n                        )\n                      }\n                      // ponytail: when deltaSync=true the savedAt cursor owns freshness, so the\n                      // TTL (expiresIn) expiry branch is skipped — an expired TTL must not wipe\n                      // requestCache and force a full stream. runStreamDeltaOrFullFetch already\n                      // falls back to a full stream when there is no savedAt cursor.\n                      return this.runStreamDeltaOrFullFetch(storeData, requestOptions, effectiveParams, requestSignature, options, fetchStreamFromAPI)\n                    })\n                  )\n                }\n\n                if (forceRefresh) {\n                  return fetchStreamFromAPI()\n                }\n                // ponytail: with deltaSync=true the savedAt cursor owns freshness, so TTL\n                // expiry must not wipe requestCache and force a full stream.\n                if (hasExpired && !this.databaseOptions?.deltaSync) {\n                  this.hasInitialFetch = false\n                  this.clearSessionFlag()\n                  return this.dbManagerService.clearTable(this.databaseOptions!.table).pipe(\n                    switchMap(() => fetchStreamFromAPI())\n                  )\n                }\n                const storedSchemaSignature = this.getStoredSchemaSignature(storeData)\n                const expectedSchema = this.buildSchemaFromAdapter()\n                const expectedSchemaSignature = this.buildSchemaSignature(expectedSchema)\n                if (storedSchemaSignature && storedSchemaSignature !== expectedSchemaSignature) {\n                  const tableDef = TableSchemaDef.adapt({ table: this.databaseOptions!.table, schema: expectedSchema })\n                  this.hasInitialFetch = false\n                  this.clearSessionFlag()\n                  return this.dbManagerService.clearTable(this.databaseOptions!.table).pipe(\n                    switchMap(() => this.dbManagerService.createDatabaseTable(tableDef)),\n                    switchMap(() => fetchStreamFromAPI())\n                  )\n                }\n                // deltaSync branch: on every call (not just the first one this tab session),\n                // re-check the server for anything modified since the DB's last STREAM savedAt\n                // cursor and merge just that delta in — see design.md Decision #1.\n                if (this.databaseOptions?.deltaSync) {\n                  return this.dbManagerService.hasDatabaseTable(this.databaseOptions!.table).pipe(\n                    switchMap((tableExists: boolean) => {\n                      if (!tableExists) {\n                        return this.initDBStorageAsync().pipe(\n                          switchMap(() => fetchStreamFromAPI()),\n                          catchError(() => fetchStreamFromAPI())\n                        )\n                      }\n                      return this.runStreamDeltaOrFullFetch(storeData, requestOptions, effectiveParams, requestSignature, options, fetchStreamFromAPI).pipe(\n                        catchError(() => fetchStreamFromAPI())\n                      )\n                    })\n                  )\n                }\n                return this.checkTrackerAllowsRequest(\n                  this.databaseOptions!.table,\n                  'STREAM',\n                  this.resolvePath(effectiveParams),\n                  options,\n                  storeData\n                ).pipe(\n                  switchMap((trackerAllowsRequest: boolean) => {\n                    if (!trackerAllowsRequest) {\n                      return this.dbManagerService.getTableRecords(this.databaseOptions!.table).pipe(\n                        switchMap((dbData: any) => {\n                          if (Array.isArray(dbData) && dbData.length > 0) {\n                            return of({ data: this.applyAdapter(dbData), fromCache: true })\n                          }\n                          const currentStateData = this.stateSignal()?.data\n                          if (Array.isArray(currentStateData) && currentStateData.length > 0) {\n                            return of({ data: this.applyAdapter(currentStateData), fromCache: true })\n                          }\n                          if (currentStateData && !Array.isArray(currentStateData) && Object.keys(currentStateData).length > 0) {\n                            return of({ data: this.applyAdapter(currentStateData), fromCache: true })\n                          }\n                          return fetchStreamFromAPI()\n                        })\n                      )\n                    }\n                    return fetchStreamFromAPI()\n                  })\n                )\n            })().pipe(\n              tap((packet: any) => {\n                const res = packet?.data\n                // Data is already adapted by RequestService\n                if (res && res.length > 0) {\n                  this.setData$(res)\n                  this.streamedResponse = [...this.streamedResponse, ...res]\n                }\n              }),\n              map((res: any) => res),\n              catchError((error) => {\n                this.logger.error('fetchStream', 'Streaming error:', error)\n                return of([])\n              }),\n              finalize(() => {\n                // ponytail: single bulk DB write at stream end instead of per-chunk,\n                // avoiding N × (bulkPut + updateStore + persistState → 3× setItem) main-thread stalls.\n                // persistStreamDataToDb writes the STREAM cursor even for an empty stream.\n                this.persistStreamDataToDb(this.streamedResponse, options).subscribe({\n                  next: () => this.endPending(),\n                  error: () => this.endPending(),\n                })\n              })\n            )\n          }\n          // If no database is configured, always call the API (do not check tracker)\n          return this.httpManagerService.getRequest(requestOptions, effectiveParams)\n            .pipe(\n              tap((res: any) => {\n                // Data is already adapted by RequestService\n                if (res && res.length > 0) {\n                  this.setData$(res)\n                  this.streamedResponse = [...this.streamedResponse, ...res]\n                }\n              }),\n              map((res: any) => res),\n              catchError((error) => {\n                return of([])\n              }),\n              finalize(() => {\n                if (this.streamedResponse.length > 0) {\n                  this.persistStreamDataToDb(this.streamedResponse, options).subscribe()\n                }\n                this.endPending()\n              })\n            )\n        })\n      ).subscribe()\n    this.subscriptions.add(sub)\n  }\n\n  // WEBSOCKET COMMUNICATION (STATE MANAGER)\n  private wsCommunication(method: string, path?: string|number[]) {\n    if (!this.apiOptions.ws) {\n      this.logger.warn('wsCommunication', 'called but no WebSocket options configured');\n      return;\n    }\n\n    // If connected, send immediately (check singleton WebSocketManagerService)\n    if (WebSocketManagerService.isConnected()) {\n      this.sendWsCommunication(method, path);\n    } else {\n      // Queue the message to be sent when connection is established\n      this.logger.debug('wsCommunication', `⏳ Queuing WS message (not connected):`, { method, path });\n      HTTPManagerStateService.wsCommunicationQueue.push({ method, path });\n    }\n  }\n\n  /**\n   * Actually send the WebSocket message (called when connected or from queue)\n   */\n  private sendWsCommunication(method: string, path?: string|number[]) {\n    if (this.apiOptions.ws) {\n      const wsServer = this.apiOptions.ws?.id || '';\n\n      // Guard: Don't send if channel is empty\n      if (!wsServer || wsServer === '') {\n        this.logger.error('sendWsCommunication', '❌ Cannot send WS message: Channel ID is empty!');\n        return;\n      }\n\n      // DEBUG: Log what we're sending\n      this.logger.debug('sendWsCommunication', '🔍 sendWsCommunication called:', {\n        wsServer,\n        wsServerType: typeof wsServer,\n        wsServerEmpty: wsServer === '' || wsServer === null || wsServer === undefined,\n        method,\n        path,\n        user: this.apiOptions.ws.user,\n        fullPayload: { method, path, user: this.apiOptions.ws.user }\n      });\n\n      this.httpManagerService.sendMessageInChannel(wsServer, { method, path, user: this.apiOptions.ws.user });\n    } else {\n      this.logger.error('sendWsCommunication', '❌ apiOptions.ws is undefined!');\n    }\n  }\n\n  /**\n   * Send a message to channel(s)\n   * @param message - The message content\n   * @param channels - Optional array of channel names (passed as-is, caller should include prefix)\n   *                   Use 'allChannels' to broadcast to all\n   */\n  wsMessaging(message: ChannelMessage, channels?: string[]) {\n\n    const user = this.user.value\n    const messageInfo = ChannelMessage.adapt({ ...message, fromUser: user })\n\n    this.logger.debug('wsMessaging', '📤 wsMessaging called with channels:', channels);\n\n    if (WebSocketManagerService.isConnected() && this.apiOptions.ws) {\n\n      // If specific channels provided, send to each channel\n      // Channels are passed as-is - caller is responsible for including the correct prefix\n      if (channels && channels.length > 0) {\n        this.logger.debug('wsMessaging', `📤 Sending to ${channels.length} channel(s):`, channels);\n\n        // Send single message with all channels (more efficient)\n        this.httpManagerService.sendChannelMessageToChannels(channels, messageInfo);\n      } else {\n        // Fallback to the primary WS channel (already prefixed with SYS-)\n        const wsChannel = this.apiOptions.ws.id;\n        this.logger.debug('wsMessaging', `📤 Sending to state channel:`, wsChannel);\n        this.httpManagerService.sendChannelMessage(wsChannel, messageInfo);\n      }\n\n    }\n\n  }\n\n  /**\n   * Subscribe to a messaging channel\n   * @param channel - Base channel name (MES- prefix added automatically)\n   */\n  subscribeToMessageChannel(channel: string) {\n    if (WebSocketManagerService.isConnected()) {\n      const prefixedChannel = this.prefixChannel(channel, ChannelType.MESSAGE);\n      this.httpManagerService.subscribeToChannel(prefixedChannel);\n      this.logger.debug('subscribeToMessageChannel', `💬 Subscribed to message channel: ${prefixedChannel}`);\n    } else {\n      this.logger.warn('subscribeToMessageChannel', 'Cannot subscribe to message channel: WebSocket not connected.');\n    }\n  }\n\n  /**\n   * Unsubscribe from a messaging channel\n   * @param channel - Base channel name (MES- prefix added automatically)\n   */\n  unsubscribeFromMessageChannel(channel: string) {\n    if (WebSocketManagerService.isConnected()) {\n      const prefixedChannel = this.prefixChannel(channel, ChannelType.MESSAGE);\n      this.httpManagerService.unsubscribeFromChannel(prefixedChannel);\n      this.logger.debug('unsubscribeFromMessageChannel', `💬 Unsubscribed from message channel: ${prefixedChannel}`);\n    } else {\n      this.logger.warn('unsubscribeFromMessageChannel', 'Cannot unsubscribe from message channel: WebSocket not connected.');\n    }\n  }\n\n  // --------------------------------------------------------------------------------------------------\n  // CHANNEL MANAGEMENT (Raw channels - no automatic prefix)\n\n  /**\n   * Subscribe to a single channel (no automatic prefix)\n   * Use subscribeToMessageChannel() for MES- prefixed channels\n   */\n  subscribeToChannel(channel: string) {\n    if (WebSocketManagerService.isConnected()) {\n      // Get current user data to send with subscription\n      const currentUser = this.user.value;\n      this.logger.debug('subscribeToChannel', '👤 Subscribing with user:', currentUser)\n      this.httpManagerService.subscribeToChannel(channel, currentUser);\n    } else {\n      this.logger.warn('subscribeToChannel', 'Cannot subscribe: WebSocket not connected.');\n    }\n  }\n\n  /**\n   * Subscribe to multiple channels at once\n   */\n  subscribeToChannels(channels: string[]) {\n    if (WebSocketManagerService.isConnected()) {\n      // Get current user data to send with subscription\n      const currentUser = this.user.value;\n      this.logger.debug('subscribeToChannels', '👤 Subscribing to channels with user:', { count: channels.length, currentUser })\n      this.httpManagerService.subscribeToChannels(channels, currentUser);\n    } else {\n      this.logger.warn('subscribeToChannels', 'Cannot subscribe: WebSocket not connected.');\n    }\n  }\n\n  /**\n   * Unsubscribe from a channel\n   */\n  unsubscribeFromChannel(channel: string) {\n    if (WebSocketManagerService.isConnected()) {\n      this.httpManagerService.unsubscribeFromChannel(channel);\n    } else {\n      this.logger.warn('unsubscribeFromChannel', 'Cannot unsubscribe: WebSocket not connected.');\n    }\n  }\n\n  /**\n   * Get observable of currently subscribed channels\n   */\n  get subscribedChannels$(): Observable<Set<string>> {\n    return this.httpManagerService.subscribedChannels$;\n  }\n\n  /**\n   * Get current subscribed channels synchronously\n   */\n  getSubscribedChannels(): Set<string> {\n    return this.httpManagerService.getSubscribedChannels();\n  }\n\n  /**\n   * Create a new channel on the server\n   */\n  createChannel(channel: string) {\n    if (WebSocketManagerService.isConnected()) {\n      this.httpManagerService.createChannel(channel);\n    } else {\n      this.logger.warn('createChannel', 'Cannot create channel: WebSocket not connected.');\n    }\n  }\n\n  /**\n   * Delete a channel from the server\n   */\n  deleteChannel(channel: string) {\n    if (WebSocketManagerService.isConnected()) {\n      this.httpManagerService.deleteChannel(channel);\n    } else {\n      this.logger.warn('deleteChannel', 'Cannot delete channel: WebSocket not connected.');\n    }\n  }\n\n  /**\n   * Request list of all channels from server\n   */\n  getAllChannels() {\n    if (WebSocketManagerService.isConnected()) {\n      this.httpManagerService.getAllChannels();\n    } else {\n      this.logger.warn('getAllChannels', 'Cannot get channels: WebSocket not connected.');\n    }\n  }\n\n  /**\n   * Get users in a specific channel\n   */\n  getUsersInChannel(channel: string) {\n    if (WebSocketManagerService.isConnected()) {\n      this.httpManagerService.getUsersInChannel(channel);\n    } else {\n      this.logger.warn('getUsersInChannel', 'Cannot get users: WebSocket not connected.');\n    }\n  }\n\n  // --------------------------------------------------------------------------------------------------\n  // NOTIFICATION CHANNELS (MES- prefix - managed automatically)\n\n  /**\n   * Create a notification channel on the server\n   * @param channel - Base channel name (MES- prefix added automatically)\n   */\n  createNotificationChannel(channel: string) {\n    if (WebSocketManagerService.isConnected()) {\n      const prefixedChannel = this.prefixChannel(channel, ChannelType.NOTIFICATION);\n      this.httpManagerService.createNotificationChannel(prefixedChannel);\n      this.logger.debug('createNotificationChannel', `📢 Creating notification channel: ${prefixedChannel}`);\n    } else {\n      this.logger.warn('createNotificationChannel', 'Cannot create notification channel: WebSocket not connected.');\n    }\n  }\n\n  /**\n   * Request list of all notification channels from server (in-memory)\n   */\n  getNotificationChannels() {\n    if (WebSocketManagerService.isConnected()) {\n      this.httpManagerService.getNotificationChannels();\n    } else {\n      this.logger.warn('getNotificationChannels', 'Cannot get notification channels: WebSocket not connected.');\n    }\n  }\n\n  /**\n   * Request list of today's notification channels from database\n   * Returns unique channels that have notifications posted today\n   */\n  getTodaysNotificationChannels() {\n    if (WebSocketManagerService.isConnected()) {\n      this.httpManagerService.getTodaysNotificationChannels();\n    } else {\n      this.logger.warn('getTodaysNotificationChannels', 'Cannot get today\\'s notification channels: WebSocket not connected.');\n    }\n  }\n\n  /**\n   * Subscribe to a notification channel with optional date filters\n   * @param channel - Base channel name (MES- prefix added automatically)\n   */\n  subscribeToNotificationChannel(channel: string, options?: { startEpoch?: number; endEpoch?: number }, user?: any) {\n    if (WebSocketManagerService.isConnected()) {\n      const prefixedChannel = this.prefixChannel(channel, ChannelType.NOTIFICATION);\n      this.httpManagerService.subscribeToNotificationChannel(prefixedChannel, options, user);\n      this.logger.debug('subscribeToNotificationChannel', `📢 Subscribing to notification channel: ${prefixedChannel}`);\n    } else {\n      this.logger.warn('subscribeToNotificationChannel', 'Cannot subscribe to notification channel: WebSocket not connected.');\n    }\n  }\n\n  /**\n   * Unsubscribe from a notification channel\n   * @param channel - Base channel name (MES- prefix added automatically)\n   */\n  unsubscribeFromNotificationChannel(channel: string) {\n    if (WebSocketManagerService.isConnected()) {\n      const prefixedChannel = this.prefixChannel(channel, ChannelType.NOTIFICATION);\n      this.httpManagerService.unsubscribeFromNotificationChannel(prefixedChannel);\n      this.logger.debug('unsubscribeFromNotificationChannel', `📢 Unsubscribing from notification channel: ${prefixedChannel}`);\n    } else {\n      this.logger.warn('unsubscribeFromNotificationChannel', 'Cannot unsubscribe from notification channel: WebSocket not connected.');\n    }\n  }\n\n  /**\n   * Send a notification to a channel\n   * @param channel - Base channel name (MES- prefix added automatically)\n   */\n  sendNotification(channel: string, content: any) {\n    if (WebSocketManagerService.isConnected()) {\n      const prefixedChannel = this.prefixChannel(channel, ChannelType.NOTIFICATION);\n      this.httpManagerService.sendNotification(prefixedChannel, content);\n      this.logger.debug('sendNotification', `📢 Sending notification to channel: ${prefixedChannel}`);\n    } else {\n      this.logger.warn('sendNotification', 'Cannot send notification: WebSocket not connected.');\n    }\n  }\n\n  // --------------------------------------------------------------------------------------------------\n  // MISC\n\n  /**\n   * Clear/flush all records from the database table\n   * Does not clear localStorage metadata (expires info)\n   * Does not re-fetch from API - leaves state empty for manual refresh\n   */\n  clearDatabase() {\n\n    if (!this.hasDatabase || !this.databaseOptions?.table) return;\n\n    const tableName = this.databaseOptions.table;\n\n    // Reset localStorage tracking SYNCHRONOUSLY before the async DB clear so any\n    // concurrent request that fires during clearTable() sees a clean store immediately\n    // and is not blocked by stale queryParams from the previous session.\n    this.localStorageManagerService.updateStore({\n      name: tableName,\n      data: { ...this.databaseOptions, expires: 0 }\n    });\n    this._requestCachePaths.delete(tableName);\n    this.clearRequestCacheMetadata(tableName);\n    this.clearSessionFlag();\n\n    this.dbManagerService.clearTable(tableName).subscribe({\n      next: () => {\n        if (this.dataType === DataType.ARRAY) {\n          this.setData$([]);\n        } else {\n          this.setData$({});\n        }\n      },\n      error: (err) => {\n        this.logger.error('clearDatabase', `❌ Error clearing table ${tableName}:`, err);\n      }\n    });\n  }\n\n  private isEmpty(obj: any) {\n    return Object.keys(obj).length === 0\n  }\n\n  // Unwraps a GET-list response envelope. Some backends paginate under `.results`; others (e.g.\n  // api-test-server's GET /items) wrap the plain array under `.data` instead — try both before\n  // falling back to the payload unchanged, which is what an already-bare single-record response\n  // (POST/PUT/single GET) needs anyway. Kept separate from RequestService's `selector` option:\n  // that applies to every request type uniformly via the shared apiOptions, so setting it here\n  // would also strip single-record responses that aren't wrapped at all.\n  private extractListPayload(data: any): any {\n    if (data?.results && Array.isArray(data.results)) return data.results\n    if (data?.data && Array.isArray(data.data)) return data.data\n    return data\n  }\n\n  private applyAdapter(data: any): any {\n    if (!data || !this.apiOptions?.adapter) return data\n\n    if (Array.isArray(data)) {\n      if (data.length === 0) return data\n      return data.map((item: any) => this.apiOptions.adapter!(item))\n    }\n\n    return this.apiOptions.adapter!(data)\n  }\n\n  private getSessionStoreName(tableName: string): string {\n    return `${tableName}-init-session`\n  }\n\n  private initSessionFlag(tableName: string): void {\n    const storeName = this.getSessionStoreName(tableName)\n    this.localStorageManagerService.createStore({\n      name: storeName,\n      data: { hasInitialFetch: false },\n      options: SettingOptions.adapt({\n        storage: StorageType.SESSION,\n        encrypted: false,\n      })\n    })\n    const storeData = this.localStorageManagerService.store(storeName)()\n    this.hasInitialFetch = !!(storeData?.hasInitialFetch)\n  }\n\n  // Starts (or restarts) the reconciliation interval per DatabaseStorage.reconcile/\n  // reconcileIntervalMs. Re-created rather than appended each call since\n  // setApiRequestOptions() can run more than once per instance (e.g. the WS demo calling\n  // updateConnection() again on a jwtToken change) — without tearing down the previous\n  // interval first, each call would leave yet another one running.\n  private setupReconciliation(): void {\n    this.reconcileIntervalSubscription?.unsubscribe()\n    this.reconcileIntervalSubscription = undefined\n\n    if (!this.databaseOptions?.reconcile) return\n\n    this.reconcileIntervalSubscription = interval(this.databaseOptions.reconcileIntervalMs).subscribe(() => this.reconcile())\n  }\n\n  private persistInitialFetch(value: boolean): void {\n    if (!this.databaseOptions?.table) return\n    const storeName = this.getSessionStoreName(this.databaseOptions.table)\n    const storeData = this.localStorageManagerService.store(storeName)()\n    this.localStorageManagerService.updateStore({\n      name: storeName,\n      data: { ...(storeData || {}), hasInitialFetch: value }\n    })\n  }\n\n  private clearSessionFlag(): void {\n    if (!this.databaseOptions?.table) return\n    this.hasInitialFetch = false\n    const storeName = this.getSessionStoreName(this.databaseOptions.table)\n    this.localStorageManagerService.updateStore({\n      name: storeName,\n      data: { hasInitialFetch: false }\n    })\n  }\n\n  /**\n   * Update request options with provided headers\n   */\n  private updateRequestOptions(headers?: any, selector?: string): ApiRequest {\n\n    const options = ApiRequest.adapt({ ...this.apiOptions })\n\n    options.headers = (headers)\n          ? { ...options.headers, ...headers }\n          : { ...options.headers }\n\n    // Per-request selector override — falls back to the instance-wide default (this.apiOptions.selector,\n    // already carried over via the spread above) when the caller doesn't pass one. See\n    // http-request-manager-http-manager spec: \"A selector can be set once for all requests and\n    // overridden per request.\"\n    if (typeof selector !== 'undefined') options.selector = selector\n\n    return options\n  }\n\n  private normalizeObject(value: any): any {\n    if (Array.isArray(value)) {\n      return value.map((item) => this.normalizeObject(item))\n    }\n\n    if (value && typeof value === 'object') {\n      return Object.keys(value)\n        .sort()\n        .reduce((acc: any, key: string) => {\n          acc[key] = this.normalizeObject(value[key])\n          return acc\n        }, {})\n    }\n\n    return value\n  }\n\n  private filterHeaders(headers?: any): Record<string, any> {\n    const source = headers || {}\n    return Object.keys(source).reduce((acc: Record<string, any>, key: string) => {\n      if (!this.volatileHeaders.has(key.toLowerCase())) {\n        acc[key] = source[key]\n      }\n      return acc\n    }, {})\n  }\n\n  private resolvePath(params?: any[]): any[] {\n    const basePath = Array.isArray(this.apiOptions.path) ? this.apiOptions.path : []\n    const effective = this.getEffectiveParams(params)\n    return effective ? [...basePath, ...effective] : [...basePath]\n  }\n\n  private stripBasePathPrefix(params: any[]): any[] {\n    const basePath = Array.isArray(this.apiOptions.path) ? this.apiOptions.path : []\n\n    if (basePath.length === 0 || params.length < basePath.length) {\n      return params\n    }\n\n    const normalizePart = (value: any): string => {\n      if (value && typeof value === 'object') {\n        return JSON.stringify(this.normalizeObject(value))\n      }\n      return String(value)\n    }\n\n    const startsWithBase = basePath.every((part, index) => normalizePart(part) === normalizePart(params[index]))\n    return startsWithBase ? params.slice(basePath.length) : params\n  }\n\n  private getEffectiveParams(params?: any[]): any[] | undefined {\n    if (!Array.isArray(params) || params.length === 0) {\n      return undefined\n    }\n\n    const basePath = Array.isArray(this.apiOptions.path) ? this.apiOptions.path : []\n\n    if (basePath.length === params.length) {\n      const normalizePart = (value: any): string => {\n        if (value && typeof value === 'object') {\n          return JSON.stringify(this.normalizeObject(value))\n        }\n        return String(value)\n      }\n\n      const samePath = params.every((part, index) => normalizePart(part) === normalizePart(basePath[index]))\n      return samePath ? undefined : params\n    }\n\n    return this.stripBasePathPrefix(params)\n  }\n\n  private buildRequestSignature(method: 'GET'|'STREAM', requestOptions: ApiRequest, params?: any[]): string {\n    const signaturePayload = {\n      method,\n      server: requestOptions.server,\n      path: this.resolvePath(params),\n      headers: this.filterHeaders(requestOptions.headers),\n      stream: !!requestOptions.stream,\n      streamType: requestOptions.streamType || null\n    }\n\n    return JSON.stringify(this.normalizeObject(signaturePayload))\n  }\n\n  private buildSchemaSignature(schema: string): string {\n    return JSON.stringify(this.normalizeObject(schema.split(',').map((part) => part.trim()).filter(Boolean)))\n  }\n\n  private setCachedRequestSignature(tableName: string, type: 'GET'|'STREAM', signature: string): void {\n    const existing = this.requestSignatureCache[tableName] || {}\n    this.requestSignatureCache[tableName] = {\n      ...existing,\n      [type]: signature,\n    }\n  }\n\n  private tryBeginInFlightRequest(signature: string): boolean {\n    if (this.inFlightRequestSignatures.has(signature)) {\n      return false\n    }\n    this.inFlightRequestSignatures.add(signature)\n    return true\n  }\n\n  private endInFlightRequest(signature: string): void {\n    this.inFlightRequestSignatures.delete(signature)\n  }\n\n  private getRequestCacheMetadata(storeData: any, type: 'GET'|'STREAM'): any {\n    return storeData?.requestCache?.[type] || null\n  }\n\n  private getStoredSchemaSignature(storeData: any): string | null {\n    return storeData?.schemaSignature || null\n  }\n\n  private saveSchemaSignature(tableName: string, schemaSignature: string) {\n    const storeData = this.localStorageManagerService.store(tableName)()\n    this.localStorageManagerService.updateStore({\n      name: tableName,\n      data: {\n        ...(storeData || {}),\n        schemaSignature,\n      }\n    })\n  }\n\n  private saveRequestCacheMetadata(tableName: string, type: 'GET'|'STREAM', signature: string, schemaSignature?: string, options?: RequestOptions) {\n    this.setCachedRequestSignature(tableName, type, signature)\n    this._requestCachePaths.set(tableName, this.resolvePath(options?.path).filter(p => typeof p === 'string' || typeof p === 'number').map(String))\n\n    {\n      const storeData = this.localStorageManagerService.store(tableName)()\n        const currentCache = storeData?.requestCache || {}\n        const currentEntry = currentCache[type] || {}\n        const currentQueryParams: Record<string, string[]> = { ...(currentEntry.queryParams || {}) }\n        const currentQueryCombinations: string[] = [...(currentEntry.queryCombinations || [])]\n        const currentQueryParamsExpires: number | null = currentEntry.queryParamsExpires ?? null\n\n        // Extract query params from options?.path and build combination string\n        const resolvedPath = this.resolvePath(options?.path)\n        const extractedParams: Record<string, string> = {}\n        const ignoreQueryParams = Array.isArray(options?.ignoreQueryParams) ? options!.ignoreQueryParams : []\n\n        if (Array.isArray(resolvedPath)) {\n          const normalizedIgnore = ignoreQueryParams.map(p => this.trackerNormalizeParamKey(p))\n\n          resolvedPath.forEach((pathPart: any) => {\n            // Extract query params from objects in the path array\n            if (pathPart && typeof pathPart === 'object' && !Array.isArray(pathPart)) {\n              Object.keys(pathPart).forEach((key: string) => {\n                const normalizedKey = this.trackerNormalizeParamKey(key)\n                const value = String(pathPart[key])\n\n                // Only add to queryParams if NOT in ignoreQueryParams\n                if (!normalizedIgnore.includes(normalizedKey)) {\n                  if (!currentQueryParams[key]) {\n                    currentQueryParams[key] = []\n                  }\n                  if (!currentQueryParams[key].includes(value)) {\n                    currentQueryParams[key].push(value)\n                  }\n\n                  // Track extracted param for combination string\n                  extractedParams[normalizedKey] = value\n                }\n              })\n            } else if (typeof pathPart === 'string') {\n              // Parse URL query strings like 'items?active=true&location=6'\n              const normalized = this.trackerNormalizePath([pathPart])\n              if (normalized.hasQuery) {\n                const filtered = this.trackerFilterQuery(normalized.query, ignoreQueryParams)\n                Object.assign(extractedParams, filtered)\n\n                // Add filtered params to queryParams\n                Object.keys(filtered).forEach((key: string) => {\n                  if (!currentQueryParams[key]) {\n                    currentQueryParams[key] = []\n                  }\n                  if (!currentQueryParams[key].includes(filtered[key])) {\n                    currentQueryParams[key].push(filtered[key])\n                  }\n                })\n              }\n            }\n          })\n        }\n\n        // Build combination string if we have extracted params\n        let combinationString = ''\n        if (Object.keys(extractedParams).length > 0) {\n          const keys = Object.keys(extractedParams).sort()\n          combinationString = keys.map((k) => `${k}=${extractedParams[k]}`).join('&')\n          if (!currentQueryCombinations.includes(combinationString)) {\n            currentQueryCombinations.push(combinationString)\n          }\n        }\n\n        // Maintain a per-query-combination savedAt map so each dataset (e.g. active=true\n        // vs active=false) keeps its OWN delta cursor. Switching between previously-used\n        // combos reuses their cursor for a delta fetch instead of full-fetching; a brand\n        // new combo gets a fresh full fetch.\n        const savedAtByQuery = { ...(currentEntry.savedAtByQuery || {}) }\n        savedAtByQuery[combinationString] = Date.now()\n\n        this.localStorageManagerService.updateStore({\n          name: tableName,\n          data: {\n            ...(storeData || {}),\n            requestCache: {\n              ...currentCache,\n              [type]: {\n                ...currentEntry,\n                signature,\n                savedAt: Date.now(),\n                savedAtByQuery,\n                // Back-compat: keep the last combo the single savedAtQuery points at.\n                savedAtQuery: combinationString,\n                path: resolvedPath,\n                headers: this.filterHeaders(options?.headers),\n                queryCombinations: currentQueryCombinations,\n                queryParams: currentQueryParams,\n                queryParamsExpires: currentQueryParamsExpires,\n              }\n            }\n          }\n        })\n    }\n  }\n\n  private clearRequestCacheMetadata(tableName: string) {\n    this.clearRequestCacheMetadataAsync(tableName).subscribe()\n  }\n\n  private clearRequestCacheMetadataAsync(tableName: string): Observable<any> {\n    const storeData = this.localStorageManagerService.store(tableName)()\n    let pathArray = this._requestCachePaths.get(tableName)\n    if (!Array.isArray(pathArray) || pathArray.length === 0) {\n      const requestCache = storeData?.requestCache\n      if (requestCache) {\n        const cached = requestCache['GET'] || requestCache['STREAM']\n        if (Array.isArray(cached?.path) && cached.path.length > 0) {\n          pathArray = cached.path.filter((p: any) => typeof p === 'string' || typeof p === 'number').map(String)\n        }\n      }\n    }\n    if (Array.isArray(pathArray) && pathArray.length > 0) {\n      this._requestCachePaths.delete(tableName)\n    }\n    if (!storeData) return of(storeData)\n    const updated = { ...(storeData || {}) }\n    delete updated.requestCache\n    delete updated.tracker\n    this.localStorageManagerService.updateStore({\n      name: tableName,\n      data: updated,\n      preserveRequestCache: false\n    })\n    return of(storeData)\n  }\n\n  private trackerNormalizePath(path: any[]): { pathKey: string; query: Record<string, string>; queryString: string; hasQuery: boolean } {\n    const pathSegments: string[] = []\n    const query: Record<string, string> = {}\n    path.forEach((segment) => {\n      if (segment && typeof segment === 'object' && !Array.isArray(segment)) {\n        Object.keys(segment).forEach((key) => {\n          query[this.trackerNormalizeParamKey(key)] = this.trackerNormalizeParamValue(segment[key])\n        })\n      } else {\n        const parsed = this.trackerParsePathSegment(String(segment))\n        pathSegments.push(parsed.pathSegment)\n        Object.keys(parsed.queryObject).forEach((key) => {\n          query[this.trackerNormalizeParamKey(key)] = this.trackerNormalizeParamValue(parsed.queryObject[key])\n        })\n      }\n    })\n    const sortedKeys = Object.keys(query).sort()\n    const queryString = sortedKeys.map((k) => `${k}=${query[k]}`).join('&')\n    return {\n      pathKey: this.trackerNormalizePathSegments(pathSegments),\n      query,\n      queryString,\n      hasQuery: sortedKeys.length > 0,\n    }\n  }\n\n  private trackerParsePathSegment(rawSegment: string): { pathSegment: string; queryObject: Record<string, any> } {\n    const [pathPart, ...queryParts] = String(rawSegment).split('?')\n    const queryString = queryParts.join('?')\n    const queryObject: Record<string, any> = {}\n    if (queryString) {\n      queryString.split('&').forEach((pair) => {\n        if (!pair) return\n        const [rawKey, ...rawValueParts] = pair.split('=')\n        const key = this.trackerSafeDecode(rawKey).trim()\n        const value = this.trackerSafeDecode(rawValueParts.join('=')).trim()\n        if (!key) return\n        queryObject[key] = value\n      })\n    }\n    return { pathSegment: pathPart, queryObject }\n  }\n\n  private trackerSafeDecode(value: string | undefined): string {\n    if (typeof value === 'undefined') return ''\n    try { return decodeURIComponent(value) } catch { return String(value) }\n  }\n\n  private trackerNormalizePathSegments(pathSegments: string[]): string {\n    return pathSegments\n      .map((segment) => String(segment).trim())\n      .filter((segment) => segment.length > 0)\n      .join('/')\n      .replace(/([^:]\\/+)\\/+/g, '$1')\n      .replace(/^\\//, '')\n      .replace(/\\/$/, '')\n  }\n\n  private trackerNormalizeParamKey(key: string): string {\n    return String(key).trim().toLowerCase()\n  }\n\n  private trackerNormalizeParamValue(value: any): string {\n    if (Array.isArray(value)) {\n      return value.map((item) => this.trackerNormalizeParamValue(item)).join(',')\n    }\n    if (Object.prototype.toString.call(value) === '[object Object]') {\n      return JSON.stringify(\n        Object.keys(value).sort().reduce((acc: any, k) => {\n          acc[this.trackerNormalizeParamKey(k)] = this.trackerNormalizeParamValue(value[k])\n          return acc\n        }, {})\n      )\n    }\n    return String(value).trim().toLowerCase()\n  }\n\n  private trackerFilterQuery(query: Record<string, string>, ignoreQueryParams?: string[]): Record<string, string> {\n    if (!Array.isArray(ignoreQueryParams) || ignoreQueryParams.length === 0) return { ...query }\n    const normalizedIgnore = ignoreQueryParams.map(p => this.trackerNormalizeParamKey(p))\n    const result: Record<string, string> = {}\n    Object.keys(query).forEach((key) => {\n      if (!normalizedIgnore.includes(key)) {\n        result[key] = query[key]\n      }\n    })\n    return result\n  }\n\n\n\n  private checkTrackerAllowsRequest(tableName: string, type: 'GET'|'STREAM', path: any[], options: RequestOptions | undefined, storeData: any): Observable<boolean> {\n    const normalized = this.trackerNormalizePath(path)\n    const ignoreQueryParams = Array.isArray(options?.ignoreQueryParams) ? options!.ignoreQueryParams : []\n\n    if (!normalized.hasQuery) {\n      const meta = this.getRequestCacheMetadata(storeData, type)\n      return of(!meta)\n    }\n\n    const filtered = this.trackerFilterQuery(normalized.query, ignoreQueryParams)\n    const keys = Object.keys(filtered)\n\n    if (keys.length === 0) {\n      return of(!this.getRequestCacheMetadata(storeData, type))\n    }\n\n    const meta = this.getRequestCacheMetadata(storeData, type) || {}\n    const now = Math.floor(Date.now() / 1000)\n\n    // Build the combination string from the filtered query (deterministic because keys are sorted)\n    const combinationString = keys.sort().map((k) => `${k}=${filtered[k]}`).join('&')\n\n    // Legacy per-key queryParams for backward compatibility (read-only)\n    const queryParams: Record<string, string[]> = { ...(meta.queryParams || {}) }\n    const queryParamsExpires: number | null = meta.queryParamsExpires ?? null\n\n    // New combination-based tracking\n    const queryCombinations: string[] = [...(meta.queryCombinations || [])]\n\n    // Reset combinations if the request path has changed (different endpoint)\n    // Use trackerNormalizePath so inline query strings (e.g. 'items?a=1') are stripped\n    // before comparing, matching the same normalization applied to the current request.\n    const storedPathKey = meta.path\n      ? this.trackerNormalizePath(\n          meta.path.filter((p: any) => typeof p === 'string' || typeof p === 'number').map(String)\n        ).pathKey\n      : null\n    const pathChanged = storedPathKey && storedPathKey !== normalized.pathKey\n    const isExpired = queryParamsExpires !== null && queryParamsExpires <= now\n    const shouldReset = pathChanged || isExpired\n\n    // Determine if request is accepted (not yet tracked)\n    // Use combination-based tracking when available; fall back to legacy per-key tracking\n    const accepted = shouldReset\n      ? true\n      : queryCombinations.length > 0\n        ? !queryCombinations.includes(combinationString)\n        : Object.keys(queryParams).length > 0\n          ? !keys.every((key) => (queryParams[key] || []).includes(filtered[key]))\n          : true\n\n    // Compute updated values immutably\n    const updatedQueryCombinations = accepted\n      ? [...queryCombinations, combinationString]\n      : queryCombinations\n\n    const updatedQueryParams = accepted\n      ? keys.reduce((acc: Record<string, string[]>, key) => {\n          const value = filtered[key]\n          const consumed = acc[key] || []\n          if (!consumed.includes(value)) {\n            acc[key] = [...consumed, value]\n          }\n          return acc\n        }, { ...queryParams })\n      : { ...queryParams }\n\n    const updatedQueryParamsExpires = this.utils.expires(options?.queryParamsExpiresIn as string) ?? queryParamsExpires\n\n    // Apply reset if path changed or expired\n    const finalQueryCombinations = shouldReset ? updatedQueryCombinations : queryCombinations\n    const finalQueryParams = shouldReset ? updatedQueryParams : queryParams\n    const finalQueryParamsExpires = shouldReset ? updatedQueryParamsExpires : updatedQueryParamsExpires\n\n    if (accepted || updatedQueryParamsExpires !== queryParamsExpires) {\n      const latestStoreData = this.localStorageManagerService.store(tableName)()\n      const currentCache = latestStoreData?.requestCache || {}\n      const currentEntry = currentCache[type] || {}\n      this.localStorageManagerService.updateStore({\n        name: tableName,\n        data: {\n          ...(latestStoreData || {}),\n          requestCache: {\n            ...currentCache,\n            [type]: {\n              ...currentEntry,\n              queryCombinations: finalQueryCombinations,\n              queryParams: finalQueryParams,\n              queryParamsExpires: finalQueryParamsExpires,\n            }\n          }\n        }\n      })\n    }\n\n    return of(accepted)\n  }\n\n}\n","import { Injectable, inject } from '@angular/core';\nimport { WebSocketManagerService } from '../connection/websocket-manager.service';\nimport { ChannelType } from '../models/channel-type.enum';\nimport { StateMessage } from '../models/state-message.model';\nimport { PublicMessage } from '../models/public-message.model';\nimport { NotificationMessage } from '../models/notification-message.model';\nimport { LoggerService } from '../../utils/logger.service';\n\n/**\n * WebSocketMessageService - Unified service for sending WebSocket messages\n *\n * Provides type-safe methods for sending messages with automatic prefix management.\n * Supports three message types: State (SYS-), Public (PUB-), and Notification (MES-).\n *\n * Features:\n * - Type-safe message models\n * - Automatic prefix management\n * - Runtime validation\n * - Boolean return values for success/failure\n * - Silent failure with console errors\n */\n@Injectable({ providedIn: 'root' })\nexport class WebSocketMessageService {\n  private wsManagerService = inject(WebSocketManagerService);\n  private logger = new LoggerService();\n\n  /**\n   * Send state message (SYS- prefix)\n   * Used for CRUD operations and state synchronization\n   *\n   * @param path - Path array (e.g., ['ai', 'tests'])\n   * @param payload - StateMessage with sessionId and content\n   * @returns true if sent successfully, false otherwise\n   */\n  sendStateMessage(path: (string | number)[], payload: StateMessage): boolean {\n    // Validate payload\n    if (!payload?.sessionId?.id) {\n      this.logger.error('WebSocketMessageService', 'StateMessage must have sessionId.id');\n      return false;\n    }\n\n    if (!WebSocketManagerService.isConnected()) {\n      this.logger.error('WebSocketMessageService', 'Cannot send state message - not connected');\n      return false;\n    }\n\n    const channel = `${ChannelType.STATE}-${path.join('/')}`;\n    // Send flat payload to avoid double-nesting:\n    // sendMessageInChannel wraps content in { type, subscribedChannel, content },\n    // so we pass { method, path, user } directly instead of the full StateMessage\n    this.wsManagerService.sendMessageInChannel(channel, {\n      ...payload.content,\n      user: payload.sessionId\n    });\n    return true;\n  }\n\n  /**\n   * Send public message (PUB- prefix)\n   * Used for chat, broadcast, general messaging\n   *\n   * @param channel - Channel name (without prefix)\n   * @param payload - PublicMessage with sessionId and content.message\n   * @returns true if sent successfully, false otherwise\n   */\n  sendPublicMessage(channel: string, payload: PublicMessage): boolean {\n    // Validate payload\n    if (!payload?.sessionId?.id) {\n      this.logger.error('WebSocketMessageService', 'PublicMessage must have sessionId.id');\n      return false;\n    }\n\n    if (!payload?.content?.message) {\n      this.logger.error('WebSocketMessageService', 'PublicMessage must have content.message');\n      return false;\n    }\n\n    if (!WebSocketManagerService.isConnected()) {\n      this.logger.error('WebSocketMessageService', 'Cannot send public message - not connected');\n      return false;\n    }\n\n    const fullChannel = `${ChannelType.PUBLIC}-${channel}`;\n    this.wsManagerService.sendMessageInChannel(fullChannel, payload);\n    return true;\n  }\n\n  /**\n   * Send notification (MES- prefix)\n   * Used for persistent notifications with history\n   *\n   * @param channel - Channel name (without prefix)\n   * @param payload - NotificationMessage with sessionId and message\n   * @returns true if sent successfully, false otherwise\n   */\n  sendNotification(channel: string, payload: NotificationMessage): boolean {\n    // Validate payload\n    if (!payload?.sessionId?.id) {\n      this.logger.error('WebSocketMessageService', 'NotificationMessage must have sessionId.id');\n      return false;\n    }\n\n    if (!payload?.message) {\n      this.logger.error('WebSocketMessageService', 'NotificationMessage must have message');\n      return false;\n    }\n\n    if (!WebSocketManagerService.isConnected()) {\n      this.logger.error('WebSocketMessageService', 'Cannot send notification - not connected');\n      return false;\n    }\n\n    const fullChannel = `${ChannelType.NOTIFICATION}-${channel}`;\n    this.wsManagerService.sendMessageInChannel(fullChannel, payload);\n    return true;\n  }\n\n  /**\n   * Send to custom channel (no prefix)\n   * User provides full channel name\n   *\n   * @param channel - Full channel name\n   * @param payload - Any message payload\n   * @returns true if sent successfully, false otherwise\n   */\n  sendToCustomChannel(channel: string, payload: any): boolean {\n    if (!WebSocketManagerService.isConnected()) {\n      this.logger.error('WebSocketMessageService', 'Cannot send custom message - not connected');\n      return false;\n    }\n\n    this.wsManagerService.sendMessageInChannel(channel, payload);\n    return true;\n  }\n}\n","\nexport * from \"./models/index\";\nexport * from \"./connection/index\";\n\nexport { WebSocketMessageService } from \"./messaging/websocket-message.service\";\nexport { StateMessage, StateMessageInterface } from \"./models/state-message.model\";\nexport { PublicMessage, PublicMessageInterface } from \"./models/public-message.model\";\nexport { NotificationMessage, NotificationMessageInterface } from \"./models/notification-message.model\";\n// ChannelType is already exported from request-manager-state-service to avoid conflicts\n\n","import { SettingOptions } from \"../../local-storage-manager-service\";\n\nexport interface StateStorageOptionsInterface {\n  store?: string;\n  options?: SettingOptions;\n  model?: (state: any) => any;\n}\n\nexport class StateStorageOptions implements StateStorageOptionsInterface {\n\n  constructor(\n    public store?: string,\n    public options?: SettingOptions,\n    public model?: (state: any) => any\n  ) {}\n\n  static adapt(item?: any): StateStorageOptions {\n    return new StateStorageOptions(\n      item?.store ?? 'temp',\n      item?.options ? SettingOptions.adapt(item.options) : SettingOptions.adapt(),\n      item?.model\n    );\n  }\n}\n","export interface StateOperationResultInterface {\n  success: boolean;\n  operation: 'CREATE' | 'UPDATE' | 'DELETE';\n  key?: string;\n  value?: any;\n  timestamp: number;\n  error?: string;\n}\n\nexport class StateOperationResult implements StateOperationResultInterface {\n  constructor(\n    public success: boolean = false,\n    public operation: 'CREATE' | 'UPDATE' | 'DELETE' = 'UPDATE',\n    public key?: string,\n    public value?: any,\n    public timestamp: number = Date.now(),\n    public error?: string,\n  ) {}\n\n  static adapt(item?: any): StateOperationResult {\n    return new StateOperationResult(\n      item?.success ?? false,\n      item?.operation || 'UPDATE',\n      item?.key,\n      item?.value,\n      item?.timestamp || Date.now(),\n      item?.error,\n    );\n  }\n}\n","import { Injectable, inject, Injector, Signal, WritableSignal, computed, effect, signal } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\n\nimport { LocalStorageManagerService } from '../local-storage-manager-service/local-storage-manager.service';\nimport { SettingOptions } from '../local-storage-manager-service';\nimport { StateStorageOptions } from './models/state-storage-options.model';\nimport { StateOperationResult } from './models/state-operation-result.model';\n\nexport interface StateStoreManagerData<T> {}\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class StoreStateManagerService<T extends object = StateStoreManagerData<any>> {\n\n  private readonly localStorageManagerService = inject(LocalStorageManagerService)\n  private readonly injector = inject(Injector)\n  private readonly settings: StateStorageOptions\n\n  private isRestoring = false\n\n  private readonly stateSignal: WritableSignal<T> = signal({} as T)\n  private readonly operationResultSignal: WritableSignal<StateOperationResult | null> = signal(null)\n\n  // Pinged synchronously by every mutation. The $-observables below read off this\n  // instead of an effect() on the signals, because effects coalesce rapid synchronous\n  // writes into one async flush — a caller doing several mutating calls in a row\n  // would only ever see the last one. This ping fires once per mutation.\n  private readonly stateChanged$ = new Subject<void>()\n\n  // --- SIGNAL SURFACE ---\n\n  /** Untransformed state, exactly as held internally. */\n  readonly rawData: Signal<T> = this.stateSignal.asReadonly()\n\n  /**\n   * State passed through the store's configured model. A model is free to ignore its\n   * argument (as `StoreStateSignalsDemoComponent`'s does) — in that case this stays\n   * fixed at the model's default even as `rawData` changes; use `rawData` for a value\n   * that always reflects the latest state.\n   */\n  readonly data: Signal<any> = computed(() => {\n    const state = this.stateSignal()\n    const model = this.settings.model\n    return (typeof model === 'function' && !(model as any).prototype) ? model(state) : state\n  })\n\n  readonly operationResult: Signal<StateOperationResult | null> = this.operationResultSignal.asReadonly()\n\n  // --- OBSERVABLE SURFACE (derived from the signals above) ---\n  //\n  // Not toObservable(): see stateChanged$ above for why.\n\n  private toSyncObservable<V>(sig: Signal<V>): Observable<V> {\n    return new Observable<V>(subscriber => {\n      let last = sig()\n      subscriber.next(last)\n\n      const sub = this.stateChanged$.subscribe(() => {\n        const value = sig()\n        if (!Object.is(value, last)) {\n          last = value\n          subscriber.next(value)\n        }\n      })\n\n      return () => sub.unsubscribe()\n    })\n  }\n\n  readonly rawData$: Observable<T> = this.toSyncObservable(this.rawData)\n  readonly data$: Observable<any> = this.toSyncObservable(this.data)\n  readonly operationResult$: Observable<StateOperationResult | null> = this.toSyncObservable(this.operationResult)\n\n  constructor(\n    options: StateStorageOptions = StateStorageOptions.adapt()\n  ) {\n\n    this.settings = options\n    const storeName = options.store ?? 'temp'\n\n    this.localStorageManagerService.createStore({\n      name: storeName,\n      data: options.model ? options.model({}) : {},\n      options: options.options ?? SettingOptions.adapt(),\n    })\n\n    this.stateSignal.set((options.model ? options.model({}) : {}) as T)\n    this.stateChanged$.next()\n\n    effect(() => {\n      const storeData = this.localStorageManagerService.store(storeName)()\n      if (storeData && !this.isRestoring) {\n        this.stateSignal.set(storeData as T)\n        this.stateChanged$.next()\n      }\n    }, { injector: this.injector })\n\n  }\n\n  restoreState() {\n\n    const storeName = this.settings.store ?? 'temp'\n    this.isRestoring = true\n\n    const storeData = this.localStorageManagerService.store(storeName)()\n    if (storeData) {\n      this.updateData(storeData as Partial<T>)\n    }\n\n    this.isRestoring = false\n\n  }\n\n  updateState(state: Partial<T>) {\n\n    // State mutation always applies — only the write-back below is suppressed while\n    // restoring. restoreState() relies on this: it applies the restored value via\n    // updateData() -> updateState() while isRestoring is true, and that value must\n    // actually land in state even though it must NOT be written back to storage.\n    this.stateSignal.update(current => ({ ...current, ...state } as T))\n    this.stateChanged$.next()\n\n    if (this.isRestoring) return\n    const storeName = this.settings.store ?? 'temp'\n\n    this.localStorageManagerService.updateStore({\n      name: storeName,\n      data: this.stateSignal()\n    })\n\n  }\n\n  updateData(data: Partial<T>) {\n\n    const key = Object.keys(data)[0]\n    const currentState = this.stateSignal()\n    const hasKey = Object.keys(currentState).includes(key)\n\n    if (!hasKey) return\n\n    const newState = { ...currentState, [key]: data[key as keyof T] } as T\n    this.updateState(newState)\n\n  }\n\n  createRecord(key: string, value: any) {\n    try {\n      this.updateData({ [key]: value } as Partial<T>)\n      this.operationResultSignal.set(StateOperationResult.adapt({\n        success: true,\n        operation: 'CREATE',\n        key,\n        value,\n      }))\n    } catch (error: any) {\n      this.operationResultSignal.set(StateOperationResult.adapt({\n        success: false,\n        operation: 'CREATE',\n        key,\n        error: error?.message || 'Create failed',\n      }))\n    }\n    this.stateChanged$.next()\n  }\n\n  updateRecord(key: string, value: any) {\n    try {\n      this.updateData({ [key]: value } as Partial<T>)\n      this.operationResultSignal.set(StateOperationResult.adapt({\n        success: true,\n        operation: 'UPDATE',\n        key,\n        value,\n      }))\n    } catch (error: any) {\n      this.operationResultSignal.set(StateOperationResult.adapt({\n        success: false,\n        operation: 'UPDATE',\n        key,\n        error: error?.message || 'Update failed',\n      }))\n    }\n    this.stateChanged$.next()\n  }\n\n  deleteRecord(key: string) {\n    try {\n      const currentState = this.stateSignal()\n      if (currentState && key in currentState) {\n        const { [key]: removed, ...rest } = currentState as any\n        this.stateSignal.set(rest as T)\n        this.updateState(rest as Partial<T>)\n      }\n      this.operationResultSignal.set(StateOperationResult.adapt({\n        success: true,\n        operation: 'DELETE',\n        key,\n      }))\n    } catch (error: any) {\n      this.operationResultSignal.set(StateOperationResult.adapt({\n        success: false,\n        operation: 'DELETE',\n        key,\n        error: error?.message || 'Delete failed',\n      }))\n    }\n    this.stateChanged$.next()\n  }\n\n  resetState() {\n    const storeName = this.settings.store ?? 'temp'\n    const initialState = (this.settings.model ? this.settings.model({}) : {}) as T\n    this.stateSignal.set(initialState)\n    this.stateChanged$.next()\n    this.localStorageManagerService.updateStore({\n      name: storeName,\n      data: initialState\n    })\n  }\n\n}\n","export class SqlParseError extends Error {\n  override name = 'SqlParseError';\n  constructor(message: string) {\n    super(message);\n  }\n}\n\nexport class SqlValidationError extends Error {\n  override name = 'SqlValidationError';\n  constructor(message: string) {\n    super(message);\n  }\n}\n","import { Parser, TableColumnAst, AST } from 'node-sql-parser';\nimport { SqlParseError } from '../models/sql-errors.model';\n\nexport interface ParseResult {\n  ast:        AST;\n  tableList:  string[];\n  columnList: string[];\n}\n\nexport class SqlParser {\n  private readonly _parser = new Parser();\n\n  parse(sql: string): ParseResult {\n    let result: TableColumnAst;\n    try {\n      result = this._parser.parse(sql);\n    } catch (e: any) {\n      throw new SqlParseError(e.message ?? 'Failed to parse SQL');\n    }\n\n    const ast = Array.isArray(result.ast) ? result.ast[0] : result.ast;\n    if (!ast) {\n      throw new SqlParseError('SQL produced no AST — only SELECT statements are supported');\n    }\n    if ((ast as any).type !== 'select') {\n      throw new SqlParseError('Only SELECT statements are supported');\n    }\n\n    const stripPrefix = (list: string[]): string[] =>\n      list.map(entry => entry.split('::').pop() ?? entry);\n\n    return {\n      ast,\n      tableList:  stripPrefix(result.tableList  ?? []),\n      columnList: stripPrefix(result.columnList ?? []),\n    };\n  }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { DatabaseManagerService } from '../../database-manager-service/database.manager.service';\nimport { DexieSqlOptions } from '../models/sql-options.model';\nimport { SqlValidationError } from '../models/sql-errors.model';\nimport { ParseResult } from './sql-parser';\n\nexport interface TableSchemaInfo {\n  pk:               string;\n  simpleIndexes:    string[];\n  compoundIndexes:  string[][];\n}\n\nexport interface ValidatedQuery {\n  ast:     any;\n  schemas: Record<string, TableSchemaInfo>;\n  aliases: Record<string, string>;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class SchemaValidator {\n  private readonly _dbManager = inject(DatabaseManagerService);\n\n  async validate(parsed: ParseResult, options: DexieSqlOptions = {}): Promise<ValidatedQuery> {\n    const { ast } = parsed;\n    const fromItems: any[] = (ast as any).from ?? [];\n\n    // Build alias map and collect real table names\n    const aliases: Record<string, string> = {};\n    const tableNames: string[] = [];\n    for (const item of fromItems) {\n      if (item.table) {\n        tableNames.push(item.table);\n        aliases[item.as ?? item.table] = item.table;\n        aliases[item.table] = item.table;\n      }\n    }\n\n    if (tableNames.length === 0) {\n      throw new SqlValidationError('No tables found in query');\n    }\n\n    // Fetch and parse schema for each table\n    const schemas: Record<string, TableSchemaInfo> = {};\n    for (const tableName of tableNames) {\n      const schemaArr = await firstValueFrom(this._dbManager.getDatabaseTableSchema(tableName));\n      if (!schemaArr || schemaArr.length === 0) {\n        throw new SqlValidationError(`Table not found: \"${tableName}\"`);\n      }\n      schemas[tableName] = this._parseSchemaArray(schemaArr);\n    }\n\n    const defaultTable = tableNames[0];\n\n    // Validate WHERE columns\n    if ((ast as any).where) {\n      this._validateWhereNode((ast as any).where, defaultTable, aliases, schemas);\n    }\n\n    // Validate ORDER BY columns\n    for (const ob of ((ast as any).orderby ?? [])) {\n      if (ob.expr?.type === 'column_ref') {\n        const tbl = this._resolveTable(ob.expr.table, defaultTable, aliases);\n        this._assertIndexed(ob.expr.column, tbl, schemas);\n      }\n    }\n\n    // Validate JOIN ON columns\n    for (const item of fromItems) {\n      if (item.join && item.on) {\n        this._validateJoinOn(item.on, tableNames, aliases, schemas);\n      }\n    }\n\n    // Strict mode: AND without compound index → throw\n    if (options.strict && (ast as any).where) {\n      this._checkStrictAnd((ast as any).where, defaultTable, aliases, schemas);\n    }\n\n    return { ast, schemas, aliases };\n  }\n\n  // ─── Helpers ─────────────────────────────────────────────────────────────\n\n  private _parseSchemaArray(schemaArr: string[]): TableSchemaInfo {\n    const pk = schemaArr[0] ?? '';\n    const simpleIndexes:   string[]   = [];\n    const compoundIndexes: string[][] = [];\n\n    for (let i = 1; i < schemaArr.length; i++) {\n      const s = schemaArr[i];\n      if (s.startsWith('[') && s.endsWith(']')) {\n        compoundIndexes.push(s.slice(1, -1).split('+'));\n      } else {\n        simpleIndexes.push(s.replace(/^[*&]/, ''));\n      }\n    }\n\n    return { pk, simpleIndexes, compoundIndexes };\n  }\n\n  private _isIndexed(col: string, tableName: string, schemas: Record<string, TableSchemaInfo>): boolean {\n    const schema = schemas[tableName];\n    if (!schema) return false;\n    return col === schema.pk || schema.simpleIndexes.includes(col);\n  }\n\n  private _assertIndexed(col: string, tableName: string, schemas: Record<string, TableSchemaInfo>): void {\n    if (!this._isIndexed(col, tableName, schemas)) {\n      throw new SqlValidationError(`Column \"${col}\" on table \"${tableName}\" is not indexed`);\n    }\n  }\n\n  private _resolveTable(tableRef: string | null, defaultTable: string, aliases: Record<string, string>): string {\n    if (!tableRef) return defaultTable;\n    return aliases[tableRef] ?? tableRef;\n  }\n\n  private _validateWhereNode(\n    node: any,\n    defaultTable: string,\n    aliases: Record<string, string>,\n    schemas: Record<string, TableSchemaInfo>,\n  ): void {\n    if (!node || node.type !== 'binary_expr') return;\n\n    if (node.operator === 'AND' || node.operator === 'OR') {\n      this._validateWhereNode(node.left,  defaultTable, aliases, schemas);\n      this._validateWhereNode(node.right, defaultTable, aliases, schemas);\n      return;\n    }\n\n    if (node.left?.type === 'column_ref') {\n      const tbl = this._resolveTable(node.left.table, defaultTable, aliases);\n      this._assertIndexed(node.left.column, tbl, schemas);\n    }\n  }\n\n  private _validateJoinOn(\n    onNode:     any,\n    tableNames: string[],\n    aliases:    Record<string, string>,\n    schemas:    Record<string, TableSchemaInfo>,\n  ): void {\n    if (!onNode || onNode.type !== 'binary_expr' || onNode.operator !== '=') return;\n\n    const l = onNode.left;\n    const r = onNode.right;\n    if (l?.type !== 'column_ref' || r?.type !== 'column_ref') return;\n\n    const leftTable  = tableNames[0];\n    const rightTable = tableNames[tableNames.length - 1];\n\n    // Resolve which ON side belongs to left vs right table\n    const lTableResolved = aliases[l.table ?? ''] ?? l.table ?? leftTable;\n    const rTableResolved = aliases[r.table ?? ''] ?? r.table ?? rightTable;\n\n    const leftKey  = lTableResolved === leftTable  ? { col: l.column, table: lTableResolved } : { col: r.column, table: rTableResolved };\n    const rightKey = lTableResolved === leftTable  ? { col: r.column, table: rTableResolved } : { col: l.column, table: lTableResolved };\n\n    // Left-side key: PK is exempt, otherwise must be indexed\n    const leftSchema = schemas[leftKey.table];\n    if (leftSchema && leftKey.col !== leftSchema.pk && !leftSchema.simpleIndexes.includes(leftKey.col)) {\n      throw new SqlValidationError(`JOIN column \"${leftKey.col}\" on table \"${leftKey.table}\" must be indexed`);\n    }\n\n    // Right-side key: must be indexed (including PK counts)\n    if (!this._isIndexed(rightKey.col, rightKey.table, schemas)) {\n      throw new SqlValidationError(`JOIN column \"${rightKey.col}\" on table \"${rightKey.table}\" must be indexed`);\n    }\n  }\n\n  private _checkStrictAnd(\n    whereNode:    any,\n    defaultTable: string,\n    aliases:      Record<string, string>,\n    schemas:      Record<string, TableSchemaInfo>,\n  ): void {\n    if (!whereNode || whereNode.type !== 'binary_expr' || whereNode.operator !== 'AND') return;\n\n    const leafCols = this._flattenAndCols(whereNode, defaultTable, aliases);\n    if (leafCols.length < 2) return;\n\n    const tableName = leafCols[0].table;\n    const schema    = schemas[tableName];\n    if (!schema) return;\n\n    const colNames = leafCols.map(c => c.col);\n    const hasCompound = schema.compoundIndexes.some(\n      ci => ci.length === colNames.length && colNames.every(c => ci.includes(c)),\n    );\n\n    if (!hasCompound) {\n      throw new SqlValidationError(\n        `Strict mode: compound index required for AND on columns [${colNames.join(', ')}]`,\n      );\n    }\n  }\n\n  private _flattenAndCols(\n    node:         any,\n    defaultTable: string,\n    aliases:      Record<string, string>,\n  ): Array<{ table: string; col: string }> {\n    if (!node || node.type !== 'binary_expr') return [];\n    if (node.operator === 'AND') {\n      return [\n        ...this._flattenAndCols(node.left,  defaultTable, aliases),\n        ...this._flattenAndCols(node.right, defaultTable, aliases),\n      ];\n    }\n    if (node.left?.type === 'column_ref') {\n      return [{ table: this._resolveTable(node.left.table, defaultTable, aliases), col: node.left.column }];\n    }\n    return [];\n  }\n}\n","export enum ExecutionPlanType {\n  SIMPLE       = 'SIMPLE',\n  AND_BOUNDED  = 'AND_BOUNDED',\n  AND_COMPOUND = 'AND_COMPOUND',\n  OR_MERGE     = 'OR_MERGE',\n  JOIN_HASH    = 'JOIN_HASH',\n}\n\nexport type DexieOp =\n  | 'equals'\n  | 'notEqual'\n  | 'above'\n  | 'aboveOrEqual'\n  | 'below'\n  | 'belowOrEqual'\n  | 'between'\n  | 'anyOf'\n  | 'noneOf'\n  | 'startsWith';\n\nexport interface PlanStep {\n  col: string;\n  op: DexieOp;\n  val: any;\n}\n\nexport interface JoinInfo {\n  leftTable:  string;\n  rightTable: string;\n  leftKey:    string;\n  rightKey:   string;\n  joinType:  'inner' | 'left';\n}\n\nexport interface ExecutionPlan {\n  type:              ExecutionPlanType;\n  table:             string;\n  primaryStep:       PlanStep | null;\n  boundedFilters:    PlanStep[];\n  compoundIndex?:    string;\n  compoundValues?:   any[];\n  compoundWarnCols?: string[];\n  orBranches?:       PlanStep[];\n  joinInfo?:         JoinInfo;\n  orderBy?:          { col: string; dir: 'asc' | 'desc' } | null;\n  limit?:            number | null;\n  offset?:           number | null;\n  projection?:       string[] | null;\n  aggregate?:        'count' | null;\n  distinct?:         boolean;\n  dedupeKey?:        string;\n}\n","import { SqlValidationError } from '../models/sql-errors.model';\nimport { DexieSqlOptions } from '../models/sql-options.model';\nimport {\n  ExecutionPlan,\n  ExecutionPlanType,\n  DexieOp,\n  PlanStep,\n  JoinInfo,\n} from '../models/execution-plan.model';\nimport { ValidatedQuery, TableSchemaInfo } from './schema-validator';\n\nexport class QueryPlanner {\n\n  plan(validated: ValidatedQuery, options: DexieSqlOptions = {}): ExecutionPlan {\n    const { ast, schemas, aliases } = validated;\n    const fromItems: any[] = (ast as any).from ?? [];\n    const mainTable  = fromItems[0]?.table ?? '';\n    const dedupeKey  = schemas[mainTable]?.pk ?? 'id';\n    const basePlan   = this._buildBasePlanExtras(ast, mainTable, dedupeKey);\n\n    // ── JOIN ────────────────────────────────────────────────────────────────\n    const joinItem = fromItems.find((f: any) => f.join);\n    if (joinItem) {\n      return this._buildJoinPlan(ast, fromItems, joinItem, schemas, aliases, mainTable, basePlan);\n    }\n\n    const where = (ast as any).where;\n\n    // ── No WHERE ─────────────────────────────────────────────────────────────\n    if (!where) {\n      return { ...basePlan, type: ExecutionPlanType.SIMPLE, primaryStep: null, boundedFilters: [] };\n    }\n\n    // ── OR ──────────────────────────────────────────────────────────────────\n    if (where.operator === 'OR') {\n      return this._buildOrPlan(where, basePlan, aliases, mainTable);\n    }\n\n    // ── AND ──────────────────────────────────────────────────────────────────\n    if (where.operator === 'AND') {\n      return this._buildAndPlan(where, basePlan, schemas, aliases, mainTable, options);\n    }\n\n    // ── Single condition ────────────────────────────────────────────────────\n    const step = this._nodeToStep(where, aliases, mainTable);\n    return { ...basePlan, type: ExecutionPlanType.SIMPLE, primaryStep: step, boundedFilters: [] };\n  }\n\n  // ─── AND ──────────────────────────────────────────────────────────────────\n\n  private _buildAndPlan(\n    where:        any,\n    basePlan:     Partial<ExecutionPlan> & { table: string },\n    schemas:      Record<string, TableSchemaInfo>,\n    aliases:      Record<string, string>,\n    mainTable:    string,\n    _options:     DexieSqlOptions,\n  ): ExecutionPlan {\n    const conditions = this._flattenAnd(where);\n    const cols       = conditions.map((c: any) => c.left?.column as string).filter(Boolean);\n    const schema     = schemas[mainTable];\n\n    // Check for matching compound index — only valid when every condition on\n    // its columns is an exact match; a compound lookup is always `.equals()`.\n    const matchedCompound = schema?.compoundIndexes.find(\n      ci => ci.length === cols.length\n        && cols.every(c => ci.includes(c))\n        && conditions.every((c: any) => c.operator === '='),\n    );\n\n    if (matchedCompound) {\n      const orderedValues = matchedCompound.map(ciCol => {\n        const cond = conditions.find((c: any) => c.left?.column === ciCol);\n        return this._extractValue(cond.right, cond.operator);\n      });\n      return {\n        ...basePlan,\n        type:           ExecutionPlanType.AND_COMPOUND,\n        primaryStep:    null,\n        boundedFilters: [],\n        compoundIndex:  `[${matchedCompound.join('+')}]`,\n        compoundValues: orderedValues,\n      } as ExecutionPlan;\n    }\n\n    // Pragmatic: first condition → Dexie, rest → JS filter\n    const primaryStep     = this._nodeToStep(conditions[0], aliases, mainTable);\n    const boundedFilters  = conditions.slice(1).map((c: any) => this._nodeToStep(c, aliases, mainTable));\n\n    return {\n      ...basePlan,\n      type:             ExecutionPlanType.AND_BOUNDED,\n      primaryStep,\n      boundedFilters,\n      compoundWarnCols: cols,\n    } as ExecutionPlan;\n  }\n\n  // ─── OR ───────────────────────────────────────────────────────────────────\n\n  private _buildOrPlan(\n    where:        any,\n    basePlan:     Partial<ExecutionPlan> & { table: string },\n    aliases:      Record<string, string>,\n    mainTable:    string,\n  ): ExecutionPlan {\n    const branches  = this._flattenOr(where);\n    const orBranches = branches.map((b: any) => this._nodeToStep(b, aliases, mainTable));\n    return {\n      ...basePlan,\n      type:           ExecutionPlanType.OR_MERGE,\n      primaryStep:    null,\n      boundedFilters: [],\n      orBranches,\n    } as ExecutionPlan;\n  }\n\n  // ─── JOIN ─────────────────────────────────────────────────────────────────\n\n  private _buildJoinPlan(\n    ast:        any,\n    fromItems:  any[],\n    joinItem:   any,\n    schemas:    Record<string, TableSchemaInfo>,\n    aliases:    Record<string, string>,\n    mainTable:  string,\n    basePlan:   Partial<ExecutionPlan> & { table: string },\n  ): ExecutionPlan {\n    const rightTable = joinItem.table as string;\n    const onNode     = joinItem.on;\n    const joinType   = (joinItem.join as string).toLowerCase().includes('left') ? 'left' : 'inner';\n\n    // Resolve join keys from ON clause\n    const l = onNode?.left;\n    const r = onNode?.right;\n\n    const lTableResolved = aliases[l?.table ?? ''] ?? l?.table ?? mainTable;\n    const rTableResolved = aliases[r?.table ?? ''] ?? r?.table ?? rightTable;\n\n    let leftKey: string, rightKey: string;\n    if (lTableResolved === mainTable) {\n      leftKey  = l?.column ?? '';\n      rightKey = r?.column ?? '';\n    } else {\n      leftKey  = r?.column ?? '';\n      rightKey = l?.column ?? '';\n    }\n\n    const joinInfo: JoinInfo = { leftTable: mainTable, rightTable, leftKey, rightKey, joinType };\n\n    // WHERE conditions become post-join bounded filters\n    const where = (ast as any).where;\n    const boundedFilters: PlanStep[] = [];\n    if (where) {\n      this._flattenAnd(where.operator === 'AND'\n        ? where\n        : { type: 'binary_expr', operator: 'AND', left: where, right: null })\n        .filter(Boolean)\n        .forEach((c: any) => boundedFilters.push(this._nodeToStep(c, aliases, mainTable)));\n    }\n\n    return {\n      ...basePlan,\n      type: ExecutionPlanType.JOIN_HASH,\n      primaryStep: null,\n      boundedFilters: where ? (where.operator === 'AND' ? boundedFilters : [this._nodeToStep(where, aliases, mainTable)]) : [],\n      joinInfo,\n    } as ExecutionPlan;\n  }\n\n  // ─── Base plan extras (ORDER BY, LIMIT, OFFSET, projection, etc.) ─────────\n\n  private _buildBasePlanExtras(ast: any, mainTable: string, dedupeKey: string): Partial<ExecutionPlan> & { table: string } {\n    const plan: Partial<ExecutionPlan> & { table: string } = { table: mainTable, dedupeKey };\n\n    // ORDER BY\n    const orderby: any[] = ast.orderby ?? [];\n    if (orderby.length > 0) {\n      const ob = orderby[0];\n      plan.orderBy = {\n        col: ob.expr?.column ?? '',\n        dir: ob.type?.toUpperCase() === 'DESC' ? 'desc' : 'asc',\n      };\n    }\n\n    // LIMIT / OFFSET\n    if (ast.limit) {\n      const vals: any[] = ast.limit.value ?? [];\n      if (ast.limit.seperator === 'offset' && vals.length === 2) {\n        plan.limit  = vals[0].value;\n        plan.offset = vals[1].value;\n      } else if (vals.length === 1) {\n        plan.limit  = vals[0].value;\n        plan.offset = null;\n      }\n    }\n\n    // Projection\n    const columns: any[] = ast.columns;\n    if (columns && columns !== '*' as any) {\n      // COUNT(*)\n      const countCol = columns.find((c: any) => c.expr?.type === 'aggr_func' && c.expr?.name === 'COUNT');\n      if (countCol) {\n        plan.aggregate  = 'count';\n        plan.projection = null;\n      } else {\n        const projected = columns\n          .filter((c: any) => c.expr?.type === 'column_ref' && c.expr?.column !== '*')\n          .map((c: any) => c.expr.column as string);\n        plan.projection = projected.length > 0 ? projected : null;\n      }\n    } else {\n      plan.projection = null;\n    }\n\n    // DISTINCT\n    plan.distinct = ast.distinct === 'DISTINCT';\n\n    return plan;\n  }\n\n  // ─── Node → PlanStep ──────────────────────────────────────────────────────\n\n  private _nodeToStep(node: any, aliases: Record<string, string>, defaultTable: string): PlanStep {\n    if (!node || node.type !== 'binary_expr' || node.left?.type !== 'column_ref') {\n      throw new SqlValidationError(`Unsupported WHERE condition structure`);\n    }\n\n    const col = node.left.column as string;\n    const { op, val } = this._mapOperator(node.operator, node.right);\n    return { col, op, val };\n  }\n\n  private _mapOperator(astOp: string, rightNode: any): { op: DexieOp; val: any } {\n    switch (astOp) {\n      case '=':   return { op: 'equals',        val: this._extractValue(rightNode, astOp) };\n      case '!=':\n      case '<>':  return { op: 'notEqual',       val: this._extractValue(rightNode, astOp) };\n      case '>':   return { op: 'above',          val: this._extractValue(rightNode, astOp) };\n      case '>=':  return { op: 'aboveOrEqual',   val: this._extractValue(rightNode, astOp) };\n      case '<':   return { op: 'below',          val: this._extractValue(rightNode, astOp) };\n      case '<=':  return { op: 'belowOrEqual',   val: this._extractValue(rightNode, astOp) };\n      case 'BETWEEN': {\n        const vals: any[] = rightNode?.value ?? [];\n        return { op: 'between', val: [this.coerceNumericLiteral(vals[0]), this.coerceNumericLiteral(vals[1])] };\n      }\n      case 'IN':      return { op: 'anyOf',  val: (rightNode?.value ?? []).map((v: any) => this.coerceNumericLiteral(v)) };\n      case 'NOT IN':  return { op: 'noneOf', val: (rightNode?.value ?? []).map((v: any) => this.coerceNumericLiteral(v)) };\n      case 'LIKE': {\n        const raw = String(rightNode?.value ?? '');\n        if (raw.startsWith('%')) {\n          throw new SqlValidationError('LIKE with leading wildcard is not supported');\n        }\n        if (raw.includes('%')) {\n          const pctIdx = raw.indexOf('%');\n          if (pctIdx !== raw.length - 1) {\n            throw new SqlValidationError('LIKE with leading wildcard is not supported');\n          }\n          return { op: 'startsWith', val: raw.slice(0, -1) };\n        }\n        // No wildcard — treat as equals\n        return { op: 'equals', val: raw };\n      }\n      default:\n        throw new SqlValidationError(`Unsupported SQL operator: \"${astOp}\"`);\n    }\n  }\n\n  private _extractValue(node: any, _op: string): any {\n    return this.coerceNumericLiteral(node);\n  }\n\n  private coerceNumericLiteral(node: any): any {\n    return node?.type === 'number' ? Number(node.value) : (node?.value ?? null);\n  }\n\n  // ─── WHERE tree helpers ───────────────────────────────────────────────────\n\n  private _flattenAnd(node: any): any[] {\n    if (!node) return [];\n    if (node.type === 'binary_expr' && node.operator === 'AND') {\n      return [...this._flattenAnd(node.left), ...this._flattenAnd(node.right)];\n    }\n    return [node];\n  }\n\n  private _flattenOr(node: any): any[] {\n    if (!node) return [];\n    if (node.type === 'binary_expr' && node.operator === 'OR') {\n      return [...this._flattenOr(node.left), ...this._flattenOr(node.right)];\n    }\n    return [node];\n  }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { Table } from 'dexie';\nimport { DatabaseManagerService } from '../../database-manager-service/database.manager.service';\nimport { SqlValidationError } from '../models/sql-errors.model';\nimport { ExecutionPlan, ExecutionPlanType, PlanStep } from '../models/execution-plan.model';\n\n@Injectable({ providedIn: 'root' })\nexport class DexieQueryExecutor {\n  private readonly _dbManager = inject(DatabaseManagerService);\n\n  async execute(plan: ExecutionPlan): Promise<any[]> {\n    switch (plan.type) {\n      case ExecutionPlanType.SIMPLE:       return this._executeSimple(plan);\n      case ExecutionPlanType.AND_BOUNDED:  return this._executeAndBounded(plan);\n      case ExecutionPlanType.AND_COMPOUND: return this._executeAndCompound(plan);\n      case ExecutionPlanType.OR_MERGE:     return this._executeOrMerge(plan);\n      case ExecutionPlanType.JOIN_HASH:    return this._executeJoinHash(plan);\n      default:\n        throw new SqlValidationError(`Unknown plan type`);\n    }\n  }\n\n  // ─── SIMPLE ───────────────────────────────────────────────────────────────\n\n  private async _executeSimple(plan: ExecutionPlan): Promise<any[]> {\n    const table = await this._getTable(plan.table);\n    let rows: any[];\n\n    if (!plan.primaryStep) {\n      rows = await table.toArray();\n    } else {\n      rows = await this._applyDexieStep(table, plan.primaryStep);\n    }\n\n    return this._postProcess(rows, plan);\n  }\n\n  // ─── AND_BOUNDED ──────────────────────────────────────────────────────────\n\n  private async _executeAndBounded(plan: ExecutionPlan): Promise<any[]> {\n    const table = await this._getTable(plan.table);\n\n    if (plan.compoundWarnCols?.length) {\n      console.warn(\n        `[DexieSqlService] Consider adding a compound index [${plan.compoundWarnCols.join('+')}] ` +\n        `to table \"${plan.table}\" for full index coverage on AND conditions.`,\n      );\n    }\n\n    let rows = plan.primaryStep\n      ? await this._applyDexieStep(table, plan.primaryStep)\n      : await table.toArray();\n\n    // Apply remaining AND conditions as JS filter\n    for (const f of plan.boundedFilters) {\n      rows = rows.filter(row => this._matchStep(row, f));\n    }\n\n    return this._postProcess(rows, plan);\n  }\n\n  // ─── AND_COMPOUND ─────────────────────────────────────────────────────────\n\n  private async _executeAndCompound(plan: ExecutionPlan): Promise<any[]> {\n    const table = await this._getTable(plan.table);\n    const rows  = await (table.where(plan.compoundIndex!) as any).equals(plan.compoundValues!).toArray();\n    return this._postProcess(rows, plan);\n  }\n\n  // ─── OR_MERGE ─────────────────────────────────────────────────────────────\n\n  private async _executeOrMerge(plan: ExecutionPlan): Promise<any[]> {\n    const table    = await this._getTable(plan.table);\n    const branches = plan.orBranches ?? [];\n\n    const results = await Promise.all(\n      branches.map(branch => this._applyDexieStep(table, branch)),\n    );\n\n    // Deduplicate by primary key\n    const pk   = plan.dedupeKey ?? 'id';\n    const seen = new Map<any, any>();\n    for (const batch of results) {\n      for (const row of batch) {\n        seen.set(row[pk], row);\n      }\n    }\n\n    return this._postProcess(Array.from(seen.values()), plan);\n  }\n\n  // ─── JOIN_HASH ────────────────────────────────────────────────────────────\n\n  private async _executeJoinHash(plan: ExecutionPlan): Promise<any[]> {\n    const join = plan.joinInfo!;\n\n    const leftTable  = await this._getTable(join.leftTable);\n    const rightTable = await this._getTable(join.rightTable);\n\n    // Fetch left rows (full scan; bounded WHERE filters applied post-join)\n    const leftRows = await leftTable.toArray();\n\n    // Extract FK values for right-side lookup\n    const fkValues = [...new Set(leftRows.map(r => r[join.leftKey]).filter(v => v != null))];\n\n    // Fetch right rows indexed by join key\n    const rightRows: any[] = fkValues.length > 0\n      ? await (rightTable.where(join.rightKey) as any).anyOf(fkValues).toArray()\n      : [];\n\n    // Build lookup map from rightKey → array of right rows\n    const rightMap = new Map<any, any[]>();\n    for (const rr of rightRows) {\n      const k = rr[join.rightKey];\n      if (!rightMap.has(k)) rightMap.set(k, []);\n      rightMap.get(k)!.push(rr);\n    }\n\n    // Hash join\n    const joined: any[] = [];\n    for (const lr of leftRows) {\n      const matches = rightMap.get(lr[join.leftKey]);\n      if (matches?.length) {\n        for (const rr of matches) {\n          joined.push({ ...lr, ...rr });\n        }\n      } else if (join.joinType === 'left') {\n        joined.push({ ...lr });\n      }\n    }\n\n    // Apply post-join bounded filters (any WHERE conditions from the query)\n    let result = joined;\n    for (const f of plan.boundedFilters) {\n      result = result.filter(row => this._matchStep(row, f));\n    }\n\n    return this._postProcess(result, plan);\n  }\n\n  // ─── Post-processing ──────────────────────────────────────────────────────\n\n  private _postProcess(rows: any[], plan: ExecutionPlan): any[] {\n    let result = rows;\n\n    // ORDER BY\n    if (plan.orderBy) {\n      const { col, dir } = plan.orderBy;\n      result = [...result].sort((a, b) => {\n        const av = a[col];\n        const bv = b[col];\n        if (av == null && bv == null) return 0;\n        if (av == null) return 1;\n        if (bv == null) return -1;\n        const cmp = av < bv ? -1 : av > bv ? 1 : 0;\n        return dir === 'desc' ? -cmp : cmp;\n      });\n    }\n\n    // LIMIT / OFFSET\n    const offset = plan.offset ?? 0;\n    const limit  = plan.limit  ?? null;\n    if (offset > 0 || limit != null) {\n      result = result.slice(offset, limit != null ? offset + limit : undefined);\n    }\n\n    // Projection\n    if (plan.projection && plan.projection.length > 0) {\n      const cols = plan.projection;\n      result = result.map(row => {\n        const projected: Record<string, any> = {};\n        for (const c of cols) projected[c] = row[c];\n        return projected;\n      });\n    }\n\n    // DISTINCT\n    if (plan.distinct) {\n      const seen = new Set<string>();\n      result = result.filter(row => {\n        const key = JSON.stringify(row);\n        if (seen.has(key)) return false;\n        seen.add(key);\n        return true;\n      });\n    }\n\n    // COUNT(*)\n    if (plan.aggregate === 'count') {\n      return [{ count: result.length }];\n    }\n\n    return result;\n  }\n\n  // ─── Dexie step dispatch ──────────────────────────────────────────────────\n\n  private _applyDexieStep(table: Table<any, any>, step: PlanStep): Promise<any[]> {\n    const col = step.col;\n    const val = step.val;\n\n    switch (step.op) {\n      case 'equals':       return table.where(col).equals(val).toArray();\n      case 'notEqual':     return table.where(col).notEqual(val).toArray();\n      case 'above':        return table.where(col).above(val).toArray();\n      case 'aboveOrEqual': return table.where(col).aboveOrEqual(val).toArray();\n      case 'below':        return table.where(col).below(val).toArray();\n      case 'belowOrEqual': return table.where(col).belowOrEqual(val).toArray();\n      case 'between':      return table.where(col).between(val[0], val[1], true, true).toArray();\n      case 'anyOf':        return table.where(col).anyOf(val).toArray();\n      case 'noneOf':       return table.where(col).noneOf(val).toArray();\n      case 'startsWith':   return table.where(col).startsWith(val).toArray();\n      default:\n        throw new SqlValidationError(`Unsupported Dexie op: \"${step.op}\"`);\n    }\n  }\n\n  // ─── JS row predicate ─────────────────────────────────────────────────────\n\n  private _matchStep(row: any, step: PlanStep): boolean {\n    const rv = row[step.col];\n    const v  = step.val;\n    switch (step.op) {\n      case 'equals':       return rv === v;\n      case 'notEqual':     return rv !== v;\n      case 'above':        return rv > v;\n      case 'aboveOrEqual': return rv >= v;\n      case 'below':        return rv < v;\n      case 'belowOrEqual': return rv <= v;\n      case 'between':      return rv >= v[0] && rv <= v[1];\n      case 'anyOf':        return (v as any[]).includes(rv);\n      case 'noneOf':       return !(v as any[]).includes(rv);\n      case 'startsWith':   return typeof rv === 'string' && rv.startsWith(v);\n      default:             return true;\n    }\n  }\n\n  // ─── Table accessor ───────────────────────────────────────────────────────\n\n  private async _getTable(tableName: string): Promise<Table<any, any>> {\n    const t = await firstValueFrom(this._dbManager.getDatabaseTable(tableName));\n    if (!t) throw new SqlValidationError(`Table \"${tableName}\" not found or not accessible`);\n    return t;\n  }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { from, Observable } from 'rxjs';\nimport { DexieSqlOptions } from './models/sql-options.model';\nimport { SqlParser } from './core/sql-parser';\nimport { SchemaValidator } from './core/schema-validator';\nimport { QueryPlanner } from './core/query-planner';\nimport { DexieQueryExecutor } from './core/dexie-query-executor';\n\n@Injectable({ providedIn: 'root' })\nexport class DexieSqlService {\n  private readonly _parser    = new SqlParser();\n  private readonly _validator = inject(SchemaValidator);\n  private readonly _planner   = new QueryPlanner();\n  private readonly _executor  = inject(DexieQueryExecutor);\n\n  /**\n   * Execute a MySQL-syntax SQL SELECT string against the DexieJS IndexedDB database.\n   * Returns an Observable that emits the result array and completes, or errors with\n   * SqlParseError / SqlValidationError if the query is invalid.\n   */\n  query(sql: string, options: DexieSqlOptions = {}): Observable<any[]> {\n    return from(this._run(sql, options));\n  }\n\n  private async _run(sql: string, options: DexieSqlOptions): Promise<any[]> {\n    const parsed    = this._parser.parse(sql);\n    const validated = await this._validator.validate(parsed, options);\n    const plan      = this._planner.plan(validated, options);\n    return this._executor.execute(plan);\n  }\n}\n","\n// export * from \"./database-manager-services/index\";\nexport * from \"./local-storage-manager-service/index\";\n\nexport * from \"./request-manager-services/index\";\nexport * from \"./request-manager-state-service/index\";\n\n// Explicitly re-export to avoid conflicts\nexport { WebSocketMessageService } from \"./ws-manager-service/index\";\nexport { StateMessage, StateMessageInterface } from \"./ws-manager-service/index\";\nexport { PublicMessage, PublicMessageInterface } from \"./ws-manager-service/index\";\nexport { NotificationMessage, NotificationMessageInterface } from \"./ws-manager-service/index\";\n// ChannelType is already exported from request-manager-state-service\n\nexport * from \"./store-state-manager-service/index\";\nexport * from \"./database-manager-service/index\";\nexport * from \"./SQL-DixieJS service/index\";\n\n\nexport * from \"./utils/index\";\n","import { Injectable } from '@angular/core';\nimport { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http';\n\nimport { Observable } from 'rxjs';\n\n@Injectable({ providedIn: 'root' })\nexport class WithCredentialsInterceptor implements HttpInterceptor {\n\n  intercept(req: HttpRequest<any>, next: HttpHandler):\n    Observable<HttpEvent<any>> {\n\n      // ponytail: only same-origin relative paths get credentials.\n      // Absolute URLs (http(s)://) are cross-origin and ACAO:* servers reject credentialed requests.\n      // Ceiling: protocol-relative '//host/path' URLs slip past this and would still send cookies.\n      if (!/^https?:\\/\\//i.test(req.url)) {\n        req = req.clone({ withCredentials: true });\n      }\n\n      return next.handle(req);\n  }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http';\nimport { Observable, Subscription } from 'rxjs';\nimport { LangChangeEvent, TranslateService } from '@ngx-translate/core';\n\n@Injectable({ providedIn: 'root' })\nexport class RequestHeadersInterceptor implements HttpInterceptor {\n\n  private translate = inject(TranslateService)\n\n  subscriptions = new Subscription()\n  language = 'en-CA'\n\n  get currentDate() {\n\n    const date = new Date()\n\n    const year = date.getFullYear()\n    const month = String(date.getMonth() + 1).padStart(2, '0')\n    const day = String(date.getDate()).padStart(2, '0')\n\n    return `${year}-${month}-${day}`\n\n  }\n\n  constructor() {\n    this.subscriptions.add(\n      this.translate.onLangChange\n      .subscribe((params: LangChangeEvent) => {\n          this.language = `${params.lang}-CA`\n      })\n    )\n  }\n\n  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n\n    // ponytail: skip custom headers for absolute cross-origin URLs (e.g. raw.githubusercontent.com).\n    // Those static hosts reject preflight OPTIONS; app API headers are only meaningful for same-origin calls.\n    // Ceiling: protocol-relative '//host/path' URLs would still get the headers.\n    if (/^https?:\\/\\//i.test(request.url)) {\n      return next.handle(request);\n    }\n\n    // Don't override Content-Type for bodies that carry or require their own — FormData (file uploads,\n    // browser sets the multipart boundary), Blob, ArrayBuffer, and URLSearchParams.\n    const skipContentType = request.body instanceof FormData\n      || request.body instanceof Blob\n      || request.body instanceof ArrayBuffer\n      || request.body instanceof URLSearchParams;\n\n    request = request.clone({\n      setHeaders: {\n        ...(skipContentType ? {} : { 'Content-Type': 'application/json' }),\n        'Accept-Language': this.language || 'en-CA',\n        'Current-Date': this.currentDate\n      }\n    })\n\n    return next.handle(request)\n\n  }\n\n  ngOnDestroy() {\n    this.subscriptions.unsubscribe()\n  }\n}\n\n","import { inject, Injectable } from '@angular/core'\nimport { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpErrorResponse } from '@angular/common/http'\nimport { Observable, catchError, throwError } from 'rxjs'\n\nimport { ToastMessageDisplayService, ToastDisplay, ToastColors } from 'toast-message-display'\nimport { OWNS_ERROR_DISPLAY } from './models/error-display-context.model'\n\nfunction resolveErrorMessage(error: HttpErrorResponse): string {\n  if (typeof error.error === 'string' && error.error) {\n    return error.error\n  }\n  if (error.error && typeof error.error.message === 'string') {\n    return error.error.message\n  }\n  return `${error.status}: ${error.statusText}`\n}\n\n@Injectable({ providedIn: 'root' })\nexport class RequestErrorInterceptor implements HttpInterceptor {\n\n  toastMessage = inject(ToastMessageDisplayService)\n\n  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n\n    return next.handle(req).pipe(\n\n      catchError((error: HttpErrorResponse) => {\n\n        const skipToast = req.context.get(OWNS_ERROR_DISPLAY)\n\n        if (error.status >= 400 && error.status < 500) {\n\n          // Client errors are logged only, not toasted by default — the caller is usually\n          // better positioned to react to a 4xx than a generic toast is.\n          console.error('Client Error:', {\n            status: error.status,\n            message: error.message,\n            error: error.error,\n            text: error.statusText,\n          })\n\n        } else {\n\n          const displayError = ToastDisplay.adapt({\n            message: '',\n            action: 'OK',\n            color: ToastColors.ERROR,\n            icon: 'info',\n          })\n\n          const toastDurationMs = 5000 // 5 seconds\n\n          if (error.status === 0) {\n\n            displayError.message = 'Network error: unable to reach the server.'\n\n            console.error('Network Error:', {\n              status: error.status,\n              message: error.message,\n              url: error.url,\n            })\n\n            if (!skipToast) this.toastMessage.toastMessage(displayError, toastDurationMs)\n\n          } else if (error.status >= 500) {\n\n            displayError.message = resolveErrorMessage(error)\n\n            console.error('Server Error:', {\n              status: error.status,\n              message: error.message,\n              error: error.error,\n              text: error.statusText,\n            })\n\n            if (!skipToast) this.toastMessage.toastMessage(displayError, toastDurationMs)\n\n          }\n\n        }\n\n        return throwError(() => error)\n\n      })\n\n    )\n  }\n\n}\n\n\n","import { Inject, Injectable, InjectionToken, isDevMode, Optional } from '@angular/core';\nimport { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';\nimport { Observable } from 'rxjs';\n\nexport const PROXY_CONFIG = new InjectionToken<Record<string, any>>('PROXY_CONFIG');\n\n@Injectable({ providedIn: 'root' })\nexport class ProxyDebuggerInterceptor implements HttpInterceptor {\n\n  constructor(@Optional() @Inject(PROXY_CONFIG) private proxyConfig: Record<string, any>) {}\n\n  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n\n    if (!this.proxyConfig || !isDevMode()) {\n      return next.handle(req);\n    }\n\n    const headers = req.headers.keys().reduce((acc, key) => {\n      acc[key] = req.headers.get(key) || '';\n      return acc;\n    }, {} as Record<string, string>);\n\n    for (const proxyPath in this.proxyConfig) {\n      if (this.proxyConfig.hasOwnProperty(proxyPath)) {\n        const proxyDetails = this.proxyConfig[proxyPath];\n        const regex = new RegExp('^' + proxyPath.replace(/^\\//, '').replaceAll('*', '(.*)'));\n\n        if (regex.test(req.url)) {\n          const target = proxyDetails.target;\n          const endpoint = req.url.replace(regex, '$1');\n          const actualPath = target + '/' + endpoint;\n\n          console.log('Request Proxied:', {\n            requestUrl: req.url,\n            requestPayload: req.body,\n            headers: headers,\n            proxyPath: proxyPath,\n            actualPath: actualPath,\n          });\n        }\n      }\n    }\n\n    return next.handle(req);\n  }\n}\n","import { inject, Type } from '@angular/core';\nimport { HttpInterceptor, HttpInterceptorFn } from '@angular/common/http';\n\nimport { WithCredentialsInterceptor } from './credentials.interceptor';\nimport { RequestHeadersInterceptor } from './request-header.interceptor';\nimport { ProxyDebuggerInterceptor } from './proxy-debugger.interceptor';\nimport { RequestErrorInterceptor } from './request-error.interceptor';\n\nfunction bridgeInterceptor(interceptorClass: Type<HttpInterceptor>): HttpInterceptorFn {\n  return (req, next) => inject(interceptorClass).intercept(req, { handle: next });\n}\n\nexport const withCredentialsInterceptorFn: HttpInterceptorFn = bridgeInterceptor(WithCredentialsInterceptor);\nexport const requestHeadersInterceptorFn: HttpInterceptorFn = bridgeInterceptor(RequestHeadersInterceptor);\nexport const proxyDebuggerInterceptorFn: HttpInterceptorFn = bridgeInterceptor(ProxyDebuggerInterceptor);\nexport const requestErrorInterceptorFn: HttpInterceptorFn = bridgeInterceptor(RequestErrorInterceptor);\n\n// Same order as the HTTP_INTERCEPTORS registration in http-request-manager.module.ts\nexport const httpRequestManagerInterceptors: HttpInterceptorFn[] = [\n  withCredentialsInterceptorFn,\n  requestHeadersInterceptorFn,\n  proxyDebuggerInterceptorFn,\n  requestErrorInterceptorFn,\n];\n","import { Component, EventEmitter, Input, OnInit, Output, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\nimport { ProgressSpinnerMode } from '@angular/material/progress-spinner';\nimport { Subscription, timer } from 'rxjs';\n\n@Component({\n    selector: 'app-download-file',\n    templateUrl: './download-file.component.html',\n    styleUrls: ['./download-file.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.Default,\n    standalone: false\n})\nexport class DownloadFileComponent implements OnInit {\n\n  private subscriptions = new Subscription();\n\n  @Input() event?: Function;\n  @Input() displayError = 3; // seconds\n  @Input() diameter = 32;\n  @Input() mode: ProgressSpinnerMode = 'determinate';\n  @Input() isPending = false;\n\n  @Input() active = false;\n  @Input() disabled = false;\n\n  @Output() error = new EventEmitter<void>();\n\n  private _progress = 0;\n  @Input() set progress(value: any) {\n    this._progress = value ?? 0;\n  }\n\n  get progress() {\n    return this._progress;\n  }\n\n  private _hasError = false;\n  private errorTimerActive = false;\n\n  @Input() set hasError(value: boolean | any) {\n\n    this._hasError = !!value;\n\n    if (this._hasError && !this.errorTimerActive) {\n      this.errorTimerActive = true;\n      this.active = false;\n      this.error.emit()\n      this.subscriptions.add(\n        timer(this.displayError * 1000)\n        .subscribe((err) => {\n          this._hasError = false;\n          this.errorTimerActive = false;\n        })\n      );\n    }\n\n  }\n\n  get hasError() {\n    return this._hasError;\n  }\n\n  ngOnInit() {}\n\n  onAction() {\n    this.isPending = false\n    if (this.event) this.event()\n  }\n\n  ngOnDestroy() {\n    this.subscriptions.unsubscribe()\n  }\n}\n","@if (!isPending) {\n  @if (hasError) {\n    <div class=\"width center-txt\" style=\"margin-bottom: 4px;\">\n      <mat-icon color=\"warn\" class=\"warn-icon\">warning</mat-icon>\n    </div>\n  } @else {\n    @if (active) {\n      <div class=\"container-obj\">\n        <div class=\"centered-obj-div\">\n          <mat-progress-spinner\n            color=\"primary\"\n            mode=\"indeterminate\"\n            [diameter]=\"44\"\n          ></mat-progress-spinner>\n        </div>\n      </div>\n    } @else {\n      <button data-tracking=\"export-btn\" mat-icon-button (click)=\"onAction()\" class=\"icon-button\" [disabled]=\"disabled\">\n        <mat-icon class=\"custom-icon\">file_download</mat-icon>\n      </button>\n    }\n  }\n} @else {\n  @if ((progress > 0 && progress < 100)) {\n    <div\n      class=\"spinner-container\"\n      >\n      <div class=\"spinner-background\">\n        {{progress}}%\n      </div>\n      <mat-progress-spinner\n        color=\"primary\"\n        [mode]=\"mode\"\n        [value]=\"progress\"\n        [diameter]=\"44\"\n      ></mat-progress-spinner>\n    </div>\n  } @else {\n    <div class=\"container-obj\">\n      <div class=\"centered-obj-div\">\n        <mat-progress-spinner\n          color=\"primary\"\n          mode=\"indeterminate\"\n          [diameter]=\"44\"\n        ></mat-progress-spinner>\n      </div>\n    </div>\n  }\n}\n\n\n\n\n","export interface DownloadLabelsInterface {\n  error: string;\n  action: string;\n  icon: string;\n}\n\nexport class DownloadLabels implements DownloadLabelsInterface {\n  constructor(\n    public error = '',\n    public action = '',\n    public icon = 'error',\n  ) {}\n\n static adapt(item?: any): DownloadLabelsInterface {\n    return new DownloadLabels(\n      item?.error,\n      item?.action,\n      item?.icon,\n    )\n\n  }\n}\n","import { Component, EventEmitter, Input, OnInit, Output, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\nimport { catchError, distinctUntilChanged, finalize } from 'rxjs/operators';\n\nimport { ToastColors, ToastDisplay } from 'toast-message-display';\n\nimport { DownloadLabels } from './models/download-labels-model';\nimport { HTTPManagerService } from '../../../services/request-manager-services/http-manager.service';\nimport { ApiRequest } from '../../../services/request-manager-state-service/models/api-request.model';\nimport { Subscription, throwError } from 'rxjs';\n\n@Component({\n    selector: 'app-file-downloader',\n    templateUrl: './file-downloader.component.html',\n    styleUrls: ['./file-downloader.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.Default,\n    standalone: false\n})\nexport class FileDownloaderComponent extends HTTPManagerService<any> implements OnInit {\n\n  @Input() delayError = 3\n  @Input() apiRequest: ApiRequest = ApiRequest.adapt()\n  @Input() displayErrorMessage = false\n\n  @Input() saveFileAs?: string\n\n  _labels = DownloadLabels.adapt()\n  @Input() set labels(value: DownloadLabels) {\n    this._labels = (value) ? DownloadLabels.adapt(value) : DownloadLabels.adapt()\n  }\n\n  active = false\n\n  subscription = new Subscription()\n\n  get labels() {\n    return this._labels\n  }\n\n  @Output() completed = new EventEmitter<void>()\n  @Output() failed = new EventEmitter<string>()\n\n  @Input() disabled = false\n\n  constructor() {\n    super()\n  }\n\n  ngOnInit() {\n\n  }\n\n  onDownloadStreaming() {\n\n    if (this.active) return;\n    this.active = true;\n\n    return this.downloadRequest(this.apiRequest, [])\n      .pipe(\n        distinctUntilChanged(),\n        catchError((err) => {\n\n          this.onError(err.message)\n          this.active = false\n          this.failed.emit(err)\n\n          return throwError(() => err)\n\n        }),\n        finalize(() => {\n          if (!this.active) return\n          this.active = false\n          this.completed.emit()\n        })\n      )\n      .subscribe()\n  }\n\n\n  onError(message: string) {\n\n    if(!message || !this.displayErrorMessage) return\n\n    const display = ToastDisplay.adapt({\n      message,\n      action: 'Ok',\n      color: ToastColors.ERROR,\n      icon: 'error',\n    });\n\n    this.active = false\n\n    this.toastMessage.toastMessage(display);\n\n  }\n\n  OnDestroy() {\n    this.subscription.unsubscribe()\n  }\n\n}\n","<app-download-file\n  [disabled]=\"disabled\"\n  [displayError]=\"3\"\n  [event]=\"onDownloadStreaming.bind(this)\"\n  [isPending]=\"(isPending$ | async) || false\"\n  [progress]=\"(progress$ | async)\"\n  [hasError]=\"(error$ | async)\"\n  (error)=\"onError(labels.error)\"\n  [active]=\"active\"\n></app-download-file>\n","import { Component, Input, OnInit, ChangeDetectionStrategy } from '@angular/core';\nimport { ThemePalette } from '@angular/material/core';\nimport { ProgressSpinnerMode } from '@angular/material/progress-spinner';\n\n@Component({\n    selector: 'app-spinner',\n    templateUrl: './spinner.component.html',\n    styleUrls: ['./spinner.component.scss'],\n    changeDetection: ChangeDetectionStrategy.Default,\n    standalone: false\n})\nexport class SpinnerComponent implements OnInit {\n\n  @Input() color: ThemePalette;\n\n  @Input() diameter?: number;\n  @Input() display?: string | number;\n  @Input() mode?: ProgressSpinnerMode;\n  @Input() strokeWidth?: number;\n  @Input() value = 0\n\n  constructor() { }\n\n  ngOnInit() {\n  }\n\n}\n","<div class=\"spinner-background\">{{display}}</div>\n<mat-progress-spinner\n    [color]=\"color\"\n    [diameter]=\"diameter\"\n    [mode]=\"mode || 'indeterminate'\"\n    [strokeWidth]=\"strokeWidth\"\n    [value]=\"value\">\n</mat-progress-spinner>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { DownloadFileComponent } from './download-file/download-file.component';\nimport { FileDownloaderComponent } from './file-downloader.component';\n\nimport { SpinnerComponent } from './spinner/spinner.component';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatButtonModule } from '@angular/material/button';\n\n@NgModule({\n  imports: [\n    CommonModule,\n    MatIconModule,\n    MatProgressSpinnerModule,\n    MatButtonModule,\n  ],\n  declarations: [\n    SpinnerComponent,\n    DownloadFileComponent,\n    FileDownloaderComponent,\n  ],\n  exports: [\n    FileDownloaderComponent\n  ]\n})\nexport class FileDownloaderModule { }\n","export type DisplayType = 'snackbar' | 'dialog' | 'carousel' | 'banner' | 'inline';\n\nexport interface DisplayConfigInterface {\n  type: DisplayType;\n  supportsMarkdown?: boolean;\n  stackable?: boolean;\n  queueBehavior?: 'replace' | 'queue' | 'ignore';\n  autoDismiss?: number;\n  width?: string;\n  height?: string;\n}\n\nexport class DisplayConfig implements DisplayConfigInterface {\n  constructor(\n    public type: DisplayType = 'snackbar',\n    public supportsMarkdown?: boolean,\n    public stackable?: boolean,\n    public queueBehavior?: 'replace' | 'queue' | 'ignore',\n    public autoDismiss?: number,\n    public width?: string,\n    public height?: string\n  ) {}\n\n  static adapt(item?: any): DisplayConfig {\n    return new DisplayConfig(\n      item?.type,\n      item?.supportsMarkdown,\n      item?.stackable,\n      item?.queueBehavior,\n      item?.autoDismiss,\n      item?.width,\n      item?.height\n    );\n  }\n}\n","import { DisplayConfig } from './display-config.model';\nimport { CommunicationMessage } from './communication-message.model';\n\nexport interface DisplayRuleInterface {\n  id: string;\n  name?: string;\n  match: (message: CommunicationMessage) => boolean;\n  display: DisplayConfig;\n}\n\nexport class DisplayRule implements DisplayRuleInterface {\n  constructor(\n    public id: string = '',\n    public name?: string,\n    public match: (message: CommunicationMessage) => boolean = () => false,\n    public display: DisplayConfig = DisplayConfig.adapt(),\n  ) {}\n\n  static adapt(item?: any): DisplayRule {\n    return new DisplayRule(\n      item?.id,\n      item?.name,\n      item?.match,\n      item?.display ? DisplayConfig.adapt(item.display) : DisplayConfig.adapt(),\n    );\n  }\n}\n\n","export interface SlideInterface {\n  title: string;\n  message: string;\n  image?: string;\n  icon?: string;\n}\n\nexport class Slide implements SlideInterface {\n  constructor(\n    public title: string = '',\n    public message: string = '',\n    public image?: string,\n    public icon?: string\n  ) {}\n\n  static adapt(item?: any): Slide {\n    return new Slide(\n      item?.title,\n      item?.message,\n      item?.image,\n      item?.icon\n    );\n  }\n}\n","export interface ActionInterface {\n  label: string;\n  action: 'close' | 'navigate' | 'callback' | 'custom';\n  target?: string;\n  callback?: string;\n  primary?: boolean;\n}\n\nexport class Action implements ActionInterface {\n  constructor(\n    public label: string = '',\n    public action: 'close' | 'navigate' | 'callback' | 'custom' = 'close',\n    public target?: string,\n    public callback?: string,\n    public primary?: boolean\n  ) {}\n\n  static adapt(item?: any): Action {\n    return new Action(\n      item?.label,\n      item?.action,\n      item?.target,\n      item?.callback,\n      item?.primary\n    );\n  }\n}\n","import { Slide } from './slide.model';\nimport { Action } from './action.model';\nimport { DisplayConfig } from './display-config.model';\n\nexport interface MessageContentInterface {\n  displayConfig?: DisplayConfig;\n  title?: string;\n  message: string;\n  slides?: Slide[];\n  image?: string;\n  images?: string[];\n  actions?: Action[];\n  messageType?: string;\n  icon?: string;\n  data?: any;\n}\n\nexport class MessageContent implements MessageContentInterface {\n  constructor(\n    public displayConfig?: DisplayConfig,\n    public title?: string,\n    public message: string = '',\n    public slides?: Slide[],\n    public image?: string,\n    public images?: string[],\n    public actions?: Action[],\n    public messageType?: string,\n    public icon?: string,\n    public data?: any\n  ) {}\n\n  static adapt(item?: any): MessageContent {\n    return new MessageContent(\n      item?.displayConfig ? DisplayConfig.adapt(item.displayConfig) : undefined,\n      item?.title,\n      item?.message,\n      item?.slides ? item.slides.map((slideItem: any) => Slide.adapt(slideItem)) : [],\n      item?.image,\n      item?.images,\n      item?.actions ? item.actions.map((actionItem: any) => Action.adapt(actionItem)) : [],\n      item?.messageType,\n      item?.icon,\n      item?.data\n    );\n  }\n}\n\nexport interface CommunicationMessageInterface {\n  type: string;\n  messageId?: number;\n  channel?: string;\n  sessionId?: { id: string };\n  timestamp?: string;\n  content: MessageContent;\n}\n\nexport class CommunicationMessage implements CommunicationMessageInterface {\n  constructor(\n    public type: string = '',\n    public messageId?: number,\n    public channel?: string,\n    public sessionId?: { id: string },\n    public timestamp?: string,\n    public content: MessageContent = MessageContent.adapt()\n  ) {}\n\n  static adapt(item?: any): CommunicationMessage {\n    return new CommunicationMessage(\n      item?.type,\n      item?.messageId,\n      item?.channel,\n      item?.sessionId,\n      item?.timestamp,\n      item?.content ? MessageContent.adapt(item.content) : MessageContent.adapt()\n    );\n  }\n}\n","import { DisplayRule } from '../models/display-rule.interface';\n\nexport const defaultDisplayRules: DisplayRule[] = [\n  {\n    id: 'carousel',\n    name: 'Carousel',\n    match: (message) => message.content?.displayConfig?.type === 'carousel',\n    display: {\n      type: 'carousel',\n      supportsMarkdown: true,\n      stackable: false\n    }\n  },\n  {\n    id: 'dialog',\n    name: 'Dialog',\n    match: (message) => message.content?.displayConfig?.type === 'dialog',\n    display: {\n      type: 'dialog',\n      supportsMarkdown: true,\n      stackable: true\n    }\n  },\n  {\n    id: 'default',\n    name: 'Snackbar',\n    match: () => true,\n    display: {\n      type: 'snackbar',\n      supportsMarkdown: false,\n      stackable: true,\n      autoDismiss: 3000\n    }\n  }\n];\n","import { Injectable, inject } from '@angular/core';\nimport { ToastMessageDisplayService, ToastColors, ToastDisplay } from 'toast-message-display';\nimport { IDisplayStrategy } from '../models/display-strategy.interface';\nimport { CommunicationMessage } from '../models/communication-message.model';\nimport { DisplayConfig } from '../models/display-config.model';\n\n@Injectable()\nexport class SnackbarStrategy implements IDisplayStrategy {\n  name = 'snackbar';\n\n  private toastService = inject(ToastMessageDisplayService);\n\n  canHandle(message: CommunicationMessage): boolean {\n    return true;  // Always can handle (fallback strategy)\n  }\n\n  display(message: CommunicationMessage, config: DisplayConfig): void {\n    const messageText = this.extractMessage(message.content);\n\n    this.toastService.toastMessage(\n      ToastDisplay.adapt({\n        message: messageText,\n        color: ToastColors.INFO,\n        icon: 'info',\n        action: 'DONE'\n      }),\n      config.autoDismiss ?? 3000 // milliseconds - matches ToastMessageDisplayService's duration contract\n    );\n  }\n\n  private extractMessage(content: any): string {\n    if (!content) return '';\n\n    // Try nested content structure (backward compatibility)\n    if (content.content?.message) {\n      return content.content.message;\n    }\n\n    // Try direct message\n    if (content.message) {\n      return content.message;\n    }\n\n    return '';\n  }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { IDisplayStrategy } from '../models/display-strategy.interface';\nimport { DisplayRule } from '../models/display-rule.interface';\nimport { CommunicationMessage } from '../models/communication-message.model';\nimport { defaultDisplayRules } from '../rules/default-display-rules';\nimport { SnackbarStrategy } from '../strategies/snackbar.strategy';\n\n@Injectable({ providedIn: 'root' })\nexport class MessageDisplayRouterService {\n\n  private snackbarStrategy = inject(SnackbarStrategy);\n\n  // All available strategies\n  private strategies: IDisplayStrategy[] = [\n    this.snackbarStrategy\n    // DialogStrategy will be added in Phase 2\n    // CarouselStrategy will be added in Phase 3\n  ];\n\n  // Rules are evaluated in order - first match wins\n  private rules: DisplayRule[] = defaultDisplayRules;\n\n  display(message: CommunicationMessage): void {\n    console.log('📨 MessageDisplayRouterService: Processing message:', message);\n\n    // Find FIRST matching rule (order matters!)\n    const matchingRule = this.rules.find(rule => rule.match(message));\n\n    // Get the rule (will be 'default' if nothing else matches)\n    const rule = matchingRule || this.rules[this.rules.length - 1];\n\n    console.log(`🎯 MessageDisplayRouterService: Matched rule '${rule.id}' (${rule.name})`);\n    console.log(`   → Display type: ${rule.display.type}`);\n\n    // Get strategy for the display type\n    const strategy = this.strategies.find(s => s.name === rule.display.type);\n\n    if (!strategy) {\n      console.warn(`⚠️ MessageDisplayRouterService: No strategy found for type '${rule.display.type}', falling back to snackbar`);\n      // Fallback to snackbar if strategy not found\n      this.snackbarStrategy.display(message, rule.display);\n      return;\n    }\n\n    // Execute display\n    console.log(`🚀 MessageDisplayRouterService: Executing ${strategy.name} strategy`);\n    strategy.display(message, rule.display);\n  }\n\n  registerStrategies(strategies: IDisplayStrategy[]): void {\n    strategies.forEach(strategy => {\n      if (!this.strategies.find(s => s.name === strategy.name)) {\n        this.strategies.push(strategy);\n        console.log(`✅ Registered strategy: ${strategy.name}`);\n      }\n    });\n  }\n\n  setRules(rules: DisplayRule[]): void {\n    this.rules = rules;\n    console.log(`📋 MessageDisplayRouterService: Rules updated (${rules.length} rules)`);\n  }\n}\n","import { Component, OnInit, inject, ChangeDetectionStrategy } from '@angular/core'\n\nimport { BehaviorSubject, EMPTY, Observable, firstValueFrom, throwError } from 'rxjs'\nimport { catchError, tap } from 'rxjs/operators'\n\nimport { ClientInfo } from './models/sample-client-info'\nimport { ApiRequest, HTTPManagerService, StreamType } from '../..'\n\nexport interface TestAllResultModel {\n  name: string\n  status: 'pending' | 'success' | 'error'\n  detail?: any\n  error?: string\n}\n\n@Component({\n    selector: 'app-request-manager-basic-demo',\n    templateUrl: './request-manager-basic-demo.component.html',\n    styleUrls: ['./request-manager-basic-demo.component.scss'],\n    providers: [HTTPManagerService],\n    changeDetection: ChangeDetectionStrategy.Default,\n    standalone: false\n})\nexport class RequestManagerBasicDemoComponent implements OnInit {\n\n  // Mirror src/environments/environment.ts's `test`/`streamTest` values, duplicated here rather\n  // than imported: this file compiles as part of the standalone http-request-manager library\n  // build (ng-packagr), which cannot reach outside its own project root for a source file to\n  // type-check and emit declarations against — doing so crashes the Angular compiler.\n  server = 'testRest'\n\n  displayedColumns: string[] = []\n\n  // Dynamic columns based on data structure\n  getColumnsFromData(data: any[]): string[] {\n    if (!data || data.length === 0) {\n      return []\n    }\n\n    const firstRecord = data[0]\n    if (!firstRecord || typeof firstRecord !== 'object') {\n      return []\n    }\n\n    // Extract all keys from the first record, excluding null/undefined\n    return Object.keys(firstRecord).filter(key =>\n      firstRecord[key] !== null && firstRecord[key] !== undefined\n    )\n  }\n\n  // Update displayed columns when data changes\n  updateDisplayedColumns(data: any[]): void {\n    this.displayedColumns = this.getColumnsFromData(data)\n    console.log('[DEMO] Updated columns:', this.displayedColumns)\n  }\n\n  // Helper to check if value is an object\n  isObject(value: any): boolean {\n    return value !== null && typeof value === 'object' && !Array.isArray(value)\n  }\n\n  httpManagerService = inject(HTTPManagerService)\n\n  isPending$ = this.httpManagerService.isPending$\n  countdown$ = this.httpManagerService.countdown$\n\n  GET_error$ = new BehaviorSubject<string>('')\n  GET_FAILURE_error$ = new BehaviorSubject<string>('')\n  POST_error$ = new BehaviorSubject<string>('')\n  PUT_error$ = new BehaviorSubject<string>('')\n  PATCH_error$ = new BehaviorSubject<string>('')\n  DELETE_error$ = new BehaviorSubject<string>('')\n\n  STREAM_error$ = new BehaviorSubject<string>('')\n\n  testAllResults$ = new BehaviorSubject<TestAllResultModel[]>([])\n  testAllRunning$ = new BehaviorSubject<boolean>(false)\n\n  GET$?: Observable<any>\n  GET_FAILURE$?: Observable<any>\n  POST$?: Observable<any>\n  PUT$?: Observable<any>\n  PATCH$?: Observable<any>\n  DELETE$?: Observable<any>\n\n  STREAM$?: Observable<any>\n\n  // api-test-server has no fixed record to mutate — PUT/PATCH/DELETE operate on whatever record\n  // GET or POST most recently returned, captured here.\n  lastRecordId: number | null = null\n\n  requestParams = {\n    GET: ApiRequest.adapt(),\n    GET_FAILURE: ApiRequest.adapt(),\n    POST: ApiRequest.adapt(),\n    PUT: ApiRequest.adapt(),\n    PATCH: ApiRequest.adapt(),\n    DELETE: ApiRequest.adapt(),\n    STREAM: ApiRequest.adapt(),\n  }\n\n  streamTypes = [\n    { id: 'JSON', value: 'json' },\n    { id: 'NDJSON', value: 'ndjson' },\n    { id: 'AI Streaming', value: 'ai_streaming' },\n    { id: 'Event Stream', value: 'event_stream' },\n    { id: 'Auto', value: 'auto' },\n  ]\n\n  streamType: string = StreamType.AUTO\n\n  // Maps a selected StreamType to the api-test-server endpoint that actually serves that\n  // format. AI_STREAMING, AUTO, and any unrecognized/unset value all share the AI endpoint -\n  // auto-detection needs a real, unambiguous format to detect against.\n  getStreamPath(type: string): string[] {\n    switch (type) {\n      case StreamType.NDJSON:\n        return ['items', 'stream']\n      case StreamType.EVENT_STREAM:\n        return ['items', 'stream', 'sse']\n      case StreamType.JSON:\n        return ['items', 'stream', 'json-objects']\n      default:\n        return ['items', 'stream', 'ai']\n    }\n  }\n\n  sampleClientData = {\n      id: 0,\n      name: \"Old School Dates\",\n      domain: \"osd.com\",\n      service: \"osd\",\n      spiffe: \"osd.com/osd\",\n      secret: \"SMOPECXP-OS4P-USOG-X2II-3XMD1FQDR3IJX\",\n      created: 1693003138,\n      modified: 1693003138,\n      icon: \"\",\n      imageFile: \"\",\n      email: \"wavecoders@gmail.com\"\n  }\n\n  constructor() { }\n\n  ngOnInit() {\n\n    // const reqGet2 = ApiRequest.adapt({\n    //   server,\n    //   path: ['clients'],\n    //   headers: { authentication: \"Bearer <KEY>\" },\n    //   adapter: ClientInfo,\n    //   dataType: DataType.OBJECT,\n    //   // concurrent: false,\n    //   // polling: 3, //seconds\n    // })\n\n    // const req2 = [1024,1025,1026].map(item => {\n    //   return this.httpManagerService.getRequest<ClientInfo[]>(reqGet2, [item])\n    //   .pipe(\n    //     catchError(error => {\n    //       return throwError(() => new Error(error.error.message))\n    //     })\n    //   )\n    // })\n\n    // forkJoin(req2)\n    // .subscribe(res => console.log(res))\n\n  }\n\n  onStreamType(type: string) {\n    this.streamType = type\n  }\n\n  // GET/POST hit api-test-server's collection endpoint and capture whichever record id PUT/\n  // PATCH/DELETE should mutate next; api-test-server has no per-verb echo endpoints, so paths\n  // here are its actual resource routes (`items`, `items/:id`), not verb names.\n  private captureRecordId(data: any): void {\n    if (Array.isArray(data)) {\n      if (data.length > 0) this.lastRecordId = data[data.length - 1].id\n    } else if (data?.id != null) {\n      this.lastRecordId = data.id\n    }\n  }\n\n  onGetRequest() {\n\n    this.requestParams.GET = ApiRequest.adapt({ server: this.server })\n\n    this.GET$ = EMPTY //Cancels Previous\n    this.GET_error$.next('')\n\n    this.GET$ = this.httpManagerService.getRequest<ClientInfo[]>(this.requestParams.GET, ['items'])\n    .pipe(\n      tap((data) => this.captureRecordId(data)),\n      catchError(error => {\n        return throwError(() => this.errorHandling(error, 'GET'))\n      })\n    )\n\n  }\n\n  onGetFailureRequest() {\n\n    // Deliberately points at a path api-test-server doesn't serve, with displayError: true,\n    // so this button reliably 404s and shows the OWNS_ERROR_DISPLAY-gated error toast — a\n    // manual way to see that toast fire without needing a real backend outage.\n    this.requestParams.GET_FAILURE = ApiRequest.adapt({ server: this.server, displayError: true })\n\n    this.GET_FAILURE$ = EMPTY //Cancels Previous\n    this.GET_FAILURE_error$.next('')\n\n    this.GET_FAILURE$ = this.httpManagerService.getRequest<ClientInfo[]>(this.requestParams.GET_FAILURE, ['does-not-exist'])\n    .pipe(\n      catchError(error => {\n        return throwError(() => this.errorHandling(error, 'GET_FAILURE'))\n      })\n    )\n\n  }\n\n  onCreateRequest() {\n\n    this.requestParams.POST = ApiRequest.adapt({ server: this.server })\n\n    this.POST$ = EMPTY //Cancels Previous\n    this.POST_error$.next('')\n\n    this.POST$ = this.httpManagerService.postRequest<ClientInfo>(this.sampleClientData, this.requestParams.POST, ['items'])\n    .pipe(\n      tap((data) => this.captureRecordId(data)),\n      catchError(error => {\n        return throwError(() => this.errorHandling(error, 'POST'))\n      })\n    )\n\n  }\n\n  onUpdateRequest() {\n\n    if (this.lastRecordId == null) {\n      this.PUT_error$.next('Run GET or POST first to pick a record id to update')\n      return\n    }\n\n    this.requestParams.PUT = ApiRequest.adapt({ server: this.server })\n\n    this.PUT$ = EMPTY //Cancels Previous\n    this.PUT_error$.next('')\n\n    this.PUT$ = this.httpManagerService.putRequest<any>(this.sampleClientData, this.requestParams.PUT, ['items', this.lastRecordId])\n    .pipe(\n      // tap((data) => console.log(\"API PUT response\", data)),\n      catchError(error => {\n        return throwError(() => this.errorHandling(error, 'PUT'))\n      })\n    )\n\n  }\n\n  onPatchRequest() {\n\n    if (this.lastRecordId == null) {\n      this.PATCH_error$.next('Run GET or POST first to pick a record id to patch')\n      return\n    }\n\n    this.requestParams.PATCH = ApiRequest.adapt({ server: this.server })\n\n    this.PATCH$ = EMPTY //Cancels Previous\n    this.PATCH_error$.next('')\n\n    this.PATCH$ = this.httpManagerService.patchRequest<any>(this.sampleClientData, this.requestParams.PATCH, ['items', this.lastRecordId])\n    .pipe(\n      // tap((data) => console.log(\"API PATCH response\", data)),\n      catchError(error => {\n        return throwError(() => this.errorHandling(error, 'PATCH'))\n      })\n    )\n\n  }\n\n  onDeleteRequest() {\n\n    if (this.lastRecordId == null) {\n      this.DELETE_error$.next('Run GET or POST first to pick a record id to delete')\n      return\n    }\n\n    this.requestParams.DELETE = ApiRequest.adapt({ server: this.server })\n\n    this.DELETE$ = EMPTY //Cancels Previous\n    this.DELETE_error$.next('')\n\n    this.DELETE$ = this.httpManagerService.deleteRequest<ClientInfo>(this.requestParams.DELETE, ['items', this.lastRecordId])\n    .pipe(\n      // The deleted record no longer exists — clear the captured id so a subsequent standalone\n      // PUT/PATCH/DELETE click reports \"run GET or POST first\" instead of 404ing on a ghost id.\n      tap(() => this.lastRecordId = null),\n      catchError(error => {\n        return throwError(() => this.errorHandling(error, 'DELETE'))\n      })\n    )\n\n  }\n\n  onStreamRequest() {\n\n    this.requestParams.STREAM = ApiRequest.adapt({\n      server: this.server,\n      stream: true,\n      streamType: this.streamType as StreamType,\n    })\n\n    this.STREAM$ = this.httpManagerService.getRequest<ClientInfo[]>(this.requestParams.STREAM, this.getStreamPath(this.streamType))\n        .pipe(\n      tap((data) => {\n        console.log(\"API STREAM response\", data)\n        if (data && data.length > 0) {\n          this.updateDisplayedColumns(data)\n        }\n      }),\n      catchError(error => {\n        return throwError(() => this.errorHandling(error, 'STREAM'))\n      })\n    )\n\n  }\n\n  errorHandling(err: any, type: string) {\n    if(type === 'GET') this.GET_error$.next(err.message)\n    if(type === 'GET_FAILURE') this.GET_FAILURE_error$.next(err.message)\n    if(type === 'POST') this.POST_error$.next(err.message)\n    if(type === 'PUT') this.PUT_error$.next(err.message)\n    if(type === 'PATCH') this.PATCH_error$.next(err.message)\n    if(type === 'DELETE') this.DELETE_error$.next(err.message)\n    if(type === 'STREAM') this.STREAM_error$.next(err.message)\n  }\n\n  // Test All — runs every request type sequentially against api-test-server's `items` resource\n  // (GET picks up the newest record, POST creates one, PUT/PATCH/DELETE mutate and remove it),\n  // and reports results in `testAllResults$`.\n  // Deliberately does not write into GET$/POST$/PUT$/PATCH$/DELETE$/STREAM$ — those stay driven\n  // by their own buttons, independent of a Test All run.\n  async onTestAll() {\n\n    if (this.testAllRunning$.value) return\n    this.testAllRunning$.next(true)\n\n    const results: TestAllResultModel[] = [\n      { name: 'GET', status: 'pending' },\n      { name: 'POST', status: 'pending' },\n      { name: 'PUT', status: 'pending' },\n      { name: 'PATCH', status: 'pending' },\n      { name: 'DELETE', status: 'pending' },\n      { name: 'STREAM', status: 'pending' },\n    ]\n    this.testAllResults$.next([...results])\n\n    const runStep = async (index: number, run: () => Promise<any>) => {\n      try {\n        const detail = await run()\n        results[index] = { ...results[index], status: 'success', detail }\n      } catch (err: any) {\n        results[index] = { ...results[index], status: 'error', error: err?.message || String(err) }\n      }\n      this.testAllResults$.next([...results])\n    }\n\n    const crudOptions = () => ApiRequest.adapt({ server: this.server })\n\n    // Sequential by design (each step depends on the record id the previous one produced): GET\n    // picks up the newest existing record, POST creates a fresh one and takes over as the\n    // record PUT/PATCH/DELETE then mutate and finally remove.\n    let recordId: number | null = null\n\n    await runStep(0, async () => {\n      const data = await firstValueFrom(this.httpManagerService.getRequest<any>(crudOptions(), ['items']))\n      this.captureRecordId(data)\n      recordId = this.lastRecordId\n      return data\n    })\n    await runStep(1, async () => {\n      const data = await firstValueFrom(this.httpManagerService.postRequest<any>(this.sampleClientData, crudOptions(), ['items']))\n      this.captureRecordId(data)\n      recordId = this.lastRecordId\n      return data\n    })\n    await runStep(2, () => {\n      if (recordId == null) throw new Error('No record id available for PUT')\n      return firstValueFrom(this.httpManagerService.putRequest<any>(this.sampleClientData, crudOptions(), ['items', recordId]))\n    })\n    await runStep(3, () => {\n      if (recordId == null) throw new Error('No record id available for PATCH')\n      return firstValueFrom(this.httpManagerService.patchRequest<any>(this.sampleClientData, crudOptions(), ['items', recordId]))\n    })\n    await runStep(4, async () => {\n      if (recordId == null) throw new Error('No record id available for DELETE')\n      const data = await firstValueFrom(this.httpManagerService.deleteRequest<any>(crudOptions(), ['items', recordId]))\n      // The record this whole run created and mutated no longer exists — clear the shared\n      // capture so a standalone PUT/PATCH/DELETE click afterward doesn't 404 on it.\n      if (this.lastRecordId === recordId) this.lastRecordId = null\n      return data\n    })\n\n    await runStep(5, () => firstValueFrom(this.httpManagerService.getRequest<any>(\n      ApiRequest.adapt({ server: this.server, stream: true, streamType: this.streamType as StreamType }),\n      this.getStreamPath(this.streamType)\n    )))\n\n    this.testAllRunning$.next(false)\n\n  }\n\n}\n","<div style=\"margin: 2rem;\">\n\n  <div style=\"margin-bottom: 1rem; margin-top: 2rem;\">\n    @if ((isPending$ | async)) {\n      <mat-progress-bar mode=\"indeterminate\"\n      ></mat-progress-bar>\n    }\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <div style=\"display: flex;\">\n      <h2 style=\"flex:1\">Test All</h2>\n      <div>\n        <button mat-raised-button (click)=\"onTestAll()\" class=\"btn\" [disabled]=\"!!(testAllRunning$ | async)\">Test All</button>\n      </div>\n    </div>\n\n    @if ((testAllResults$ | async); as testAllResults) {\n      @if (testAllResults.length > 0) {\n        <table style=\"width: 100%; border-collapse: collapse; margin-top: 1rem;\">\n          <thead>\n            <tr>\n              <th style=\"text-align: left; padding: .5rem;\">Step</th>\n              <th style=\"text-align: left; padding: .5rem;\">Status</th>\n              <th style=\"text-align: left; padding: .5rem;\">Result</th>\n            </tr>\n          </thead>\n          <tbody>\n            @for (result of testAllResults; track result.name) {\n              <tr>\n                <td style=\"padding: .5rem; vertical-align: top;\">{{ result.name }}</td>\n                <td style=\"padding: .5rem; vertical-align: top;\">\n                  @if (result.status === 'pending') {\n                    <span style=\"display: flex; align-items: center; gap: .25rem;\">\n                      <mat-icon>hourglass_empty</mat-icon> Pending\n                    </span>\n                  }\n                  @if (result.status === 'success') {\n                    <span style=\"display: flex; align-items: center; gap: .25rem; color: green;\">\n                      <mat-icon>check_circle</mat-icon> Success\n                    </span>\n                  }\n                  @if (result.status === 'error') {\n                    <span style=\"display: flex; align-items: center; gap: .25rem; color: red;\">\n                      <mat-icon>error</mat-icon> Error\n                    </span>\n                  }\n                </td>\n                <td style=\"padding: .5rem; vertical-align: top; max-width: 400px;\">\n                  @if (result.status === 'error') {\n                    <mat-error>{{ result.error }}</mat-error>\n                  } @else if (result.detail) {\n                    <pre style=\"margin: 0; font-size: 0.8em; white-space: pre-wrap;\">{{ result.detail | json }}</pre>\n                  }\n                </td>\n              </tr>\n            }\n          </tbody>\n        </table>\n      }\n    }\n\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <div style=\"display: flex;\">\n      <h2 style=\"flex:1\">GET Request</h2>\n      <div>\n        <button mat-raised-button (click)=\"onGetRequest()\" class=\"btn\">Request</button>\n      </div>\n    </div>\n\n    @if ((GET_error$ | async); as get_error) {\n      <div style=\"margin-top: .5rem;\">\n        <mat-error>{{ get_error }}</mat-error>\n      </div>\n    }\n\n    @if ((GET$ | async); as dataRecord) {\n      <div style=\"margin-top: 1rem;\">\n        <!-- <div [innerHTML]=\"(GET$ | async) | jsonv\"></div> -->\n        {{ dataRecord | json }}\n      </div>\n    }\n\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <div style=\"display: flex;\">\n      <h2 style=\"flex:1\">GET Request Failure</h2>\n      <div>\n        <button mat-raised-button (click)=\"onGetFailureRequest()\" class=\"btn\">Request</button>\n      </div>\n    </div>\n\n    @if ((GET_FAILURE_error$ | async); as get_failure_error) {\n      <div style=\"margin-top: .5rem;\">\n        <mat-error>{{ get_failure_error }}</mat-error>\n      </div>\n    }\n\n    @if ((GET_FAILURE$ | async); as dataRecord) {\n      <div style=\"margin-top: 1rem;\">\n        {{ dataRecord | json }}\n      </div>\n    }\n\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <div style=\"display: flex;\">\n      <h2 style=\"flex:1\">POST Request</h2>\n      <div>\n        <button mat-raised-button (click)=\"onCreateRequest()\" class=\"btn\">Request</button>\n      </div>\n    </div>\n\n    @if ((POST_error$ | async); as post_error) {\n      <div style=\"margin-top: .5rem;\">\n        <mat-error>{{ post_error }}</mat-error>\n      </div>\n    }\n\n    @if ((POST$ | async); as dataRecord) {\n      <div style=\"margin-top: 1rem;\">\n        <!-- <div [innerHTML]=\"(POST$ | async) | jsonv\"></div> -->\n        {{ dataRecord | json }}\n      </div>\n    }\n\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <div style=\"display: flex;\">\n      <h2 style=\"flex:1\">PUT Request</h2>\n      <div>\n        <button mat-raised-button (click)=\"onUpdateRequest()\" class=\"btn\">Request</button>\n      </div>\n    </div>\n\n    @if ((PUT_error$ | async); as put_error) {\n      <div style=\"margin-top: .5rem;\">\n        <mat-error>{{ put_error }}</mat-error>\n      </div>\n    }\n\n    @if ((PUT$ | async); as dataRecord) {\n      <div style=\"margin-top: 1rem;\">\n        <!-- <div [innerHTML]=\"(PUT$ | async) | jsonv\"></div> -->\n        {{ dataRecord | json }}\n      </div>\n    }\n\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <div style=\"display: flex;\">\n      <h2 style=\"flex:1\">DELETE Request</h2>\n      <div>\n        <button mat-raised-button (click)=\"onDeleteRequest()\" class=\"btn\">Request</button>\n      </div>\n    </div>\n\n    @if ((DELETE_error$ | async); as delete_error) {\n      <div style=\"margin-top: .5rem;\">\n        <mat-error>{{ delete_error }}</mat-error>\n      </div>\n    }\n\n    @if ((DELETE$ | async); as dataRecord) {\n      <div style=\"margin-top: 1rem;\">\n        <!-- <div [innerHTML]=\"(DELETE$ | async) | jsonv\"></div> -->\n        {{ dataRecord | json }}\n      </div>\n    }\n\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <div style=\"display: flex;\">\n      <h2 style=\"flex:1\">PATCH Request</h2>\n      <div>\n        <button mat-raised-button (click)=\"onPatchRequest()\" class=\"btn\">Request</button>\n      </div>\n    </div>\n\n    @if ((PATCH_error$ | async); as patch_error) {\n      <div style=\"margin-top: .5rem;\">\n        <mat-error>{{ patch_error }}</mat-error>\n      </div>\n    }\n\n    @if ((PATCH$ | async); as dataRecord) {\n      <div style=\"margin-top: 1rem;\">\n        {{ dataRecord | json }}\n      </div>\n    }\n\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <div style=\"display: flex;\">\n      <h2 style=\"flex:1\">Streaming GET Request</h2>\n      <div style=\"display: flex; gap: 1rem; align-items: center;\">\n        <div style=\"display: flex; gap: 1rem; align-items: center;\">\n          {{ streamType }}\n          <button mat-icon-button [matMenuTriggerFor]=\"menu\">\n            <mat-icon>data_usage</mat-icon>\n          </button>\n        </div>\n        <mat-menu #menu=\"matMenu\">\n          @for (item of streamTypes; track item) {\n            <button mat-menu-item (click)=\"onStreamType(item.value)\">{{ item.value }}</button>\n          }\n        </mat-menu>\n        <button mat-raised-button (click)=\"onStreamRequest()\" class=\"btn\">Request</button>\n      </div>\n    </div>\n\n    <!-- <div *ngIf=\"(STREAM_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n    <mat-error>{{ stream_error }}</mat-error>\n  </div> -->\n\n  <div style=\"margin-top: 1rem;\">\n    @if ((STREAM$ | async); as data) {\n      <div class=\"container\">\n        <table mat-table [dataSource]=\"data\" class=\"mat-elevation-z8\">\n\n          <!-- Dynamic columns -->\n          @for (column of displayedColumns; track column) {\n            <ng-container [matColumnDef]=\"column\">\n              <th mat-header-cell *matHeaderCellDef> {{ column | titlecase }} </th>\n              <td mat-cell *matCellDef=\"let element\">\n                @if (isObject(element[column]); as objValue) {\n                  <pre style=\"margin: 0; font-size: 0.8em; white-space: pre-wrap;\">{{ objValue | json }}</pre>\n                } @else {\n                  {{ element[column] }}\n                }\n              </td>\n            </ng-container>\n          }\n\n          <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n          <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n        </table>\n\n        <!-- Debug info -->\n        <div style=\"margin-top: 1rem; font-size: 0.8em; color: #666;\">\n          Columns: {{ displayedColumns.join(', ') }} | Records: {{ data.length }}\n        </div>\n      </div>\n    }\n  </div>\n\n</div>\n","export interface ClientInfoInterface {\n  domain: string\n  service: string\n  id: number\n  name: string\n}\n\nexport class ClientInfo implements ClientInfoInterface {\n\n  constructor(\n    public domain = '',\n    public service = '',\n    public id = 0,\n    public name = '',\n  ) {}\n\n  static adapt(item?: any): ClientInfo {\n\n    return new ClientInfo(\n      item?.domain,\n      item?.service,\n      item?.id,\n      (item?.first_name || item?.last_name) ? `${item?.first_name} ${item?.last_name}` : '',\n    )\n\n  }\n\n}\n\n\n","export interface ClientInfoMapperInterface {\n  id: number\n  first_name: string\n  last_name: string\n  email: string\n}\n\nexport class ClientInfoMapper implements ClientInfoMapperInterface {\n\n  constructor(\n    public id = 0,\n    public first_name = '',\n    public last_name = '',\n    public email = '',\n  ) {}\n\n  static adapt(item?: any): ClientInfoMapper {\n\n    const first_name = (item?.name) ? item.name.split(' ')[0] : ''\n    const last_name = (item?.name) ? item.name.split(' ')[1] : ''\n\n    return new ClientInfoMapper(\n      item?.id,\n      first_name,\n      last_name,\n      item?.email,\n    )\n\n  }\n\n}\n\n\n","import { Injectable } from '@angular/core';\n\nimport { DataType, DatabaseStorage } from '../../../models';\nimport { HTTPManagerStateService } from '../../../services/request-manager-state-service/http-manager-state.store';\nimport { ApiRequest } from '../../../services/request-manager-state-service/models/api-request.model';\nimport { RequestOptions } from '../../../services/request-manager-state-service/models/request-options.model';\n\nimport { ClientInfo } from '../../request-manager-demo/models/sample-client-info';\nimport { ClientInfoMapper } from '../../request-manager-demo/models/sample-mapper-client-info';\n\n@Injectable()\nexport class StateManagerDemoService extends HTTPManagerStateService<any> {\n\n  constructor() {\n    super(\n      ApiRequest.adapt({\n        server: \"\",\n        path: [],\n        headers: {},\n        adapter: ClientInfo.adapt,\n        mapper: ClientInfoMapper.adapt,\n        stream: false,\n      }),\n      DataType.ARRAY,\n      DatabaseStorage.adapt()\n    )\n  }\n\n  setAPIOptions(apiOptions: ApiRequest, dataType: DataType, database?: DatabaseStorage) {\n    this.setApiRequestOptions(apiOptions, dataType, database)\n  }\n\n  getClients(options?: RequestOptions) {\n\n    // const headers = {\n    //   auth: \"sample-auth-token\"\n    // }\n    // const sampleOptions = RequestOptions.adapt({ path: [\"id\", 12], headers, sample: true })\n    this.fetchRecords(options)\n\n  }\n\n  createClient(data: any) {\n\n    // const headers = {\n    //   auth: \"sample-auth-token\"\n    // }\n\n    // const sampleOptions = RequestOptions.adapt({ path: [\"id\", 12], headers, sample: true })\n    this.createRecord(data)\n\n  }\n\n  updateClient(data: ClientInfo) {\n\n    // const headers = {\n    //   auth: \"sample-auth-token\"\n    // }\n    data.id = 1031\n    const sampleOptions = RequestOptions.adapt({ path: [data.id] })\n    this.updateRecord(data, sampleOptions)\n\n  }\n\n  patchClient(data: ClientInfo) {\n\n    // const headers = {\n    //   auth: \"sample-auth-token\"\n    // }\n    data.id = 1031\n    const sampleOptions = RequestOptions.adapt({ path: [data.id] })\n    this.patchRecord(data, sampleOptions)\n\n  }\n\n  deleteClient(data: ClientInfo) {\n\n    // const headers = {\n    //   auth: \"sample-auth-token\"\n    // }\n\n    data.id = 1031\n    const sampleOptions = RequestOptions.adapt({ path: [data.id] })\n    this.deleteRecord(sampleOptions)\n\n  }\n\n  streamRequest(options?: RequestOptions) {\n    console.log('[DEMO SERVICE] streamRequest called')\n\n    const headers = {\n      auth: \"sample-auth-token\"\n    }\n\n    console.log('[DEMO SERVICE] Calling fetchStream with headers:', headers)\n    this.fetchStream(options)\n\n  }\n\n  sendWsMessage(channel: string, method: string, path: (string | number)[]) {\n    const message = {\n      sessionId: null,\n      content: {\n        method,\n        path\n      }\n    }\n    const channels = channel ? [channel] : undefined\n    this.wsMessaging(message, channels)\n  }\n\n}\n","export interface AIPromptInterface {\n  response: string\n}\n\nexport class AIPrompt implements AIPromptInterface {\n\n  constructor(\n    public response = '',\n  ) {}\n\n  static adapt(item?: any): AIPrompt {\n\n    return new AIPrompt(\n      item?.response,\n    )\n\n  }\n\n}\n","import { Component, Input, OnInit, ViewChild, inject, ChangeDetectionStrategy } from '@angular/core';\n\nimport { StateManagerDemoService } from './services/state-manager-demo.service';\nimport { DatabaseManagerService } from '../../services/database-manager-service/database.manager.service';\nimport { FormBuilder, Validators, FormArray, FormControl } from '@angular/forms';\n\nimport { Observable, BehaviorSubject, EMPTY, map, tap, catchError, throwError } from 'rxjs';\n\nimport { ClientInfo } from '../request-manager-demo/models/sample-client-info';\nimport { ClientInfoMapper } from '../request-manager-demo/models/sample-mapper-client-info';\nimport { AIPrompt } from '../request-manager-demo/models/sample-ai-prompt';\n\nimport { DataType } from '../../models';\nimport { DatabaseStorage } from '../../models/database-storage.model';\nimport { HTTPManagerService } from '../../services/request-manager-services/http-manager.service';\nimport { ApiRequest } from '../../services/request-manager-state-service/models/api-request.model';\nimport { StreamType } from '../../services/request-manager-state-service/models/stream-type.enum';\nimport { RequestOptions } from '../../services/request-manager-state-service/models/request-options.model';\n\n\n@Component({\n    selector: 'app-request-manager-state-demo',\n    templateUrl: './request-manager-state-demo.component.html',\n    styleUrls: ['./request-manager-state-demo.component.scss'],\n    providers: [StateManagerDemoService, HTTPManagerService],\n    changeDetection: ChangeDetectionStrategy.Default,\n    standalone: false\n})\nexport class RequestManagerStateDemoComponent implements OnInit {\n\n  @Input() server = 'http://localhost:8080'\n  @Input() adapter?: Function\n  @Input() mapper?: Function\n\n  stateManagerDemoService = inject(StateManagerDemoService)\n  databaseManagerService = inject(DatabaseManagerService)\n\n  displayedColumns: string[] = []\n\n  // Dynamic columns based on data structure\n  getColumnsFromData(data: any[]): string[] {\n    if (!data || data.length === 0) {\n      return []\n    }\n\n    const firstRecord = data[0]\n    if (!firstRecord || typeof firstRecord !== 'object') {\n      return []\n    }\n\n    // Extract all keys from the first record, excluding null/undefined\n    return Object.keys(firstRecord).filter(key =>\n      firstRecord[key] !== null && firstRecord[key] !== undefined\n    )\n  }\n\n  // Update displayed columns when data changes\n  updateDisplayedColumns(data: any[]): void {\n    this.displayedColumns = this.getColumnsFromData(data)\n    console.log('[STATE DEMO] Updated columns:', this.displayedColumns)\n  }\n\n  // Helper to check if value is an object\n  isObject(value: any): boolean {\n    return value !== null && typeof value === 'object' && !Array.isArray(value)\n  }\n\n  getRecordLabel(item: any): string {\n    if (!item || typeof item !== 'object') {\n      return ''\n    }\n\n    return this.normalizeLabelValue(item.name) || this.normalizeLabelValue(item.first_name)\n  }\n\n  private normalizeLabelValue(value: any): string {\n    if (typeof value === 'string') {\n      return value\n    }\n\n    if (typeof value === 'number' || typeof value === 'boolean') {\n      return String(value)\n    }\n\n    return ''\n  }\n\n  // Helper to safely get data length\n  getDataLength(data: any): number {\n    if (Array.isArray(data)) {\n      return data.length\n    }\n    return 0\n  }\n\n  selectedRecord$?: Observable<ClientInfo|null>\n\n  fb = inject(FormBuilder)\n\n  streamTypes = [\n    { id: 'JSON', value: 'json' },\n    { id: 'NDJSON', value: 'ndjson' },\n    { id: 'AI Streaming', value: 'ai_streaming' },\n    { id: 'Event Stream', value: 'event_stream' },\n    { id: 'Auto', value: 'auto' },\n  ]\n\n  streamType = 'Auto'\n\n  httpManagerService = inject(HTTPManagerService)\n\n  isPending$ = this.stateManagerDemoService.isPending$\n  error$ = this.stateManagerDemoService.error$\n\n  countdown$ = this.httpManagerService.countdown$\n\n  GET_error$ = new BehaviorSubject<string>('')\n  POST_error$ = new BehaviorSubject<string>('')\n  PUT_error$ = new BehaviorSubject<string>('')\n  PATCH_error$ = new BehaviorSubject<string>('')\n  DELETE_error$ = new BehaviorSubject<string>('')\n\n  STREAM_error$ = new BehaviorSubject<string>('')\n  STREAM_AI_error$ = new BehaviorSubject<string>('')\n\n  GET$ = new BehaviorSubject<any>(null)\n  POST$ = new BehaviorSubject(null)\n  PUT$ = new BehaviorSubject(null)\n  PATCH$ = new BehaviorSubject(null)\n  DELETE$ = new BehaviorSubject(null)\n\n  STREAM = new BehaviorSubject(null)\n  STREAM$ = this.STREAM.asObservable()\n\n  STREAM_AI = new BehaviorSubject<{response: string}[]>([])\n  STREAM_AI$ = this.STREAM_AI.asObservable()\n  .pipe(\n    map((items: any) => (items) ? items.map((item: any) => item.response) : []),\n    map((items: any) => items.join('\\n').trim()),\n  )\n\n  @ViewChild(\"failedState\", { static: true }) failedState: any\n  @ViewChild(\"pollingState\", { static: true }) pollingState: any\n  @ViewChild(\"DBState\", { static: true }) DBState: any\n\n  questionControl = this.fb.control(\"\", [Validators.required])\n\n  requestType = ''\n\n  prompts: string[] = []\n\n  AIType = 0\n\n  wsMessageForm = this.fb.group({\n    channel: [''],\n    method: ['UPDATE', [Validators.required]],\n    path: ['']\n  })\n\n  get dataObservable$() {\n\n    switch (this.requestType) {\n      case 'GET':\n        return this.GET$\n\n      case 'PUT':\n        return this.PUT$\n\n      case 'PATCH':\n        return this.PATCH$\n\n      case 'POST':\n        return this.POST$\n\n      case 'DELETE':\n        return this.DELETE$\n\n      case 'STREAM':\n        return this.STREAM\n\n      case 'STREAM_AI':\n        return this.STREAM_AI\n\n      default:\n        return this.GET$\n        break;\n    }\n\n  }\n\n  sampleClientData = {\n      id: 0,\n      name: \"Old School Dates\",\n      domain: \"osd.com\",\n      service: \"osd\",\n      spiffe: \"osd.com/osd\",\n      secret: \"SMOPECXP-OS4P-USOG-X2II-3XMD1FQDR3IJX\",\n      created: 1693003138,\n      modified: 1693003138,\n      icon: \"\",\n      imageFile: \"\",\n  }\n\n  selectedRecord = this.fb.control(null)\n\n  requestForm = this.fb.group({\n    datatype: this.fb.control('ARRAY'),\n    path: this.fb.control<string>(\"ai/\"),\n    headers: this.fb.array([]),\n    adapter: [null],\n    mapper: [null],\n    selector: [''],\n    retry: this.fb.group({\n    times: [3],\n    delay: [3],\n    }),\n    polling: [3],\n    database: this.fb.group({\n      table: ['clients'],\n      expiresIn: ['1m'],\n      ignoreQueryParams: [''],\n      queryParamsExpiresIn: ['never'],\n      deltaSync: [false],\n    })\n  })\n\n  get hasChanged() {\n    return this.requestForm.dirty || this.requestForm.untouched\n  }\n\n  get dataType() {\n    return this.requestForm.get(\"datatype\")?.value\n  }\n\n  get database() {\n    return this.requestForm.get(\"database\")?.value\n  }\n\n  get deltaSyncControl() {\n    return this.requestForm.get(\"database\")?.get(\"deltaSync\") as FormControl\n  }\n\n  get retry() {\n    return this.requestForm.get(\"retry\")?.value\n  }\n\n  sampleAdaptors = [\n    { label: \"ClientInfo Basic\", value: ClientInfo.adapt },\n    { label: \"AI Prompt\", value: AIPrompt.adapt },\n  ]\n\n  sampleMappers = [\n    { label: \"Mapper Basic\", value: ClientInfoMapper.adapt },\n    { label: \"AI Prompt\", value: AIPrompt.adapt },\n  ]\n\n  get headers(): FormArray {\n    return this.requestForm.get('headers') as FormArray\n  }\n\n  get isValid() {\n    this.requestForm.markAllAsTouched()\n    return this.requestForm.valid\n  }\n\n  // server = `http://sample-endpoint/as/authorization.oauth2`\n\n  arrayObjectsToObjects = (arr: any[]) => {\n    return Array.isArray(arr) ? arr.reduce((obj, item) => Object.assign(obj, { [item.key]: item.value }), {}) : {}\n  }\n\n  props = (adapter: any) => {\n    return (adapter) ? adapter() : null\n  }\n\n  constructor() { }\n\n  ngOnInit() {\n\n    this.stateManagerDemoService.data$.pipe(\n      tap((data) => console.log(\"API STREAM_AI response\", data)),\n    )\n\n    this.error$.pipe(\n      tap((data) => {\n        debugger\n        console.log(\"API STREAM response\", data)\n      }),\n      catchError(error => {\n        return throwError(() => this.errorHandling(error, 'STREAM'))\n      })\n    )\n\n    this.selectedRecord.valueChanges\n    .subscribe((data: ClientInfo|null) => {\n      this.selectedRecord$ = (data) ? this.stateManagerDemoService.selectRecord$(data.id) : EMPTY\n    })\n\n    this.stateManagerDemoService.data$\n    .pipe(\n      tap((data: any) => {\n        // console.log('[COMPONENT] State data received:', data)\n\n        switch (this.requestType) {\n          case 'GET':\n            // console.log('[COMPONENT] Updating GET$ with data:', data)\n            this.GET$.next(data)\n            break;\n\n          case 'PUT':\n            // console.log('[COMPONENT] Updating PUT$ with data:', data)\n            this.PUT$.next(data)\n            break;\n\n          case 'PATCH':\n            // console.log('[COMPONENT] Updating PATCH$ with data:', data)\n            this.PATCH$.next(data)\n            break;\n\n          case 'POST':\n            // console.log('[COMPONENT] Updating POST$ with data:', data)\n            this.POST$.next(data)\n            break;\n\n          case 'DELETE':\n            // console.log('[COMPONENT] Updating DELETE$ with data:', data)\n            this.DELETE$.next(data)\n            break;\n\n          case 'STREAM':\n            // console.log('[COMPONENT] Updating STREAM$ with data:', data)\n            this.STREAM.next(data)\n            // Update table columns dynamically based on streaming data\n            if (data && Array.isArray(data) && data.length > 0) {\n              this.updateDisplayedColumns(data)\n            }\n            break;\n\n          case 'STREAM_AI':\n            // console.log('[COMPONENT] Updating STREAM_AI$ with data:', data)\n            this.STREAM_AI.next(data)\n            break;\n\n          default:\n            // console.log('[COMPONENT] No requestType set, ignoring data')\n            break;\n        }\n\n      })\n    ).subscribe()\n\n  }\n\n  onStreamType(type: string) {\n    this.streamType = type\n  }\n\n  addHeader() {\n    const header = this.fb.group({\n      key: ['', Validators.required],\n      value: ['']\n    });\n    this.headers.push(header)\n  }\n\n  removeHeader(index: number) {\n    this.headers.removeAt(index)\n  }\n\n  private parsePathInput(pathInput?: string): any[] {\n    const raw = typeof pathInput === 'string' ? pathInput.trim() : ''\n\n    if (!raw) {\n      return []\n    }\n\n    const [rawPath = '', rawQuery = ''] = raw.split('?', 2)\n    const pathSegments = rawPath\n      .split('/')\n      .map((segment) => segment.trim())\n      .filter((segment) => segment.length > 0)\n      .map((segment) => decodeURIComponent(segment))\n\n    if (!rawQuery) {\n      return pathSegments\n    }\n\n    const searchParams = new URLSearchParams(rawQuery)\n    const queryObject: Record<string, any> = {}\n\n    searchParams.forEach((value, key) => {\n      const normalizedKey = key.trim()\n\n      if (!normalizedKey) {\n        return\n      }\n\n      const normalizedValue = this.normalizeQueryValue(value)\n\n      if (Object.prototype.hasOwnProperty.call(queryObject, normalizedKey)) {\n        const currentValue = queryObject[normalizedKey]\n        queryObject[normalizedKey] = Array.isArray(currentValue)\n          ? [...currentValue, normalizedValue]\n          : [currentValue, normalizedValue]\n        return\n      }\n\n      queryObject[normalizedKey] = normalizedValue\n    })\n\n    return Object.keys(queryObject).length > 0\n      ? [...pathSegments, queryObject]\n      : pathSegments\n  }\n\n  private normalizeQueryValue(value: string): string | number | boolean {\n    const trimmedValue = value.trim()\n    const lowerValue = trimmedValue.toLowerCase()\n\n    if (lowerValue === 'true') {\n      return true\n    }\n\n    if (lowerValue === 'false') {\n      return false\n    }\n\n    if (trimmedValue !== '' && !Number.isNaN(Number(trimmedValue))) {\n      return Number(trimmedValue)\n    }\n\n    return trimmedValue\n  }\n\n  compileRequest() {\n\n    const requestParams = this.requestForm.value\n\n    requestParams.headers = this.arrayObjectsToObjects(\n      requestParams.headers || []\n    )\n\n    const pathReq = this.parsePathInput(requestParams.path || '')\n\n    if (!this.pollingState?.checked) requestParams.polling = 0\n\n    if (!this.failedState?.checked) {\n      requestParams.retry = { times: 0,delay: 0 }\n    }\n\n    const currentOptions = ApiRequest.adapt(requestParams)\n    currentOptions.path = []\n    currentOptions.server = this.server\n    currentOptions.adapter = this.requestForm.get('adapter')?.value || undefined\n    currentOptions.mapper = this.requestForm.get('mapper')?.value || undefined\n    currentOptions.selector = this.requestForm.get('selector')?.value || undefined\n    const apiOptions = ApiRequest.adapt({ ...currentOptions, path: pathReq })\n\n    return { apiOptions: apiOptions, path: pathReq }\n\n  }\n\n  private parseIgnoreParams(value?: string): string[] {\n    if (!value || typeof value !== 'string') {\n      return []\n    }\n\n    return value\n      .split(',')\n      .map((item) => item.trim())\n      .filter((item) => item.length > 0)\n  }\n\n  private buildDemoRequestOptions(path: any[], headers: any): RequestOptions {\n    const dbValue: any = this.database || {}\n    const isDbEnabled = !!this.DBState?.checked\n    const parsedIgnoreQueryParams = this.parseIgnoreParams(dbValue?.ignoreQueryParams)\n\n    return RequestOptions.adapt({\n      path,\n      headers,\n      forceRefresh: false,\n      ignoreQueryParams: isDbEnabled && parsedIgnoreQueryParams.length > 0 ? parsedIgnoreQueryParams : undefined,\n      queryParamsExpiresIn: isDbEnabled ? dbValue?.queryParamsExpiresIn : undefined,\n    })\n  }\n\n  onSetStateOptions() {\n\n    const dbValue = this.database\n    // console.log('[onSetStateOptions] Called, checking form values:', {\n    //   isValid: this.isValid,\n    //   database: dbValue,\n    //   hasTable: !!dbValue?.table,\n    //   tableValue: dbValue?.table,\n    //   dataType: this.dataType\n    // })\n\n    if(!this.isValid) {\n      // console.log('[onSetStateOptions] Form invalid, aborting')\n      return\n    }\n\n    const reqParams = this.compileRequest()\n\n    const db = DatabaseStorage.adapt(dbValue)\n\n    const type = this.dataType === \"ARRAY\" ? DataType.ARRAY : DataType.OBJECT\n    // console.log('[onSetStateOptions] Calling setAPIOptions with:', { db, type, hasTable: !!db?.table })\n    this.stateManagerDemoService.setAPIOptions(reqParams.apiOptions, type, db)\n\n    this.requestForm.markAsPristine()\n  }\n\n  onClearRecords() {\n    this.stateManagerDemoService.clearRecords()\n  }\n\n  deleteDatabase() {\n    this.databaseManagerService.clearDatabase()\n  }\n\n  onGetRequest() {\n    this.requestType = 'GET'\n    const reqParams = this.compileRequest()\n    const requestOptions = this.buildDemoRequestOptions(reqParams.path, reqParams.apiOptions.headers)\n    this.stateManagerDemoService.getClients(requestOptions)\n  }\n\n  onCreateRequest() {\n    this.requestType = 'POST'\n    this.stateManagerDemoService.createClient(this.sampleClientData)\n  }\n\n  onUpdateRequest() {\n    this.requestType = 'PUT'\n    this.stateManagerDemoService.updateClient(this.sampleClientData)\n  }\n\n  onPatchRequest() {\n    this.requestType = 'PATCH'\n    this.stateManagerDemoService.patchClient(this.sampleClientData)\n  }\n\n  onDeleteRequest() {\n    this.requestType = 'DELETE'\n    this.stateManagerDemoService.deleteClient(this.sampleClientData)\n  }\n\n  onStreamRequest() {\n    // console.log('[COMPONENT] onStreamRequest called')\n\n    if(!this.isValid) {\n      // console.log('[COMPONENT] Form invalid, aborting')\n      return\n    }\n\n    // console.log('[COMPONENT] Compiling request...')\n    const reqParams = this.compileRequest()\n\n    // console.log('[COMPONENT] Setting stream options:', reqParams.apiOptions)\n    reqParams.apiOptions.stream = true\n    reqParams.apiOptions.streamType = this.streamType as StreamType\n    this.requestType = 'STREAM'\n\n    const streamOptions = RequestOptions.adapt({\n      ...this.buildDemoRequestOptions(reqParams.path, reqParams.apiOptions.headers),\n    })\n\n    // console.log('[COMPONENT] Calling streamRequest...')\n    this.stateManagerDemoService.streamRequest(streamOptions)\n\n  }\n\n  errorHandling(err: any, type: string) { console.log(err, type)\n    if(type === 'GET') this.GET_error$.next(err.message)\n    if(type === 'POST') this.POST_error$.next(err.message)\n    if(type === 'PUT') this.PUT_error$.next(err.message)\n    if(type === 'PATCH') this.PATCH_error$.next(err.message)\n    if(type === 'DELETE') this.DELETE_error$.next(err.message)\n    if(type === 'STREAM') this.STREAM_error$.next(err.message)\n    if(type === 'STREAM_AI') this.STREAM_AI_error$.next(err.message)\n  }\n\n  onSelectAIType(type: number) {\n    this.AIType = type\n  }\n\n  onClearHistory() {\n    this.prompts = []\n  }\n\n  onSendWsMessage() {\n    if (this.wsMessageForm.invalid) {\n      return\n    }\n\n    const formValue = this.wsMessageForm.value\n    const channel = formValue.channel || ''\n    const method = formValue.method || 'UPDATE'\n    const pathStr = formValue.path || ''\n\n    const pathArray = pathStr\n      .split('/')\n      .map(s => s.trim())\n      .filter(s => s.length > 0)\n\n    this.stateManagerDemoService.sendWsMessage(channel, method, pathArray)\n  }\n\n}\n","<div style=\"margin: 2rem;\">\n\n  <h2>\n    HTTP Request State Manager\n  </h2>\n\n  <div [formGroup]=\"requestForm\" style=\"margin-top: 2rem;\">\n    <div style=\"display: flex; gap: .5rem\">\n      <mat-form-field appearance=\"outline\">\n        <mat-label>State Data Type</mat-label>\n        <mat-select formControlName=\"datatype\">\n          <mat-option value=\"ARRAY\">Array</mat-option>\n          <mat-option value=\"OBJECT\">Object</mat-option>\n        </mat-select>\n      </mat-form-field>\n    </div>\n    <div style=\"display: flex; gap: .5rem\">\n      <mat-form-field appearance=\"outline\">\n        <mat-label>Adapter (Model)</mat-label>\n        <mat-select formControlName=\"adapter\" #adapterSelect>\n          <mat-option>None</mat-option>\n          @for (adapter of sampleAdaptors; track adapter) {\n            <mat-option [value]=\"adapter.value\">\n              {{adapter.label}}\n            </mat-option>\n          }\n        </mat-select>\n      </mat-form-field>\n      <mat-form-field appearance=\"outline\">\n        <mat-label>Mapper (Model)</mat-label>\n        <mat-select formControlName=\"mapper\" #mapperSelect>\n          <mat-option>None</mat-option>\n          @for (mapper of sampleMappers; track mapper) {\n            <mat-option [value]=\"mapper.value\">\n              {{mapper.label}}\n            </mat-option>\n          }\n        </mat-select>\n      </mat-form-field>\n      <mat-form-field appearance=\"outline\">\n        <mat-label>Selector (response path)</mat-label>\n        <input matInput placeholder=\"data.items\" formControlName=\"selector\">\n      </mat-form-field>\n    </div>\n\n    @if (adapterSelect.value || mapperSelect.value) {\n      <div style=\"display: flex; margin-bottom: 2rem;\">\n        <div style=\"flex:1\" class=\"box\">\n          <h3>Adapter (Incoming)</h3>\n          @if (adapterSelect.value) {\n            <div>\n              {{ props(adapterSelect.value) | json }}\n            </div>\n          } @else {\n            No Transformation\n          }\n        </div>\n        <div style=\"flex:1\" class=\"box\">\n          <h3>Mapper (Outgoing)</h3>\n          @if (mapperSelect.value) {\n            <div>\n              {{ props(mapperSelect.value) | json }}\n            </div>\n          } @else {\n            No Transformation\n          }\n        </div>\n      </div>\n    }\n\n    <div style=\"display: flex; gap: .5rem\">\n      <mat-form-field appearance=\"outline\" style=\"flex:1\">\n        <mat-label>RestPath (/ delimited)</mat-label>\n        <input matInput placeholder=\"clients/list\" formControlName=\"path\">\n      </mat-form-field>\n    </div>\n    <div>\n      <div formArrayName=\"headers\">\n        @for (task of headers.controls; track task; let i = $index) {\n          <div [formGroupName]=\"i\">\n            <div style=\"display: flex; gap: .5rem\">\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Key</mat-label>\n                <input matInput placeholder=\"authentication\" formControlName=\"key\">\n              </mat-form-field>\n              <mat-form-field appearance=\"outline\" style=\"flex:1\">\n                <mat-label>Value</mat-label>\n                <input matInput placeholder=\"sample\" formControlName=\"value\">\n              </mat-form-field>\n              <div style=\"margin-top: .5rem;\">\n                <button mat-icon-button (click)=\"removeHeader(i)\">\n                  <mat-icon>close</mat-icon>\n                </button>\n              </div>\n            </div>\n          </div>\n        }\n      </div>\n      <button mat-stroked-button (click)=\"addHeader()\">Add Header</button>\n    </div>\n    <div style=\"margin-top: 2rem; display: flex; flex-direction:column; gap: 1rem;\">\n      <div>\n        <mat-slide-toggle #failedState>Retry on Failed</mat-slide-toggle>\n        @if (failedState?.checked) {\n          <div style=\"display: flex; gap: .5rem; margin-top: 1rem;\" formGroupName=\"retry\">\n            <mat-form-field appearance=\"outline\">\n              <mat-label>#of Times</mat-label>\n              <input matInput placeholder=\"3\" formControlName=\"times\" value=\"3\">\n            </mat-form-field>\n            <mat-form-field appearance=\"outline\">\n              <mat-label>Delay Until Next</mat-label>\n              <input matInput placeholder=\"3\" formControlName=\"delay\" value=\"3\">\n            </mat-form-field>\n          </div>\n        }\n      </div>\n      <div>\n        <mat-slide-toggle #pollingState>Polling</mat-slide-toggle>\n        @if (pollingState?.checked) {\n          <div>\n            <mat-form-field appearance=\"outline\" style=\"margin-top: 1rem\">\n              <mat-label>#of Seconds</mat-label>\n              <input matInput placeholder=\"3\" formControlName=\"polling\" value=\"3\">\n            </mat-form-field>\n          </div>\n        }\n      </div>\n      <div>\n        <mat-slide-toggle #DBState>Database Storage</mat-slide-toggle>\n        <div style=\"margin-top: 1rem;\">\n          <mat-slide-toggle [formControl]=\"deltaSyncControl\" [disabled]=\"!DBState?.checked\">Delta Sync</mat-slide-toggle>\n        </div>\n        @if (DBState?.checked) {\n          <div style=\"margin-top: 1rem\" formGroupName=\"database\">\n            <div style=\"display: flex; gap: .5rem;\">\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Table Name</mat-label>\n                <input matInput placeholder=\"table\" formControlName=\"table\" value=\"\">\n              </mat-form-field>\n              <div>\n                <mat-form-field appearance=\"outline\">\n                  <mat-label>Expires In</mat-label>\n                  <mat-select formControlName=\"expiresIn\">\n                    <mat-option value=\"1m\">One Minute</mat-option>\n                    <mat-option value=\"1h\">One Hour</mat-option>\n                    <mat-option value=\"1d\">One Day</mat-option>\n                  </mat-select>\n                </mat-form-field>\n              </div>\n            </div>\n            <div style=\"display: flex; gap: .5rem;\">\n              <mat-form-field appearance=\"outline\" style=\"flex:1\">\n                <mat-label>Ignore Params (comma delimited)</mat-label>\n                <input matInput placeholder=\"sort,active\" formControlName=\"ignoreQueryParams\" value=\"\">\n              </mat-form-field>\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Watch Param Expiry</mat-label>\n                <mat-select formControlName=\"queryParamsExpiresIn\">\n                  <mat-option value=\"never\">Never</mat-option>\n                  <mat-option value=\"10s\">10 Seconds</mat-option>\n                  <mat-option value=\"30s\">30 Seconds</mat-option>\n                  <mat-option value=\"1m\">1 Minute</mat-option>\n                  <mat-option value=\"5m\">5 Minutes</mat-option>\n                  <mat-option value=\"10m\">10 Minutes</mat-option>\n                  <mat-option value=\"1h\">1 Hour</mat-option>\n                  <mat-option value=\"1d\">1 Day</mat-option>\n                </mat-select>\n              </mat-form-field>\n            </div>\n            <div style=\"margin-top: .5rem; display: flex; gap: .5rem;\">\n              <button mat-stroked-button color=\"warn\" (click)=\"onClearRecords()\">Clear Table</button>\n              <button mat-stroked-button color=\"warn\" (click)=\"deleteDatabase()\">Delete Database</button>\n            </div>\n          </div>\n        }\n      </div>\n      <div style=\"margin-top: 1rem; display: flex;\">\n        <span style=\"flex:1\"></span>\n        <button mat-stroked-button (click)=\"onSetStateOptions()\" [disabled]=\"!hasChanged\">\n          Set API Request Options\n        </button>\n      </div>\n      <div>\n        @if ((error$ | async); as error) {\n          <mat-error>\n            {{ error }}\n          </mat-error>\n        }\n      </div>\n    </div>\n  </div>\n\n  <div style=\"margin-bottom: 1rem; margin-top: 2rem;\">\n    @if ((isPending$ | async)) {\n      <mat-progress-bar mode=\"indeterminate\"\n      ></mat-progress-bar>\n    }\n    @if (pollingState?.checked) {\n      <div>\n        @if (!(isPending$ | async) && (this.countdown$ | async) || -1 > 0) {\n          <mat-progress-bar mode=\"determinate\"\n            [value]=\"(this.countdown$ | async)\"\n          ></mat-progress-bar>\n        }\n      </div>\n    }\n\n  </div>\n\n  @if ((GET$ | async); as data) {\n    <div style=\"margin-top: 2rem\">\n      <div style=\"display: flex;\">\n        <h2 style=\"flex:1;\">CURRENT STATE ({{ dataType }})</h2>\n      </div>\n      @if (data.length > 1) {\n        <div>\n          <mat-form-field appearance=\"outline\">\n            <mat-label>Records</mat-label>\n            <mat-select [formControl]=\"selectedRecord\">\n              <mat-option [value]=\"\">None</mat-option>\n              @for (item of data; track $index) {\n                <mat-option [value]=\"item\">\n                  {{ getRecordLabel(item) | titlecase }}\n                </mat-option>\n              }\n            </mat-select>\n          </mat-form-field>\n        </div>\n      }\n      @if ((dataObservable$ | async); as dataRecord) {\n        <div>\n          @if ((selectedRecord$ | async); as record) {\n            <div>\n              {{ record | json }}\n            </div>\n          } @else {\n            No Record Selected from State\n          }\n        </div>\n      }\n      <div style=\"margin-top: 1rem;\">\n        @if (data !== null && data?.length > 0) {\n          <span>\n            State contains a Total of {{ data.length }} Records\n          </span>\n        } @else {\n          No Records\n        }\n        <div style=\"display: flex; gap: .5rem; text-align: end; justify-content: flex-end;\">\n          <button class=\"btn\" mat-stroked-button (click)=\"onClearRecords()\">Clear</button>\n        </div>\n      </div>\n    </div>\n  }\n\n\n\n\n  <div style=\"margin-top: 1rem\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <div style=\"display: flex;\">\n      <h2 style=\"flex:1\">GET Request ({{ dataType }})</h2>\n      <div>\n        <button mat-raised-button (click)=\"onGetRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n      </div>\n    </div>\n\n    @if ((GET_error$ | async); as get_error) {\n      <div style=\"margin-top: .5rem;\">\n        <mat-error>{{ get_error }}</mat-error>\n      </div>\n    }\n\n    <div style=\"margin-top: 1rem;\">\n      <!-- <div [innerHTML]=\"(GET$ | async) | jsonv\"></div> -->\n      @if ((GET$ | async); as getData) {\n        <div>{{ getData | json }}</div>\n      }\n    </div>\n\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <div style=\"display: flex;\">\n      <h2 style=\"flex:1\">POST Request</h2>\n      <div>\n        <button mat-raised-button (click)=\"onCreateRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n      </div>\n    </div>\n\n    @if ((POST_error$ | async); as post_error) {\n      <div style=\"margin-top: .5rem;\">\n        <mat-error>{{ post_error }}</mat-error>\n      </div>\n    }\n\n    <div style=\"margin-top: 1rem;\">\n      <!-- <div [innerHTML]=\"(POST$ | async) | jsonv\"></div> -->\n      @if ((POST$ | async); as postData) {\n        <div>{{ postData | json }}</div>\n      }\n    </div>\n\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <div style=\"display: flex;\">\n      <h2 style=\"flex:1\">PUT Request</h2>\n      <div>\n        <button mat-raised-button (click)=\"onUpdateRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n      </div>\n    </div>\n\n    @if ((PUT_error$ | async); as put_error) {\n      <div style=\"margin-top: .5rem;\">\n        <mat-error>{{ put_error }}</mat-error>\n      </div>\n    }\n\n    <div style=\"margin-top: 1rem;\">\n      <!-- <div [innerHTML]=\"(PUT$ | async) | jsonv\"></div> -->\n      @if ((PUT$ | async); as putData) {\n        <div>{{ putData | json }}</div>\n      }\n    </div>\n\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <div style=\"display: flex;\">\n      <h2 style=\"flex:1\">DELETE Request</h2>\n      <div>\n        <button mat-raised-button (click)=\"onDeleteRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n      </div>\n    </div>\n\n    @if ((DELETE_error$ | async); as delete_error) {\n      <div style=\"margin-top: .5rem;\">\n        <mat-error>{{ delete_error }}</mat-error>\n      </div>\n    }\n\n    <div style=\"margin-top: 1rem;\">\n      <!-- <div [innerHTML]=\"(DELETE$ | async) | jsonv\"></div> -->\n      @if ((DELETE$ | async); as deleteData) {\n        <div>{{ deleteData | json }}</div>\n      }\n    </div>\n\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <div style=\"display: flex;\">\n      <h2 style=\"flex:1\">PATCH Request</h2>\n      <div>\n        <button mat-raised-button (click)=\"onPatchRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n      </div>\n    </div>\n\n    @if ((PATCH_error$ | async); as patch_error) {\n      <div style=\"margin-top: .5rem;\">\n        <mat-error>{{ patch_error }}</mat-error>\n      </div>\n    }\n\n    <div style=\"margin-top: 1rem;\">\n      @if ((PATCH$ | async); as patchData) {\n        <div>{{ patchData | json }}</div>\n      }\n    </div>\n\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <div style=\"display: flex;\">\n      <h2 style=\"flex:1\">Streaming GET Request</h2>\n      <div style=\"display: flex; gap: 1rem; align-items: center;\">\n        <div style=\"display: flex; gap: 1rem; align-items: center;\">\n          {{ streamType }}\n          <button mat-icon-button [matMenuTriggerFor]=\"menu\">\n            <mat-icon>data_usage</mat-icon>\n          </button>\n        </div>\n        <mat-menu #menu=\"matMenu\">\n          @for (item of streamTypes; track item) {\n            <button mat-menu-item (click)=\"onStreamType(item.id)\">{{ item.value }}</button>\n          }\n        </mat-menu>\n        <button mat-raised-button (click)=\"onStreamRequest()\" class=\"btn\" [disabled]=\"hasChanged\">Request</button>\n      </div>\n    </div>\n\n    @if ((STREAM_error$ | async); as stream_error) {\n      <div style=\"margin-top: .5rem;\">\n        <mat-error>{{ stream_error }}</mat-error>\n      </div>\n    }\n\n    <div style=\"margin-top: 1rem;\">\n      @if ((STREAM$ | async); as data) {\n        <div class=\"container\">\n          <table mat-table [dataSource]=\"data\" class=\"mat-elevation-z8\">\n\n            <!-- Dynamic columns -->\n            @for (column of displayedColumns; track column) {\n              <ng-container [matColumnDef]=\"column\">\n                <th mat-header-cell *matHeaderCellDef> {{ column | titlecase }} </th>\n                <td mat-cell *matCellDef=\"let element\">\n                  @if (isObject(element[column]); as objValue) {\n                    <pre style=\"margin: 0; font-size: 0.8em; white-space: pre-wrap;\">{{ objValue | json }}</pre>\n                  } @else {\n                    {{ element[column] }}\n                  }\n                </td>\n              </ng-container>\n            }\n\n            <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n            <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n          </table>\n\n          <!-- Debug info -->\n          <div style=\"margin-top: 1rem; font-size: 0.8em; color: #666;\">\n            Columns: {{ displayedColumns.join(', ') }} | Data received\n          </div>\n        </div>\n      }\n    </div>\n\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <div style=\"display: flex;\">\n      <h2 style=\"flex:1\">WebSocket Message to Channel</h2>\n    </div>\n\n    <div [formGroup]=\"wsMessageForm\" style=\"margin-top: 1rem; display: flex; gap: 1rem; align-items: center;\">\n      <mat-form-field appearance=\"outline\" style=\"flex:1\">\n        <mat-label>Channel (optional)</mat-label>\n        <input matInput placeholder=\"ai/tests or leave empty for state channel\" formControlName=\"channel\">\n      </mat-form-field>\n\n      <mat-form-field appearance=\"outline\">\n        <mat-label>Method</mat-label>\n        <mat-select formControlName=\"method\">\n          <mat-option value=\"UPDATE\">UPDATE</mat-option>\n          <mat-option value=\"CREATE\">CREATE</mat-option>\n          <mat-option value=\"DELETE\">DELETE</mat-option>\n          <mat-option value=\"GET\">GET</mat-option>\n        </mat-select>\n      </mat-form-field>\n\n      <mat-form-field appearance=\"outline\" style=\"flex:2\">\n        <mat-label>Path (/ delimited)</mat-label>\n        <input matInput placeholder=\"ai/tests/63\" formControlName=\"path\">\n      </mat-form-field>\n\n      <button mat-raised-button (click)=\"onSendWsMessage()\" color=\"primary\" class=\"btn\">Send Message</button>\n    </div>\n\n    <div style=\"margin-top: 1rem; font-size: 0.85em; color: #666;\">\n      <p>Sends a WebSocket message to trigger a fetchRecord operation on the specified channel. The message will trigger the state manager to fetch and update the database record.</p>\n      <ul>\n        <li><strong>Channel:</strong> Leave empty to use the configured state channel (SYS-prefixed), or specify a custom channel name</li>\n        <li><strong>Method:</strong> The CRUD operation type (UPDATE, CREATE, DELETE, GET)</li>\n        <li><strong>Path:</strong> The resource path (e.g., \"ai/tests/63\" for record 63)</li>\n      </ul>\n    </div>\n  </div>\n\n</div>\n","import { Component, Input, OnInit, ViewChild, inject, ChangeDetectionStrategy } from '@angular/core'\n\nimport { BehaviorSubject, EMPTY, Observable, throwError, of } from 'rxjs'\nimport { FormArray, FormBuilder, Validators } from '@angular/forms'\nimport { catchError, tap, map } from 'rxjs/operators'\n\nimport { ClientInfo } from './models/sample-client-info'\nimport { ClientInfoMapper } from './models/sample-mapper-client-info'\nimport { AIPrompt } from './models/sample-ai-prompt'\nimport { ApiRequest, HTTPManagerService, StreamType, BatchOptions, BatchRequestState, BatchProgress, calculateBatchProgress } from '../..'\n\nimport { ToastColors, ToastDisplay, ToastMessageDisplayService } from 'toast-message-display'\n\n@Component({\n    selector: 'app-request-manager-demo',\n    templateUrl: './request-manager-demo.component.html',\n    styleUrls: ['./request-manager-demo.component.scss'],\n    providers: [HTTPManagerService],\n    changeDetection: ChangeDetectionStrategy.Default,\n    standalone: false\n})\nexport class RequestManagerDemoComponent implements OnInit {\n\n  @Input() server = 'http://localhost:8080'\n  @Input() adapter?: Function\n  @Input() mapper?: Function\n\n  // Matches src/environments/environment.ts's `streamTest` value, duplicated here rather than\n  // imported: this file compiles as part of the standalone http-request-manager library build\n  // (ng-packagr), which cannot reach outside its own project root for a source file to\n  // type-check and emit declarations against — doing so crashes the Angular compiler (same\n  // constraint documented on request-manager-basic-demo.component.ts). `server` above can't\n  // double as a genuine streaming source since it's now bound to a jsonplaceholder-style target,\n  // which only ever returns one complete JSON body, never real chunked/streaming output.\n  streamTestServer = 'streamTest'\n\n  displayedColumns: string[] = []\n\n  // Dynamic columns based on data structure\n  getColumnsFromData(data: any[]): string[] {\n    if (!data || data.length === 0) {\n      return []\n    }\n\n    const firstRecord = data[0]\n    if (!firstRecord || typeof firstRecord !== 'object') {\n      return []\n    }\n\n    // Extract all keys from the first record, excluding null/undefined\n    return Object.keys(firstRecord).filter(key =>\n      firstRecord[key] !== null && firstRecord[key] !== undefined\n    )\n  }\n\n  // Update displayed columns when data changes\n  updateDisplayedColumns(data: any[]): void {\n    this.displayedColumns = this.getColumnsFromData(data)\n    console.log('[DEMO] Updated columns:', this.displayedColumns)\n  }\n\n  // Helper to check if value is an object\n  isObject(value: any): boolean {\n    return value !== null && typeof value === 'object' && !Array.isArray(value)\n  }\n\n  private fb = inject(FormBuilder)\n  private toastMessage = inject(ToastMessageDisplayService)\n\n  questionControl = this.fb.control(\"\", [Validators.required])\n\n  httpManagerService = inject(HTTPManagerService)\n\n  isPending$ = this.httpManagerService.isPending$\n  countdown$ = this.httpManagerService.countdown$\n\n  GET_error$ = new BehaviorSubject<string>('')\n  POST_error$ = new BehaviorSubject<string>('')\n  PUT_error$ = new BehaviorSubject<string>('')\n  PATCH_error$ = new BehaviorSubject<string>('')\n  DELETE_error$ = new BehaviorSubject<string>('')\n\n  STREAM_error$ = new BehaviorSubject<string>('')\n  STREAM_AI_error$ = new BehaviorSubject<string>('')\n\n  GET$?: Observable<any>\n  POST$?: Observable<any>\n  PUT$?: Observable<any>\n  PATCH$?: Observable<any>\n  DELETE$?: Observable<any>\n\n  STREAM$?: Observable<any>\n  STREAM_AI$?: Observable<any>\n\n  // Batch request properties\n  parallelBatch$?: Observable<any[]>\n  sequentialBatch$?: Observable<any[]>\n  parallelExecutionTime?: number\n  sequentialExecutionTime?: number\n  parallelResults?: any[]\n  sequentialResults?: any[]\n  isParallelLoading = false\n  isSequentialLoading = false\n  parallelError?: string\n  sequentialError?: string\n\n  // Parallel batch states for individual request tracking\n  parallelBatchStates: (BatchRequestState<any> | undefined)[] = []\n\n  // Sequential batch states for individual request tracking\n  sequentialBatchStates: (BatchRequestState<any> | undefined)[] = []\n\n  // Stream batch request properties\n  streamBatchStates: (BatchRequestState<any> | undefined)[] = []\n  streamProgress?: BatchProgress\n  streamExecutionTime?: number\n  isStreamLoading = false\n  streamError?: string\n\n  // Computed properties for filtered states (removes undefined)\n  get filteredParallelStates(): BatchRequestState<any>[] {\n    return this.parallelBatchStates.filter(s => s !== undefined) as BatchRequestState<any>[]\n  }\n\n  get filteredSequentialStates(): BatchRequestState<any>[] {\n    return this.sequentialBatchStates.filter(s => s !== undefined) as BatchRequestState<any>[]\n  }\n\n  get filteredStreamStates(): BatchRequestState<any>[] {\n    return this.streamBatchStates.filter(s => s !== undefined) as BatchRequestState<any>[]\n  }\n\n  requestParams = {\n    GET: ApiRequest.adapt(),\n    POST: ApiRequest.adapt(),\n    PUT: ApiRequest.adapt(),\n    PATCH: ApiRequest.adapt(),\n    DELETE: ApiRequest.adapt(),\n    STREAM: ApiRequest.adapt(),\n  }\n\n  streamTypes = [\n    { id: 'JSON', value: 'json' },\n    { id: 'NDJSON', value: 'ndjson' },\n    { id: 'AI Streaming', value: 'ai_streaming' },\n    { id: 'Event Stream', value: 'event_stream' },\n    { id: 'Auto', value: 'auto' },\n  ]\n\n  streamType = 'Auto'\n\n  @ViewChild(\"failedState\", { static: true }) failedState: any\n  @ViewChild(\"pollingState\", { static: true }) pollingState: any\n\n  downloadRequest = ApiRequest.adapt({\n    server: 'assets/images',\n    path: ['lego.png'],\n    saveAs: 'john.jpg', // Optional\n    headers: { 'Authorization': 'Bearer Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6InJ0c0ZULWItN0x1WTdEVlllU05LY0lKN1ZuYyJ9.eyJhdWQiOiI4ODhhMzFjZS01OWQzLTRhMTItYTU5Ni04ZDYyZjY0MWI1MDUiLCJpc3MiOiJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20vNmY0MTE5ODItY2YyMy00ZTQ1LTk0NDktNGI2MDdiN2E4OGVjL3YyLjAiLCJpYXQiOjE3NjU4MzQxNDksIm5iZiI6MTc2NTgzNDE0OSwiZXhwIjoxNzY1ODM5NzQ2LCJhY2N0IjowLCJhaW8iOiJBV1FBbS84YUFBQUFVUEZOYUhSZkZ4ZVkwRWthcFBzdWZaNG1QYXV6YVRoODRRZUtQRzkrbEFIVE5XanVwQy9ZSjEwK2IrMktWVlJSSXZRNFpwS2xyWTFGd0xRZmtXOTNLbkRNckxSeEMzWTVOOGlQREZ4b1liZExucW1QL1N1ZE1pRW1Va05tTklSWSIsImF6cCI6Ijg4OGEzMWNlLTU5ZDMtNGExMi1hNTk2LThkNjJmNjQxYjUwNSIsImF6cGFjciI6IjAiLCJncm91cHMiOlsiZWE2ZDk5YjAtNDgyNC00MDU0LTk0MTQtZDNhOTZkZDA3MjRiIl0sIm5hbWUiOiJHVExDIEFwcCBTdXBlciBBZG1pbiIsIm9pZCI6IjI2NzUxY2I2LWNlMDEtNDMzMC05OTc0LWZjMzgxMjQ3YTEzYyIsInByZWZlcnJlZF91c2VybmFtZSI6Imd0bGMwMDNAZ3RsYy5jYSIsInJoIjoiMS5BUzRBZ2hsQmJ5UFBSVTZVU1V0Z2UzcUk3TTR4aW9qVFdSSktwWmFOWXZaQnRRVm1BYTR1QUEuIiwicm9sZXMiOlsiZ3RsYy5hY2wuc3VwZXJhZG1pbiJdLCJzY3AiOiJHVExDX0FwcGxpY2F0aW9uIiwic2lkIjoiMDAzZjVhZDktZmJmNi1jZTkyLTg3MjItMWEzNDExYjMzMDJiIiwic3ViIjoiS0RYQ3drVlhUbTRUUmcwaTkxbXZDZzgtQ29uLXpWbk5FQ2Y5LVg0dkpzUSIsInRpZCI6IjZmNDExOTgyLWNmMjMtNGU0NS05NDQ5LTRiNjA3YjdhODhlYyIsInVwbiI6Imd0bGMwMDNAZ3RsYy5jYSIsInV0aSI6InpBaTJoMmpVUUVHbVY0RTJXMWxqQUEiLCJ2ZXIiOiIyLjAiLCJ3aWRzIjpbImI3OWZiZjRkLTNlZjktNDY4OS04MTQzLTc2YjE5NGU4NTUwOSJdLCJ4bXNfZnRkIjoiUDJraW1ZM0tqc1BTRndxNHlZdmJ0bGhrSUk3d2tXNmFpcW1FQ1BaNEdja0JkWE5sWVhOMExXUnpiWE0ifQ.LzppoggMm27smSAy9SamtPN95vCzdELCAfhtOj5n_T_H6g9xCmNRLS9FaUFQMau6Qvl0lROKl7WDklTswLFkfxbIxCBWtXdL-LTqT5cDURSJAll8vC3zlN3Hg9pAFBUVZFRolt6Z7LvPdI3pvUOQs0yFwVzp9k6cLF8aemKdwKQrMX3XXua1MfBWZcqQ4WiBVNmKh8w6yQB35I4u5WqdFnu33nUGb-kvc18SOpoUfiJnlV-PudaEzFXdU3CjAaMEcuPFv5xLwWJKuhU73dNH4EyQDFMVGtcIHNnieOfiY_nK2_0-5DM6aI40UIRK6Bt-HmMQpnbhLps5y3ep6Z7RNw' } // Optional\n  })\n\n  // downloadRequest = ApiRequest.adapt({\n  //   server: 'oidc/ai/file'\n  // })\n\n  sampleClientData = {\n      id: 0,\n      name: \"Old School Dates\",\n      domain: \"osd.com\",\n      service: \"osd\",\n      spiffe: \"osd.com/osd\",\n      secret: \"SMOPECXP-OS4P-USOG-X2II-3XMD1FQDR3IJX\",\n      created: 1693003138,\n      modified: 1693003138,\n      icon: \"\",\n      imageFile: \"\",\n      email: \"wavecoders@gmail.com\"\n  }\n\n  // PATCH is a partial update: only the fields actually changing, not the\n  // whole resource (that's PUT's job). No `id` here either — the record is\n  // already identified by the URL path, not the body.\n  sampleClientPatchData = {\n      name: \"Old School Dates (patched)\",\n      modified: Date.now()\n  }\n\n  requestForm = this.fb.group({\n    path: this.fb.control<string>(\"ai/\"),\n    headers: this.fb.array([]),\n    adapter: [null],\n    mapper: [null],\n    selector: [''],\n    retry: this.fb.group({\n      times: [3],\n      delay: [3],\n    }),\n    polling: [3],\n  })\n\n  AIType = 0\n\n  sampleAdaptors = [\n    { label: \"ClientInfo Basic\", value: ClientInfo.adapt },\n    { label: \"AI Prompt\", value: AIPrompt.adapt },\n  ]\n\n  sampleMappers = [\n    { label: \"Mapper Basic\", value: ClientInfoMapper.adapt },\n    { label: \"AI Prompt\", value: AIPrompt.adapt },\n  ]\n\n  get retry() {\n    return this.requestForm.get('retry')?.value\n  }\n\n  get headers(): FormArray {\n    return this.requestForm.get('headers') as FormArray\n  }\n\n  get isValid() {\n    this.requestForm.markAllAsTouched()\n    return this.requestForm.valid\n  }\n\n  hasId = (arr: any[]) => {\n    if (arr.length === 0) return false\n    return !isNaN(arr[arr.length - 1])\n  }\n\n  props = (adapter: any) => {\n    return (adapter) ? adapter() : null\n  }\n\n  // server = `http://sample-endpoint/as/authorization.oauth2`\n\n  arrayObjectsToObjects = (arr: any[]) => {\n    return Array.isArray(arr) ? arr.reduce((obj, item) => Object.assign(obj, { [item.key]: item.value }), {}) : {}\n  }\n\n  constructor() { }\n\n  ngOnInit() {\n\n    // const reqGet2 = ApiRequest.adapt({\n    //   server,\n    //   path: ['clients'],\n    //   headers: { authentication: \"Bearer <KEY>\" },\n    //   adapter: ClientInfo,\n    //   dataType: DataType.OBJECT,\n    //   // concurrent: false,\n    //   // polling: 3, //seconds\n    // })\n\n    // const req2 = [1024,1025,1026].map(item => {\n    //   return this.httpManagerService.getRequest<ClientInfo[]>(reqGet2, [item])\n    //   .pipe(\n    //     catchError(error => {\n    //       return throwError(() => new Error(error.error.message))\n    //     })\n    //   )\n    // })\n\n    // forkJoin(req2)\n    // .subscribe(res => console.log(res))\n\n  }\n\n  onStreamType(type: string) {\n    this.streamType = type\n  }\n\n  addHeader() {\n    const header = this.fb.group({\n      key: ['', Validators.required],\n      value: ['']\n    })\n    this.headers.push(header)\n  }\n\n  removeHeader(index: number) {\n    this.headers.removeAt(index)\n  }\n\n  compileRequest() {\n\n    const requestParams = this.requestForm.value\n\n    requestParams.headers = this.arrayObjectsToObjects(\n      requestParams.headers || []\n    )\n\n    const pathReq = (requestParams.path === \"\") ? [] : (requestParams.path || \"\").split(\"/\")\n\n    if (!this.pollingState?.checked) requestParams.polling = 0\n\n    if (!this.failedState?.checked) {\n      requestParams.retry = { times: 0,delay: 0 }\n    }\n\n    const apiOptions = ApiRequest.adapt(requestParams)\n    apiOptions.displayError = true\n    apiOptions.path = []\n    apiOptions.server = this.server\n    apiOptions.adapter = this.requestForm.get('adapter')?.value || undefined\n    apiOptions.mapper = this.requestForm.get('mapper')?.value || undefined\n    apiOptions.selector = this.requestForm.get('selector')?.value || undefined\n    return { apiOptions: apiOptions, path: pathReq }\n\n  }\n\n  onGetRequest() {\n\n    if(!this.isValid) return\n\n    const reqParams = this.compileRequest()\n\n    this.requestParams.GET = reqParams.apiOptions\n\n    this.GET$ = EMPTY //Cancels Previous\n    this.GET_error$.next('')\n\n    this.GET$ = this.httpManagerService.getRequest<ClientInfo[]>({...reqParams.apiOptions}, reqParams.path)\n    .pipe(\n      // tap((data) => console.log(\"API GET response\", data)),\n      catchError(error => {\n        return throwError(() => this.errorHandling(error, 'GET'))\n      })\n    )\n\n  }\n\n  onCreateRequest() {\n\n    if(!this.isValid) return\n\n    const reqParams = this.compileRequest()\n    this.requestParams.POST = reqParams.apiOptions\n\n    this.POST$ = EMPTY //Cancels Previous\n    this.POST_error$.next('')\n\n    console.log(\"POST\", this.sampleClientData)\n    console.log(\"POST\", reqParams.apiOptions)\n    console.log(\"POST\", reqParams.path)\n\n    this.POST$ = this.httpManagerService.postRequest<ClientInfo>(this.sampleClientData, reqParams.apiOptions, reqParams.path)\n    .pipe(\n      // tap((data) => console.log(\"API POST response\", data)),\n      catchError(error => {\n        return throwError(() => this.errorHandling(error, 'POST'))\n      })\n    )\n\n  }\n\n  onUpdateRequest() {\n\n    if(!this.isValid) return\n\n    const reqParams = this.compileRequest()\n\n    if(!this.hasId(reqParams.path)) {\n      console.log(\"Missing ID\")\n      return\n    }\n\n    this.sampleClientData.id = parseInt(reqParams.path[reqParams.path.length-1])\n    this.requestParams.PUT = reqParams.apiOptions\n\n    this.PUT$ = EMPTY //Cancels Previous\n    this.PUT_error$.next('')\n\n    this.PUT$ = this.httpManagerService.putRequest<any>(this.sampleClientData, reqParams.apiOptions, reqParams.path)\n    .pipe(\n      // tap((data) => console.log(\"API PUT response\", data)),\n      catchError(error => {\n        return throwError(() => this.errorHandling(error, 'PUT'))\n      })\n    )\n\n  }\n\n  onPatchRequest() {\n\n    if(!this.isValid) return\n\n    const reqParams = this.compileRequest()\n\n    if(!this.hasId(reqParams.path)) {\n      console.log(\"Missing ID\")\n      return\n    }\n\n    this.requestParams.PATCH = reqParams.apiOptions\n\n    this.PATCH$ = EMPTY //Cancels Previous\n    this.PATCH_error$.next('')\n\n    this.PATCH$ = this.httpManagerService.patchRequest<any>(this.sampleClientPatchData, reqParams.apiOptions, reqParams.path)\n    .pipe(\n      // tap((data) => console.log(\"API PATCH response\", data)),\n      catchError(error => {\n        return throwError(() => this.errorHandling(error, 'PATCH'))\n      })\n    )\n\n  }\n\n  onDeleteRequest() {\n\n    if(!this.isValid) return\n\n    const reqParams = this.compileRequest()\n    this.requestParams.DELETE = reqParams.apiOptions\n\n    if(!this.hasId(reqParams.path)) {\n      console.log(\"Missing ID\")\n      return\n    }\n\n    this.sampleClientData.id = parseInt(reqParams.path[reqParams.path.length-1])\n    this.requestParams.DELETE = reqParams.apiOptions\n\n    this.DELETE$ = EMPTY //Cancels Previous\n    this.DELETE_error$.next('')\n\n    this.DELETE$ = this.httpManagerService.deleteRequest<ClientInfo>(reqParams.apiOptions, reqParams.path)\n    .pipe(\n      // tap((data) => console.log(\"API DELETE response\", data)),\n      catchError(error => {\n        return throwError(() => this.errorHandling(error, 'DELETE'))\n      })\n    )\n\n  }\n\n  onStreamPostRequest() {\n\n    if (!this.isValid) return\n\n    const reqParams = this.compileRequest()\n\n    let payload = {}\n    let apiPath: string[] = reqParams.path\n    let apiOptions = reqParams.apiOptions\n    let responseMapper: (items: any) => any = (items) => items.response\n\n    if (this.AIType === 0) {\n\n      // API request\n      payload = { prompt: this.questionControl.value }\n\n    } else {\n\n      // Local Ollama request\n      apiOptions.server = \"api\"\n      apiPath = [\"generate\"]\n      apiOptions.stream = true\n      apiOptions.streamType = this.streamType as StreamType\n      payload = {\n        model: \"phi3:latest\",\n        prompt: this.questionControl.value,\n        stream: true,\n      }\n\n      responseMapper = (items) => items.map((word: any) => word.response).flat().join('')\n\n    }\n\n    this.requestParams.STREAM = apiOptions\n    this.STREAM_AI$ = EMPTY\n    this.STREAM_AI_error$.next('')\n\n    this.STREAM_AI$ = this.httpManagerService.postRequest<any>(payload, apiOptions, apiPath).pipe(\n      map(responseMapper),\n      tap(() => this.questionControl.reset()),\n      catchError(error => throwError(() => this.errorHandling(error, 'STREAM')))\n    )\n\n  }\n\n\n  onStreamRequest() {\n\n    if(!this.isValid) return\n\n    const reqParams = this.compileRequest()\n\n    reqParams.apiOptions.server = this.streamTestServer\n    reqParams.apiOptions.stream = true\n    reqParams.apiOptions.streamType = StreamType.NDJSON\n\n    this.requestParams.GET = reqParams.apiOptions\n    this.STREAM$ = this.httpManagerService.getRequest<ClientInfo[]>(reqParams.apiOptions, ['stream', '5'])\n        .pipe(\n      tap((data) => {\n        console.log(\"API STREAM response\", data)\n        if (data && data.length > 0) {\n          this.updateDisplayedColumns(data)\n        }\n      }),\n      catchError(error => {\n        return throwError(() => this.errorHandling(error, 'STREAM'))\n      })\n    )\n\n  }\n\n  onDownloadCompleted() {\n\n    const message = \"Download Completed\"\n\n    const display = ToastDisplay.adapt({\n      message,\n      action: 'Ok',\n      color: ToastColors.SUCCESS,\n      icon: 'sentiment_satisfied_alt',\n    })\n\n    this.toastMessage.toastMessage(display)\n  }\n\n  onDownloadFailed(err: string) {\n\n    const message = \"Download Failed\"\n\n    const display = ToastDisplay.adapt({\n      message,\n      action: 'Ok',\n      color: ToastColors.ERROR,\n      icon: 'warning',\n    })\n\n    this.toastMessage.toastMessage(display)\n  }\n\n  errorHandling(err: any, type: string) {\n    if(type === 'GET') this.GET_error$.next(err.message)\n    if(type === 'POST') this.POST_error$.next(err.message)\n    if(type === 'PUT') this.PUT_error$.next(err.message)\n    if(type === 'DELETE') this.DELETE_error$.next(err.message)\n    if(type === 'STREAM') this.STREAM_error$.next(err.message)\n  }\n\n  onSelectAIType(type: number) {\n    this.AIType = type\n  }\n\n  // ═══════════════════════════════════════════════════════════════════════════\n  // BATCH REQUEST DEMO METHODS\n  // ═══════════════════════════════════════════════════════════════════════════\n\n  /**\n   * Execute parallel batch request - fetch 5 users from JSONPlaceholder with individual states\n   */\n  onExecuteParallelBatch() {\n    this.isParallelLoading = true\n    this.parallelError = undefined\n    this.parallelExecutionTime = undefined\n    this.parallelResults = undefined\n\n    const requests = this.createBatchRequests(\n      'https://jsonplaceholder.typicode.com',\n      ['users'],\n      [1, 2, 3, 4, 5]\n    )\n\n    const startTime = performance.now()\n\n    this.httpManagerService.getParallelRequest(requests, BatchOptions.adapt({\n      concurrency: 3,\n      ignoreErrors: true,\n      logErrors: true\n    })).pipe(\n      tap(results => {\n        this.parallelResults = results\n        this.parallelExecutionTime = performance.now() - startTime\n        this.isParallelLoading = false\n      }),\n      catchError(error => {\n        this.parallelError = error.message || 'Parallel batch failed'\n        this.isParallelLoading = false\n        return throwError(() => error)\n      })\n    ).subscribe()\n  }\n\n  /**\n   * Execute sequential batch request - fetch 5 todos from JSONPlaceholder with individual states\n   */\n  onExecuteSequentialBatch() {\n    this.isSequentialLoading = true\n    this.sequentialError = undefined\n    this.sequentialExecutionTime = undefined\n    this.sequentialResults = undefined\n\n    const requests = this.createBatchRequests(\n      'https://jsonplaceholder.typicode.com',\n      ['todos'],\n      [1, 2, 3, 4, 5]\n    )\n\n    const startTime = performance.now()\n\n    this.httpManagerService.getSequentialRequest(requests, BatchOptions.adapt({\n      stopOnError: false,\n      ignoreErrors: true,\n      logErrors: true\n    })).pipe(\n      tap(results => {\n        this.sequentialResults = results\n        this.sequentialExecutionTime = performance.now() - startTime\n        this.isSequentialLoading = false\n      }),\n      catchError(error => {\n        this.sequentialError = error.message || 'Sequential batch failed'\n        this.isSequentialLoading = false\n        return throwError(() => error)\n      })\n    ).subscribe()\n  }\n\n  /**\n   * Execute stream batch request - fetch 5 posts with real-time state updates\n   */\n  onExecuteStreamBatch() {\n    this.isStreamLoading = true\n    this.streamError = undefined\n    this.streamExecutionTime = undefined\n    this.streamBatchStates = []\n    this.streamProgress = undefined\n\n    const requests = this.createBatchRequests(\n      'https://jsonplaceholder.typicode.com',\n      ['posts'],\n      [1, 2, 3, 4, 5]\n    )\n\n    const startTime = performance.now()\n\n    this.httpManagerService.getBatchRequestsStream(requests, {\n      mode: 'parallel',\n      concurrency: 3,\n      stopOnError: false,\n      ignoreErrors: true,\n      logErrors: true\n    }).pipe(\n      tap(state => {\n        this.streamBatchStates[state.index] = state\n        this.streamProgress = calculateBatchProgress(this.streamBatchStates.filter(s => s !== undefined) as BatchRequestState<any>[]);\n\n        if (!state.isPending) {\n          this.streamExecutionTime = performance.now() - startTime\n        }\n\n        this.isStreamLoading = this.streamBatchStates.some(s => s && s.isPending)\n      }),\n      catchError(error => {\n        this.streamError = error.message || 'Stream batch failed'\n        this.isStreamLoading = false\n        return throwError(() => error)\n      })\n    ).subscribe()\n  }\n\n  /**\n   * Type guard for pending state\n   */\n  isPendingState(state: BatchRequestState<any>): boolean {\n    return state.isPending === true\n  }\n\n  /**\n   * Type guard for success state\n   */\n  isSuccessState(state: BatchRequestState<any>): boolean {\n    return state.isPending === false && state.data !== undefined\n  }\n\n  /**\n   * Type guard for error state\n   */\n  isErrorState(state: BatchRequestState<any>): boolean {\n    return state.isPending === false && state.error !== undefined\n  }\n\n  /**\n   * Helper to create batch requests from IDs\n   */\n  private createBatchRequests(\n    baseUrl: string,\n    basePath: string[],\n    ids: number[]\n  ): ApiRequest[] {\n    return ids.map(id =>\n      ApiRequest.adapt({\n        server: baseUrl,\n        path: [...basePath, id]\n      })\n    )\n  }\n\n  /**\n   * Check if result is successful (not undefined)\n   */\n  isSuccess(result: any): boolean {\n    return result !== undefined && result !== null\n  }\n\n  /**\n   * Format execution time for display\n   */\n  formatTime(ms: number): string {\n    if (ms < 1000) {\n      return `${Math.round(ms)}ms`\n    }\n    return `${(ms / 1000).toFixed(2)}s`\n  }\n\n  /**\n   * Get success count from results array\n   */\n  getSuccessCount(results?: any[]): number {\n    if (!results) return 0\n    return results.filter(r => r !== undefined).length\n  }\n\n  /**\n   * Get failure count from results array\n   */\n  getFailureCount(results?: any[]): number {\n    if (!results) return 0\n    return results.filter(r => r === undefined).length\n  }\n\n}\n","<div style=\"margin: 2rem;\">\n\n  <h2>\n    HTTP Request Manager\n  </h2>\n\n  <div [formGroup]=\"requestForm\" style=\"margin-top: 2rem;\">\n    <div style=\"display: flex; gap: .5rem\">\n      <mat-form-field appearance=\"outline\">\n        <mat-label>Adapter (Model)</mat-label>\n        <mat-select formControlName=\"adapter\" #adapterSelect>\n          <mat-option>None</mat-option>\n          @for (adapter of sampleAdaptors; track adapter) {\n            <mat-option [value]=\"adapter.value\">\n              {{adapter.label}}\n            </mat-option>\n          }\n        </mat-select>\n      </mat-form-field>\n      <mat-form-field appearance=\"outline\">\n        <mat-label>Mapper (Model)</mat-label>\n        <mat-select formControlName=\"mapper\" #mapperSelect>\n          <mat-option>None</mat-option>\n          @for (mapper of sampleMappers; track mapper) {\n            <mat-option [value]=\"mapper.value\">\n              {{mapper.label}}\n            </mat-option>\n          }\n        </mat-select>\n      </mat-form-field>\n      <mat-form-field appearance=\"outline\">\n        <mat-label>Selector (response path)</mat-label>\n        <input matInput placeholder=\"data.items\" formControlName=\"selector\">\n      </mat-form-field>\n    </div>\n    @if (adapterSelect.value || mapperSelect.value) {\n      <div style=\"display: flex; margin-bottom: 2rem;\">\n        <div style=\"flex:1\" class=\"box\">\n          <h3>Adapter (Incoming)</h3>\n          @if (adapterSelect.value) {\n            <div>\n              {{ props(adapterSelect.value) | json }}\n            </div>\n          } @else {\n            No Transformation\n          }\n        </div>\n        <div style=\"flex:1\" class=\"box\">\n          <h3>Mapper (Outgoing)</h3>\n          @if (mapperSelect.value) {\n            <div>\n              {{ props(mapperSelect.value) | json }}\n            </div>\n          } @else {\n            No Transformation\n          }\n        </div>\n      </div>\n    }\n    <div>\n      <mat-form-field appearance=\"outline\">\n        <mat-label>RestPath (/ delimited)</mat-label>\n        <input matInput placeholder=\"clients/list\" formControlName=\"path\">\n      </mat-form-field>\n    </div>\n    <div>\n      <div formArrayName=\"headers\">\n        @for (task of headers.controls; track task; let i = $index) {\n          <div [formGroupName]=\"i\">\n            <div style=\"display: flex; gap: .5rem\">\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Key</mat-label>\n                <input matInput placeholder=\"authentication\" formControlName=\"key\">\n              </mat-form-field>\n              <mat-form-field appearance=\"outline\" style=\"flex:1\">\n                <mat-label>Value</mat-label>\n                <input matInput placeholder=\"sample\" formControlName=\"value\">\n              </mat-form-field>\n              <div style=\"margin-top: .5rem;\">\n                <button mat-icon-button (click)=\"removeHeader(i)\">\n                  <mat-icon>close</mat-icon>\n                </button>\n              </div>\n            </div>\n          </div>\n        }\n      </div>\n      <button mat-stroked-button (click)=\"addHeader()\" class=\"btn\">Add Header</button>\n    </div>\n    <div style=\"margin-top: 2rem; display: flex; flex-direction:column; gap: 1rem;\">\n      <div>\n        <mat-slide-toggle #failedState>Retry on Failed</mat-slide-toggle>\n        @if (failedState?.checked) {\n          <div style=\"display: flex; gap: .5rem; margin-top: 1rem;\" formGroupName=\"retry\">\n            <mat-form-field appearance=\"outline\">\n              <mat-label>#of Times</mat-label>\n              <input matInput placeholder=\"3\" formControlName=\"times\" value=\"3\">\n            </mat-form-field>\n            <mat-form-field appearance=\"outline\">\n              <mat-label>Delay Until Next</mat-label>\n              <input matInput placeholder=\"3\" formControlName=\"delay\" value=\"3\">\n            </mat-form-field>\n          </div>\n        }\n      </div>\n      <div>\n        <mat-slide-toggle #pollingState>Polling</mat-slide-toggle>\n        @if (pollingState?.checked) {\n          <div>\n            <mat-form-field appearance=\"outline\" style=\"margin-top: 1rem\">\n              <mat-label>#of Seconds</mat-label>\n              <input matInput placeholder=\"3\" formControlName=\"polling\" value=\"3\">\n            </mat-form-field>\n          </div>\n        }\n      </div>\n    </div>\n  </div>\n\n  <div style=\"margin-bottom: 1rem; margin-top: 2rem;\">\n    @if ((isPending$ | async)) {\n      <mat-progress-bar mode=\"indeterminate\"\n      ></mat-progress-bar>\n    }\n    @if (pollingState?.checked && !(isPending$ | async)) {\n      <mat-progress-bar mode=\"determinate\"\n        [value]=\"(this.countdown$ | async)\"\n      ></mat-progress-bar>\n    }\n  </div>\n\n  <div style=\"margin-top: 1rem\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <div style=\"display: flex;\">\n      <h2 style=\"flex:1\">GET Request</h2>\n      <div>\n        <button mat-raised-button (click)=\"onGetRequest()\" class=\"btn\">Request</button>\n      </div>\n    </div>\n\n    @if ((GET_error$ | async); as get_error) {\n      <div style=\"margin-top: .5rem;\">\n        <mat-error>{{ get_error }}</mat-error>\n      </div>\n    }\n\n    @if ((GET$ | async); as dataRecord) {\n      <div style=\"margin-top: 1rem;\">\n        <!-- <div [innerHTML]=\"(GET$ | async) | jsonv\"></div> -->\n        {{ dataRecord | json }}\n      </div>\n    }\n\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <div style=\"display: flex;\">\n      <h2 style=\"flex:1\">POST Request</h2>\n      <div>\n        <button mat-raised-button (click)=\"onCreateRequest()\" class=\"btn\">Request</button>\n      </div>\n    </div>\n\n    @if ((POST_error$ | async); as post_error) {\n      <div style=\"margin-top: .5rem;\">\n        <mat-error>{{ post_error }}</mat-error>\n      </div>\n    }\n\n    @if ((POST$ | async); as dataRecord) {\n      <div style=\"margin-top: 1rem;\">\n        <!-- <div [innerHTML]=\"(POST$ | async) | jsonv\"></div> -->\n        {{ dataRecord | json }}\n      </div>\n    }\n\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <div style=\"display: flex;\">\n      <h2 style=\"flex:1\">PUT Request</h2>\n      <div>\n        <button mat-raised-button (click)=\"onUpdateRequest()\" class=\"btn\">Request</button>\n      </div>\n    </div>\n\n    @if ((PUT_error$ | async); as put_error) {\n      <div style=\"margin-top: .5rem;\">\n        <mat-error>{{ put_error }}</mat-error>\n      </div>\n    }\n\n    <h3>Include Record ID in the RestPath</h3>\n\n    @if ((PUT$ | async); as dataRecord) {\n      <div style=\"margin-top: 1rem;\">\n        <!-- <div [innerHTML]=\"(PUT$ | async) | jsonv\"></div> -->\n        {{ dataRecord | json }}\n      </div>\n    }\n\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <div style=\"display: flex;\">\n      <h2 style=\"flex:1\">DELETE Request</h2>\n      <div>\n        <button mat-raised-button (click)=\"onDeleteRequest()\" class=\"btn\">Request</button>\n      </div>\n    </div>\n\n    <h3>Include Record ID in the RestPath</h3>\n\n    @if ((DELETE_error$ | async); as delete_error) {\n      <div style=\"margin-top: .5rem;\">\n        <mat-error>{{ delete_error }}</mat-error>\n      </div>\n    }\n\n    @if ((DELETE$ | async); as dataRecord) {\n      <div style=\"margin-top: 1rem;\">\n        <!-- <div [innerHTML]=\"(DELETE$ | async) | jsonv\"></div> -->\n        {{ dataRecord | json }}\n      </div>\n    }\n\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <div style=\"display: flex;\">\n      <h2 style=\"flex:1\">PATCH Request</h2>\n      <div>\n        <button mat-raised-button (click)=\"onPatchRequest()\" class=\"btn\">Request</button>\n      </div>\n    </div>\n\n    <h3>Include Record ID in the RestPath</h3>\n\n    @if ((PATCH_error$ | async); as patch_error) {\n      <div style=\"margin-top: .5rem;\">\n        <mat-error>{{ patch_error }}</mat-error>\n      </div>\n    }\n\n    @if ((PATCH$ | async); as dataRecord) {\n      <div style=\"margin-top: 1rem;\">\n        {{ dataRecord | json }}\n      </div>\n    }\n\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <div style=\"display: flex;\">\n      <h2 style=\"flex:1\">Streaming GET Request</h2>\n      <div style=\"display: flex; gap: 1rem; align-items: center;\">\n        <div style=\"display: flex; gap: 1rem; align-items: center;\">\n          {{ streamType }}\n          <button mat-icon-button [matMenuTriggerFor]=\"menu\">\n            <mat-icon>data_usage</mat-icon>\n          </button>\n        </div>\n        <mat-menu #menu=\"matMenu\">\n          @for (item of streamTypes; track item) {\n            <button mat-menu-item (click)=\"onStreamType(item.id)\">{{ item.value }}</button>\n          }\n        </mat-menu>\n        <button mat-raised-button (click)=\"onStreamRequest()\" class=\"btn\">Request</button>\n      </div>\n    </div>\n\n    <!-- <div *ngIf=\"(STREAM_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n    <mat-error>{{ stream_error }}</mat-error>\n  </div> -->\n\n  <div style=\"margin-top: 1rem;\">\n    @if ((STREAM$ | async); as data) {\n      <div class=\"container\">\n        <table mat-table [dataSource]=\"data\" class=\"mat-elevation-z8\">\n\n          <!-- Dynamic columns -->\n          @for (column of displayedColumns; track column) {\n            <ng-container [matColumnDef]=\"column\">\n              <th mat-header-cell *matHeaderCellDef> {{ column | titlecase }} </th>\n              <td mat-cell *matCellDef=\"let element\">\n                @if (isObject(element[column]); as objValue) {\n                  <pre style=\"margin: 0; font-size: 0.8em; white-space: pre-wrap;\">{{ objValue | json }}</pre>\n                } @else {\n                  {{ element[column] }}\n                }\n              </td>\n            </ng-container>\n          }\n\n          <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n          <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n        </table>\n\n        <!-- Debug info -->\n        <div style=\"margin-top: 1rem; font-size: 0.8em; color: #666;\">\n          Columns: {{ displayedColumns.join(', ') }} | Records: {{ data.length }}\n        </div>\n      </div>\n    }\n  </div>\n\n</div>\n\n<div style=\"margin-top: 2rem\">\n  <mat-divider></mat-divider>\n</div>\n\n<div style=\"margin-top: 2rem\">\n  <!-- Parallel Requests Section -->\n  <div>\n    <div style=\"display: flex; align-items: center; gap: 1rem; margin-bottom: 1rem;\">\n      <h2 style=\"flex: 1; margin: 0;\">Parallel Requests</h2>\n      <button\n        mat-raised-button\n        color=\"primary\"\n        (click)=\"onExecuteParallelBatch()\"\n        [disabled]=\"isParallelLoading\"\n        style=\"min-width: 200px;\">\n        <mat-icon>sync</mat-icon>\n        <span style=\"margin-left: 8px;\">\n          {{ isParallelLoading ? 'Loading...' : 'Fetch 5 Users' }}\n        </span>\n      </button>\n    </div>\n\n    <!-- Loading Indicator -->\n    @if (isParallelLoading) {\n      <div style=\"margin: 1rem 0;\">\n        <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n        <p style=\"margin-top: 0.5rem; color: #666;\">\n          Executing parallel requests (concurrency: 3)...\n        </p>\n      </div>\n    }\n\n    <!-- Results -->\n    @if (parallelResults) {\n      <div style=\"margin: 1rem 0;\">\n        <mat-card appearance=\"outlined\">\n          <mat-card-content>\n            <div style=\"display: grid; gap: 0.5rem;\">\n              @for (result of parallelResults; track $index; let i = $index) {\n                <div\n                  style=\"padding: 0.75rem; border-radius: 4px; border: 1px solid;\n                         {{ result ? 'background: #e3f2fd; border-color: #2196f3;' :\n                            'background: #ffebee; border-color: #f44336;' }}\">\n                  @if (result) {\n                    <div style=\"display: flex; align-items: center; gap: 0.5rem; justify-content: space-between;\">\n                      <div style=\"display: flex; align-items: center; gap: 0.5rem;\">\n                        <mat-icon style=\"color: #2196f3; font-size: 18px;\">check_circle</mat-icon>\n                        <strong>User #{{ result.id }}:</strong>\n                        <span>{{ result.name }}</span>\n                      </div>\n                      <span style=\"color: #2196f3; font-weight: bold;\">Complete</span>\n                    </div>\n                  } @else {\n                    <div style=\"display: flex; align-items: center; gap: 0.5rem; justify-content: space-between;\">\n                      <div style=\"display: flex; align-items: center; gap: 0.5rem;\">\n                        <mat-icon style=\"color: #f44336; font-size: 18px;\">error</mat-icon>\n                        <strong>Request {{ i + 1 }}:</strong>\n                        <span>Failed</span>\n                      </div>\n                      <span style=\"color: #f44336; font-weight: bold;\">Error</span>\n                    </div>\n                  }\n                </div>\n              }\n            </div>\n          </mat-card-content>\n        </mat-card>\n      </div>\n    }\n\n    <!-- Execution Metrics -->\n    @if (parallelExecutionTime !== undefined) {\n      <div style=\"background: #f5f5f5; padding: 1rem; border-radius: 4px; margin: 1rem 0;\">\n        <div style=\"display: flex; gap: 2rem;\">\n          <div>\n            <strong>⏱Execution Time:</strong>\n            <span style=\"margin-left: 0.5rem; color: #4caf50;\">\n              {{ formatTime(parallelExecutionTime) }}\n            </span>\n          </div>\n          <div>\n            <strong>Mode:</strong>\n            <span style=\"margin-left: 0.5rem;\">Parallel</span>\n          </div>\n        </div>\n      </div>\n    }\n\n    <!-- Error Display -->\n    @if (parallelError) {\n      <div style=\"margin-top: 1rem;\">\n        <mat-error>{{ parallelError }}</mat-error>\n      </div>\n    }\n  </div>\n\n  <!-- Sequential Requests Section -->\n  <div>\n    <div style=\"display: flex; align-items: center; gap: 1rem; margin-bottom: 1rem;\">\n      <h2 style=\"flex: 1; margin: 0;\">Sequential Requests</h2>\n      <button\n        mat-raised-button\n        color=\"accent\"\n        (click)=\"onExecuteSequentialBatch()\"\n        [disabled]=\"isSequentialLoading\"\n        style=\"min-width: 200px;\">\n        <mat-icon>timeline</mat-icon>\n        <span style=\"margin-left: 8px;\">\n          {{ isSequentialLoading ? 'Loading...' : 'Fetch 5 Todos' }}\n        </span>\n      </button>\n    </div>\n\n    <!-- Loading Indicator -->\n    @if (isSequentialLoading) {\n      <div style=\"margin: 1rem 0;\">\n        <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n        <p style=\"margin-top: 0.5rem; color: #666;\">\n          Executing sequential requests (one at a time)...\n        </p>\n      </div>\n    }\n\n    <!-- Results -->\n    @if (sequentialResults) {\n      <div style=\"margin: 1rem 0;\">\n        <mat-card appearance=\"outlined\">\n          <mat-card-content>\n            <div style=\"display: grid; gap: 0.5rem;\">\n              @for (result of sequentialResults; track $index; let i = $index) {\n                <div\n                  style=\"padding: 0.75rem; border-radius: 4px; border: 1px solid;\n                         {{ result ? 'background: #e3f2fd; border-color: #2196f3;' :\n                            'background: #ffebee; border-color: #f44336;' }}\">\n                  @if (result) {\n                    <div style=\"display: flex; align-items: center; gap: 0.5rem; justify-content: space-between;\">\n                      <div style=\"display: flex; align-items: center; gap: 0.5rem;\">\n                        <mat-icon style=\"color: #2196f3; font-size: 18px;\">check_circle</mat-icon>\n                        <strong>Todo #{{ result.id }}:</strong>\n                        <span style=\"flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\">\n                          {{ result.title }}\n                        </span>\n                      </div>\n                    </div>\n                  } @else {\n                    <div style=\"display: flex; align-items: center; gap: 0.5rem; justify-content: space-between;\">\n                      <div style=\"display: flex; align-items: center; gap: 0.5rem;\">\n                        <mat-icon style=\"color: #f44336; font-size: 18px;\">error</mat-icon>\n                        <strong>Request {{ i + 1 }}:</strong>\n                        <span>Failed</span>\n                      </div>\n                      <span style=\"color: #f44336; font-weight: bold;\">Error</span>\n                    </div>\n                  }\n                </div>\n              }\n            </div>\n          </mat-card-content>\n        </mat-card>\n      </div>\n    }\n\n    <!-- Execution Metrics -->\n    @if (sequentialExecutionTime !== undefined) {\n      <div style=\"background: #f5f5f5; padding: 1rem; border-radius: 4px; margin: 1rem 0;\">\n        <div style=\"display: flex; gap: 2rem;\">\n          <div>\n            <strong>Execution Time:</strong>\n            <span style=\"margin-left: 0.5rem; color: #4caf50;\">\n              {{ formatTime(sequentialExecutionTime) }}\n            </span>\n          </div>\n          <div>\n            <strong>Mode:</strong>\n            <span style=\"margin-left: 0.5rem;\">Sequential</span>\n          </div>\n        </div>\n      </div>\n    }\n  </div>\n\n  <!-- Stream Mode Section -->\n  <div>\n    <div style=\"display: flex; align-items: center; gap: 1rem; margin-bottom: 1rem;\">\n      <h2 style=\"flex: 1; margin: 0;\">Stream Mode (Real-time States)</h2>\n      <button\n        mat-raised-button\n        color=\"primary\"\n        (click)=\"onExecuteStreamBatch()\"\n        [disabled]=\"isStreamLoading\"\n        style=\"min-width: 200px;\">\n        <mat-icon>auto_awesome</mat-icon>\n        <span style=\"margin-left: 8px;\">\n          {{ isStreamLoading ? 'Loading...' : 'Fetch 5 Posts' }}\n        </span>\n      </button>\n    </div>\n\n    <!-- Loading Indicator -->\n    @if (isStreamLoading) {\n      <div style=\"margin: 1rem 0;\">\n        <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n        <p style=\"margin-top: 0.5rem; color: #666;\">\n          Executing parallel requests with real-time state updates...\n        </p>\n      </div>\n    }\n\n    <!-- Progress Bar -->\n    @if (streamProgress) {\n      <div style=\"background: #f5f5f5; padding: 1rem; border-radius: 4px; margin: 1rem 0;\">\n        <div style=\"display: flex; gap: 2rem; margin-bottom: 0.5rem;\">\n          <div>\n            <strong>Execution Time:</strong>\n            <span style=\"margin-left: 0.5rem; color: #4caf50;\">\n              {{ formatTime(streamExecutionTime || 0) }}\n            </span>\n          </div>\n          <div>\n            <strong>Progress:</strong>\n            <span style=\"margin-left: 0.5rem;\">\n              {{ streamProgress.completed }} / {{ streamProgress.total }} completed\n            </span>\n          </div>\n          <div>\n            <strong>Pending:</strong>\n            <span style=\"margin-left: 0.5rem;\">\n              {{ streamProgress.pending }}\n            </span>\n          </div>\n          <div>\n            <strong>Failed:</strong>\n            <span style=\"margin-left: 0.5rem;\">\n              {{ streamProgress.failed }}\n            </span>\n          </div>\n        </div>\n        <mat-progress-bar\n          mode=\"determinate\"\n          [value]=\"streamProgress.percent\"\n          color=\"accent\">\n        </mat-progress-bar>\n        <p style=\"margin-top: 0.5rem; text-align: right; color: #666;\">\n          {{ streamProgress.percent }}%\n        </p>\n      </div>\n    }\n\n    <!-- Error Display -->\n    @if (streamError) {\n      <div style=\"margin-top: 1rem;\">\n        <mat-error>{{ streamError }}</mat-error>\n      </div>\n    }\n\n    <!-- Individual Request States -->\n    @if (streamBatchStates.length > 0) {\n      <div style=\"margin-top: 1rem;\">\n        <mat-card appearance=\"outlined\">\n          <mat-card-content>\n            <div style=\"display: grid; gap: 0.5rem;\">\n              @for (state of filteredStreamStates; track state.index; let i = $index) {\n                <div\n                  style=\"padding: 0.75rem; border-radius: 4px; border: 1px solid;\n                         {{ isPendingState(state) ? 'background: #fff3e0; border-color: #ff9800;' :\n                            isSuccessState(state) ? 'background: #e3f2fd; border-color: #2196f3;' :\n                            'background: #ffebee; border-color: #f44336;' }}\">\n                  @if (isPendingState(state)) {\n                    <div style=\"display: flex; align-items: center; gap: 0.5rem;\">\n                      <mat-spinner diameter=\"16\" style=\"margin-right: 0.5rem;\"></mat-spinner>\n                      <strong>Request {{ state.index + 1 }}:</strong>\n                      <span>Loading...</span>\n                    </div>\n                  } @else if (isSuccessState(state)) {\n                    <div style=\"display: flex; align-items: center; gap: 0.5rem;\">\n                      <mat-icon style=\"color: #2196f3; font-size: 18px;\">check_circle</mat-icon>\n                      <strong>Post #{{ state.data.id }}:</strong>\n                      <span style=\"flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\">\n                        {{ state.data.title }}\n                      </span>\n                    </div>\n                  } @else {\n                    <div style=\"display: flex; align-items: center; gap: 0.5rem;\">\n                      <mat-icon style=\"color: #f44336; font-size: 18px;\">error</mat-icon>\n                      <strong>Request {{ state.index + 1 }}:</strong>\n                      <span>Failed</span>\n                      <mat-chip style=\"margin-left: auto; font-size: 0.8em; background: #f44336; color: white;\">\n                        Error\n                      </mat-chip>\n                    </div>\n                  }\n                </div>\n              }\n            </div>\n          </mat-card-content>\n        </mat-card>\n      </div>\n    }\n  </div>\n\n  <!-- Comparison Info -->\n  <div style=\"padding: 1rem; background: whitesmoke; border-radius: 4px; border: 1px solid #ccc;\">\n    <h4 style=\"margin-top: 0;\">Key Differences</h4>\n    <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 1rem;\">\n      <div>\n        <strong>Parallel:</strong>\n        <ul style=\"margin: 0.5rem 0 0 1rem; padding: 0;\">\n          <li>Faster execution (concurrent)</li>\n          <li>Multiple requests simultaneously</li>\n          <li>Results may complete out of order</li>\n          <li>Best for: Independent requests</li>\n        </ul>\n      </div>\n      <div>\n        <strong>Sequential:</strong>\n        <ul style=\"margin: 0.5rem 0 0 1rem; padding: 0;\">\n          <li>Slower execution (one-by-one)</li>\n          <li>Requests execute in order</li>\n          <li>Results always in request order</li>\n          <li>Best for: Dependent requests</li>\n        </ul>\n      </div>\n    </div>\n  </div>\n</div>\n\n</div>\n","import { Component, Inject, inject, OnInit, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\nimport { LocalStorageManagerService, SettingOptions, StorageOption, StorageType } from '../../services/local-storage-manager-service';\nimport { FormBuilder, Validators } from '@angular/forms';\nimport { BehaviorSubject, EMPTY, Observable, of } from 'rxjs';\nimport { ConfigOptions } from '../../models/config-options.model';\nimport { LocalStorageOptions } from '../../models/config-local-storage-options.model';\nimport { UtilsService } from '../../services/utils/utils.service';\nimport { switchMap, tap, map } from 'rxjs/operators';\nimport { CONFIG_SETTINGS_TOKEN } from '../../models/config-token.model';\n\n@Component({\n    selector: 'app-local-storage-demo',\n    templateUrl: './local-storage-demo.component.html',\n    styleUrls: ['./local-storage-demo.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.Default,\n    standalone: false\n})\nexport class LocalStorageDemoComponent implements OnInit {\n\n  fb = inject(FormBuilder)\n  utils = inject(UtilsService)\n\n  type$ = new BehaviorSubject(StorageType.GLOBAL)\n  get type() {\n    return (this.typeControl.value) ? +this.typeControl.value : 0\n  }\n\n  typeControl = this.fb.control(StorageType.GLOBAL.toString())\n\n  localStorageManagerService = inject(LocalStorageManagerService)\n\n  settings$: Observable<any> = this.localStorageManagerService.settings$\n\n  setting$ = (store: string) => this.localStorageManagerService.setting$(store)\n\n  storageForm = this.fb.group({\n    store: this.fb.control<string|null>(null),\n    type: 'local',\n    settingType: 'local',\n    encrypted: false,\n    data: this.fb.control<string>('', Validators.required),\n  })\n\n  newStoreForm = this.fb.group({\n    name: this.fb.control<string|null>(null, Validators.required),\n    storage: 'local',\n    encrypted: false,\n    data: this.fb.control<string>('', Validators.required),\n    expiresIn: this.fb.control('0')\n  })\n\n  store$?: Observable<any>\n\n  storeData$ = this.storageForm.get('store')?.valueChanges\n  .pipe(\n    switchMap((data: any) => {\n      return data\n        ? this.localStorageManagerService.store$(data.name)\n        : of('')\n    }),\n    tap(data => {\n      this.storageForm.get('data')?.patchValue(data, { emitEvent: false })\n    })\n  )\n\n  expiresIn = (epoch: number) => this.utils.expiresIn(epoch)\n\n  get isValid() {\n    return this.newStoreForm.valid\n  }\n\n  get isValidData() {\n    return this.storageForm.valid\n  }\n\n  isValidJSON = (str: string) => {\n    try {\n      JSON.parse(str)\n      return true\n    } catch (e) {\n      return false\n    }\n  }\n\n  displayedColumns: string[] = ['name', 'id', 'encrypted', 'expires', \"option\"];\n\n  filterData = (values: SettingOptions[]) => {\n    if(!values) return []\n    return values.filter((item: any) => item.options.storage === +this.type)\n  }\n\n  data$?: Observable<any>\n\n  store: any\n\n  create = false\n\n  storeProps?: LocalStorageOptions\n  options?: SettingOptions\n\n  constructor(@Inject(CONFIG_SETTINGS_TOKEN) private configOptions?: ConfigOptions) { }\n\n  ngOnInit() {\n\n    this.storeProps = this.configOptions?.LocalStorageOptions\n    this.options = this.storeProps?.options\n\n    if(this.options?.storage) {\n      this.typeControl.patchValue(this.options.storage.toString())\n      this.typeControl.disable()\n    } else {\n      this.typeControl.enable()\n    }\n\n    if(this.options?.expiresIn) {\n      this.newStoreForm.get('expiresIn')?.patchValue(this.options.expiresIn)\n      this.newStoreForm.get('expiresIn')?.disable()\n    } else {\n      this.newStoreForm.get('expiresIn')?.enable()\n    }\n\n    if(this.options?.encrypted) {\n      this.newStoreForm.get('encrypted')?.patchValue(this.options.encrypted)\n      this.newStoreForm.get('encrypted')?.disable()\n    } else {\n      this.newStoreForm.get('encrypted')?.enable()\n    }\n\n  }\n\n  onCreateStore() {\n\n    if(!this.isValid) return\n\n    const store = this.newStoreForm.value\n    if(!store.name || store.name === '') return\n\n    const options = { storage: this.type, encrypted: store.encrypted, expiresIn: store.expiresIn }\n\n    this.localStorageManagerService.createStore({\n      name: store.name,\n      data: store.data,\n      options: SettingOptions.adapt(options)\n    })\n\n    this.newStoreForm.reset()\n    this.create = false\n  }\n\n  onUpdateStore(store: any) {\n\n    if(!this.storageForm.valid) return\n\n    const storeData = this.storageForm.value\n\n    const data = JSON.parse(storeData.data || '')\n\n    const type = (storeData.type === 'local') ? StorageType.GLOBAL : StorageType.SESSION\n\n    this.localStorageManagerService.updateStore({\n      name: store.name,\n      data\n    })\n\n  }\n\n  onSelectedRow(store: any) {\n    this.store = store\n    this.data$ = this.localStorageManagerService.store$(store.name).pipe(map(item => JSON.stringify(item)))\n    this.create = false\n  }\n\n  onCreate() {\n    this.onCancel()\n    this.create = true\n  }\n\n  onDelete(store: StorageOption) {\n\n    this.localStorageManagerService.deleteStore({\n      name: store.name,\n    })\n\n    this.onCancel()\n  }\n\n  onCancel() {\n    this.data$ = EMPTY\n    this.store = null\n    this.create = false\n  }\n\n  onUpdate(store: StorageOption, data: any) {\n\n    this.localStorageManagerService.updateStore({\n      name: store.name,\n      data: JSON.parse(data)\n    })\n\n    this.onCancel()\n\n  }\n\n  onReset() {\n    this.localStorageManagerService.resetStore()\n  }\n\n}\n","<div style=\"margin: 2rem;\">\n\n  <div style=\"display: flex; gap: 1rem\">\n    <h2 style=\"padding-top: .5rem; display: flex;\">\n      <div style=\"padding-top: .5rem;\">Local Storage Manager</div>\n      <div>\n        <button mat-icon-button [matMenuTriggerFor]=\"menu\">\n          <mat-icon>info</mat-icon>\n        </button>\n      </div>\n    </h2>\n    <span style=\"flex:1\"></span>\n    <div style=\"padding-top: .25rem;\">\n      <mat-button-toggle-group name=\"storage\" [formControl]=\"typeControl\" (change)=\"onCancel()\">\n        <mat-button-toggle value=\"0\">Local Storage</mat-button-toggle>\n        <mat-button-toggle value=\"1\">Session Storage</mat-button-toggle>\n      </mat-button-toggle-group>\n    </div>\n    <div style=\"margin-top: .25rem;\">\n      <button mat-icon-button (click)=\"onCreate()\">\n        <mat-icon>add</mat-icon>\n      </button>\n    </div>\n  </div>\n\n  <ng-container *ngIf=\"storeProps?.storageName || storeProps?.storageSettingsName\">\n    <div style=\"display: flex; gap: .5rem; flex-direction: column; border: gray solid thin; background-color: whitesmoke; padding: 1rem;\"\n    >\n      <div style=\"display: flex;\">\n        <div *ngIf=\"storeProps?.storageSettingsName\" style=\"flex:1\">\n          Database: <b>{{ storeProps?.storageSettingsName }}</b>\n        </div>\n        <div *ngIf=\"storeProps?.storageName\" style=\"flex:1\">\n          Data: <b>{{ storeProps?.storageName }}</b>\n        </div>\n      </div>\n    </div>\n  </ng-container>\n\n  <div style=\"margin-top: 2rem;\" [formGroup]=\"newStoreForm\" *ngIf=\"create; else LIST\">\n\n    <h2>Create Store</h2>\n\n    <div style=\"display: flex; gap: 1rem;\">\n      <div style=\"flex:1\">\n        <mat-form-field appearance=\"outline\">\n          <mat-label>Store Name</mat-label>\n          <input matInput placeholder=\"sample\" formControlName=\"name\">\n        </mat-form-field>\n      </div>\n      <div>\n        <mat-form-field appearance=\"outline\">\n          <mat-label>Expires In...</mat-label>\n          <mat-select formControlName=\"expiresIn\">\n            <mat-option value=\"0\">None</mat-option>\n            <mat-option value=\"30s\">30 Seconds</mat-option>\n            <mat-option value=\"1mn\">1 Minute</mat-option>\n            <mat-option value=\"1hr\">1 Hour</mat-option>\n            <mat-option value=\"1d\">1 Day</mat-option>\n          </mat-select>\n        </mat-form-field>\n      </div>\n      <div style=\"margin-top: 1rem;\">\n        <mat-slide-toggle formControlName=\"encrypted\">Encrypted</mat-slide-toggle>\n      </div>\n    </div>\n\n    <div style=\"display: flex;\">\n      <mat-form-field appearance=\"outline\" style=\"flex: 1;\">\n        <mat-label>Data (Must be an Object or Array of any)</mat-label>\n        <textarea matInput placeholder=\"[]\" formControlName=\"data\" #json></textarea>\n      </mat-form-field>\n    </div>\n    <mat-error *ngIf=\"!isValidJSON(json.value)\">Not Valid Data</mat-error>\n\n    <div style=\"display: flex;\">\n      <span style=\"flex:1\"></span>\n      <button mat-stroked-button (click)=\"onCreateStore()\" [disabled]=\"!(isValid && isValidJSON(json.value))\">\n        Save Store\n      </button>\n    </div>\n\n  </div>\n\n  <ng-template #LIST>\n\n    <div style=\"margin-top: 1rem;\">\n      <mat-divider></mat-divider>\n    </div>\n{{ settings$ | async | json }}\n    <div *ngIf=\"filterData(settings$ | async) as data\">\n      <ng-container *ngIf=\"data.length > 0; else NO_DATA\">\n        <table mat-table [dataSource]=\"data\">\n          <ng-container matColumnDef=\"name\">\n            <th mat-header-cell *matHeaderCellDef> Store </th>\n            <td mat-cell *matCellDef=\"let element\" style=\"font-weight: bold; text-transform: uppercase;\"> {{element.name}} </td>\n          </ng-container>\n\n          <ng-container matColumnDef=\"id\">\n            <th mat-header-cell *matHeaderCellDef> ID </th>\n            <td mat-cell *matCellDef=\"let element\"> {{element.id}} </td>\n          </ng-container>\n\n          <ng-container matColumnDef=\"encrypted\">\n            <th mat-header-cell *matHeaderCellDef style=\"text-align: center;\"> Encrypted </th>\n            <td mat-cell *matCellDef=\"let element\" style=\"text-align: center;\">\n              <ng-container *ngIf=\"element.options.encrypted; else NO\">YES</ng-container>\n              <ng-template #NO><span style=\"color:gray\">NO</span></ng-template>\n            </td>\n          </ng-container>\n\n          <ng-container matColumnDef=\"expires\">\n            <th mat-header-cell *matHeaderCellDef style=\"text-align: center;\"> Expires </th>\n            <td mat-cell *matCellDef=\"let element\" style=\"text-align: center;\">\n              <ng-container *ngIf=\"element.options.expires !== 0; else NO_DATA\">\n                {{expiresIn(element.options.expires)}}\n              </ng-container>\n              <ng-template #NO_DATA>\n                ∞\n              </ng-template>\n            </td>\n          </ng-container>\n\n          <ng-container matColumnDef=\"option\">\n            <th mat-header-cell *matHeaderCellDef></th>\n            <td mat-cell *matCellDef=\"let element\" style=\"padding-right: 0;\">\n              <div style=\"display: flex;justify-content: flex-end;\">\n                <button mat-icon-button color=\"warn\" (click)=\"onDelete(element); $event.stopPropagation()\">\n                  <mat-icon>close</mat-icon>\n                </button>\n              </div>\n            </td>\n          </ng-container>\n\n          <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n          <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\" (click)=\"onSelectedRow(row)\"></tr>\n        </table>\n      </ng-container>\n\n      <ng-template #NO_DATA>\n        <h3 style=\"margin-top: 1rem;\">No Data</h3>\n      </ng-template>\n\n      <div *ngIf=\"(data$ | async) as data\" style=\"margin-top: 2rem;\">\n        <div style=\"margin-bottom: 1rem;\">\n          <mat-divider></mat-divider>\n        </div>\n\n        <h3>STORE: <span style=\"font-weight: bold;\">{{ store.name | uppercase }}</span></h3>\n        <h3>SETTINGS: {{ setting$(store.name) | async | json }}</h3>\n        <div style=\"display: flex;\">\n          <mat-form-field appearance=\"outline\" style=\"flex: 1;\">\n            <mat-label>Data (Must be an Object or Array of any)</mat-label>\n            <textarea matInput placeholder=\"[]\" #json [value]=\"data\"></textarea>\n          </mat-form-field>\n        </div>\n        <mat-error *ngIf=\"!isValidJSON(json.value)\">Not Valid Data</mat-error>\n\n        <div style=\"display: flex; gap: .5rem;\">\n          <span style=\"flex:1\"></span>\n          <button mat-stroked-button (click)=\"onCancel()\">Cancel</button>\n          <button mat-stroked-button (click)=\"onUpdate(store, json.value)\" [disabled]=\"!(isValidJSON(json.value))\">Update</button>\n        </div>\n      </div>\n    </div>\n\n  </ng-template>\n\n  <div style=\"margin-top: 1rem;\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <div style=\"margin-top: 1rem;\">\n    <button mat-stroked-button (click)=\"onReset()\">Delete All Stores</button>\n  </div>\n\n</div>\n\n\n<mat-menu #menu=\"matMenu\">\n  <div style=\"padding: 1rem;\">\n    <p>Please note that the LocalStorage (encryption) and management of data is dependant on initializing the APP_ID</p>\n    <p>Must provide a value for <b>APP_ID</b> in AppModule->Providers</p>\n    <mat-divider></mat-divider>\n  <div style=\"font-size: smaller; margin-top: .5rem;\">\n    <p>Example: UUID (self.crypto.randomUUID() to generate)</p>\n    <div style=\"background-color: whitesmoke; padding: 1rem;\">\n      &#123;<br>\n        provide: APP_ID,<br>\n        useValue: \"056991ac-3537-43ab-b5b9-83edf6554eff\",<br>\n      &#125;\n    </div>\n  </div>\n  </div>\n</mat-menu>\n","export interface OIDCClientInterface {\n  id: number\n  name: string\n  domain: string\n  service: string\n  spiffe: string\n  secret: string\n  created: number\n  modified: number\n  icon: string\n  imageFile: string\n  email: string\n}\n\nexport class OIDCClient implements OIDCClientInterface {\n\n  // Carried through (not just decorative) so a record read from the API keeps every field\n  // api-test-server's PUT /items/:id requires on replace — dropping them here is what made\n  // onUpdateData()'s \"spread the existing record\" approach silently omit them.\n  constructor(\n    public id: number = 0,\n    public name: string = '',\n    public domain: string = '',\n    public service: string = '',\n    public spiffe: string = '',\n    public secret: string = '',\n    public created: number = 0,\n    public modified: number = 0,\n    public icon: string = '',\n    public imageFile: string = '',\n    public email: string = '',\n  ) {}\n\n  static adapt(item?: any): OIDCClient {\n\n    return new OIDCClient(\n      item?.id,\n      item?.name,\n      item?.domain,\n      item?.service,\n      item?.spiffe,\n      item?.secret,\n      item?.created,\n      item?.modified,\n      item?.icon,\n      item?.imageFile,\n      item?.email,\n    )\n\n  }\n\n}\n","import { Injectable } from '@angular/core';\n\nimport { DatabaseStorage, DataType, RetryOptions } from '../../../models';\nimport { HTTPManagerStateService } from '../../../services/request-manager-state-service/http-manager-state.store';\nimport { ApiRequest } from '../../../services/request-manager-state-service/models/api-request.model';\nimport { OIDCClient } from '../models/oidc-client.model';\n\n/**\n * StateServiceDemo - Core state management and WebSocket connection service\n *\n * Handles:\n * - WebSocket connection setup\n * - Base HTTP state management\n * - Connection status and retry logic\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class StateServiceDemo extends HTTPManagerStateService<any> {\n\n  attempts$ = this.wsRetryAttempts$;\n  nextRetry$ = this.wsNextRetry$;\n\n  constructor() {\n    super(\n      ApiRequest.adapt({\n        server: '',\n        retry: RetryOptions.adapt({\n          times: 3,\n          delay: 1,\n        }),\n        adapter: OIDCClient.adapt,\n      }),\n      DataType.ARRAY,\n      DatabaseStorage.adapt({\n        table: 'ws_demo_data',\n        expiresIn: '5mn',\n      })\n    );\n  }\n\n  /**\n   * Initialize WebSocket connection with server configuration\n   * @param server - Backend server URL\n   * @param wsServer - WebSocket server URL\n   * @param jwtToken - JWT authentication token\n   * @param user - User information\n   * @param path - Path for constructing channel name (e.g., ['items'])\n   */\n  updateConnection(server: string, wsServer: string, jwtToken: string, user: any, path: (string|number)[] = ['items']) {\n    // Construct channel name from path: ['items'] → 'items'\n    const channelId = path.join('/');\n\n    this.setApiRequestOptions({\n      server,\n      path, // Set the path for HTTP requests\n      retry: RetryOptions.adapt({\n        times: 3,\n        delay: 1,\n      }),\n      adapter: OIDCClient.adapt,\n      ws: {\n        id: channelId,  // Use path-based channel ID instead of hardcoded 'USERS123'\n        wsServer,\n        jwtToken,\n        user,\n        retry: RetryOptions.adapt({\n          times: 10,\n          delay: 5,\n        }),\n      }\n    });\n\n    this.userAction$.subscribe(user => {\n      console.log('User Action:', user);\n    });\n  }\n\n  /**\n   * Get all available channels\n   */\n  override getAllChannels() {\n    this.httpManagerService.getAllChannels();\n  }\n\n  /**\n   * Subscribe to a channel\n   */\n  override subscribeToChannel(channel: string) {\n    super.subscribeToChannel(channel);\n  }\n\n  /**\n   * Unsubscribe from a channel\n   */\n  override unsubscribeFromChannel(channel: string) {\n    super.unsubscribeFromChannel(channel);\n  }\n\n  // =====================\n  // Notification Channel Methods (MES- prefix)\n  // These override methods from HTTPManagerStateService\n  // =====================\n\n  /**\n   * Create a notification channel (MES- prefix)\n   */\n  override createNotificationChannel(channel: string) {\n    super.createNotificationChannel(channel);\n  }\n\n  /**\n   * Get all notification channels list (in-memory)\n   */\n  override getNotificationChannels() {\n    super.getNotificationChannels();\n  }\n\n  /**\n   * Get today's notification channels from database\n   * Returns unique channels that have notifications posted today\n   */\n  override getTodaysNotificationChannels() {\n    super.getTodaysNotificationChannels();\n  }\n\n  /**\n   * Define and load previous day's notification channels from database\n   * Creates channels in memory and broadcasts updated list\n   */\n  definePreviousNotificationChannels() {\n    const options = ApiRequest.adapt({\n      path: ['notifications', 'channels', 'define-previous']\n    });\n\n    this.httpManagerService.postRequest({}, options).subscribe({\n      next: (response: any) => {\n        console.log('📋 Previous day channels loaded:', response);\n        // The server will broadcast updated channel list to all WebSocket clients\n      },\n      error: (error) => {\n        console.error('❌ Failed to load previous day channels:', error);\n      }\n    });\n  }\n\n  /**\n   * Subscribe to notification channel with optional date filters\n   */\n  override subscribeToNotificationChannel(channel: string, options?: { startEpoch?: number; endEpoch?: number }, user?: any) {\n    super.subscribeToNotificationChannel(channel, options, user);\n  }\n\n  /**\n   * Unsubscribe from notification channel\n   */\n  override unsubscribeFromNotificationChannel(channel: string) {\n    super.unsubscribeFromNotificationChannel(channel);\n  }\n\n  /**\n   * Send a notification to a channel\n   */\n  override sendNotification(channel: string, content: any) {\n    super.sendNotification(channel, content);\n  }\n\n}\n","import { Injectable, inject } from '@angular/core';\nimport { ChannelMessage } from '../../../services/ws-manager-service/models/channel-message.model';\nimport { StateServiceDemo } from './state-service-demo.service';\n\n/**\n * MessageServiceDemo - Channel messaging service (PUB- prefix channels)\n *\n * Handles:\n * - Sending messages to channels\n * - Channel subscription for messaging\n * - Real-time message broadcast\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class MessageServiceDemo {\n\n  private stateService = inject(StateServiceDemo);\n\n  // Expose observables from state service\n  channels$ = this.stateService.channels$;\n  subscribedChannels$ = this.stateService.subscribedChannels$;\n  communicationMessages$ = this.stateService.communicationMessages$;\n  latestCommunicationMessages$ = this.stateService.latestCommunicationMessages$;\n  connectionStatus$ = this.stateService.connectionStatus$;\n  user$ = this.stateService.user$;\n  data$ = this.stateService.data$;\n\n  /**\n   * Helper to ensure channel has PUB- prefix\n   */\n  private toPublicChannel(channel: string): string {\n    return channel.startsWith('PUB-') ? channel : `PUB-${channel}`;\n  }\n\n  /**\n   * Helper to strip PUB- prefix for display\n   */\n  private fromPublicChannel(channel: string): string {\n    return channel.startsWith('PUB-') ? channel.replace('PUB-', '') : channel;\n  }\n\n  /**\n   * Create a new public channel\n   */\n  createChannel(channel: string) {\n    const publicChannel = this.toPublicChannel(channel);\n    this.stateService.createChannel(publicChannel);\n  }\n\n  /**\n   * Get all available channels\n   */\n  getAllChannels() {\n    this.stateService.getAllChannels();\n  }\n\n  /**\n   * Subscribe to a channel to receive messages\n   */\n  subscribeToChannel(channel: string) {\n    const publicChannel = this.toPublicChannel(channel);\n    this.stateService.subscribeToChannel(publicChannel);\n  }\n\n  /**\n   * Unsubscribe from a channel\n   */\n  unsubscribeFromChannel(channel: string) {\n    const publicChannel = this.toPublicChannel(channel);\n    this.stateService.unsubscribeFromChannel(publicChannel);\n  }\n\n  /**\n   * Send a message to one or more channels\n   */\n  sendMessage(data: ChannelMessage, channels?: string[]) {\n    const publicChannels = channels?.map(ch => this.toPublicChannel(ch));\n    console.log('sendMessage', data, 'to channels:', publicChannels);\n    this.stateService.wsMessaging(data, publicChannels);\n  }\n\n}\n","import { Injectable, inject } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { StateServiceDemo } from './state-service-demo.service';\n\n/**\n * Notification message interface\n */\nexport interface NotificationMessage {\n  id: number;\n  channel: string;\n  created: number;  // epoch seconds\n  user_name: string;\n  sessionId: any;\n  content: any;\n}\n\n/**\n * NotificationServiceDemo - Notification channel service (MES- prefix channels)\n *\n * Handles:\n * - Creating notification channels\n * - Subscribing to notifications with date filters\n * - Sending notifications (persisted to database)\n * - Receiving real-time and historical notifications\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class NotificationServiceDemo {\n\n  private stateService = inject(StateServiceDemo);\n\n  // Notification channels from state service (in-memory - contains MES- channels from server)\n  notificationChannels$ = this.stateService.notificationChannels$;\n\n  // Today's notification channels from database (channels with data for today)\n  todaysNotificationChannels$ = this.stateService.todaysNotificationChannels$;\n\n  private subscribedNotificationChannelsSubject = new BehaviorSubject<Set<string>>(new Set());\n  subscribedNotificationChannels$ = this.subscribedNotificationChannelsSubject.asObservable();\n\n  // Notification messages from state service\n  notificationMessages$ = this.stateService.notificationMessages$;\n\n  // Latest notification from state service\n  latestNotification$ = this.stateService.latestNotification$;\n\n  // Expose connection status from state service\n  connectionStatus$ = this.stateService.connectionStatus$;\n\n  /**\n   * Create a notification channel\n   * NOTE: MES- prefix is added automatically by HTTPManagerStateService\n   */\n  createNotificationChannel(channel: string) {\n    console.log('📢 createNotificationChannel:', channel);\n    this.stateService.createNotificationChannel(channel);\n  }\n\n  /**\n   * Get all notification channels (in-memory)\n   */\n  getNotificationChannels() {\n    console.log('📢 getNotificationChannels');\n    this.stateService.getNotificationChannels();\n  }\n\n  /**\n   * Get today's notification channels from database\n   * Returns unique channels that have notifications posted today\n   */\n  getTodaysNotificationChannels() {\n    console.log('📢 getTodaysNotificationChannels (from DB)');\n    this.stateService.getTodaysNotificationChannels();\n  }\n\n  /**\n   * Define and load previous day's notification channels from database\n   * Creates channels in memory and broadcasts updated list\n   */\n  definePreviousNotificationChannels() {\n    console.log('📢 definePreviousNotificationChannels');\n    this.stateService.definePreviousNotificationChannels();\n  }\n\n  /**\n   * Subscribe to a notification channel with optional date filter\n   * NOTE: MES- prefix is added automatically by HTTPManagerStateService\n   * @param channel Base channel name (without MES- prefix)\n   * @param options { startEpoch?, endEpoch? }\n   * @param user User info for subscription\n   */\n  subscribeToNotificationChannel(channel: string, options?: { startEpoch?: number; endEpoch?: number }, user?: any) {\n    // Add MES- prefix for local tracking (to match what state service sends)\n    const prefixedChannel = channel.startsWith('MES-') ? channel : `MES-${channel}`;\n    console.log('📢 subscribeToNotificationChannel:', prefixedChannel, options);\n\n    // Add to local subscribed channels immediately for UI feedback\n    const currentSubs = this.subscribedNotificationChannelsSubject.value;\n    currentSubs.add(prefixedChannel);\n    this.subscribedNotificationChannelsSubject.next(new Set(currentSubs));\n\n    // Send subscription request to server (state service adds MES- prefix)\n    this.stateService.subscribeToNotificationChannel(channel, options, user);\n  }\n\n  /**\n   * Unsubscribe from a notification channel\n   * NOTE: MES- prefix is added automatically by HTTPManagerStateService\n   */\n  unsubscribeFromNotificationChannel(channel: string) {\n    // Add MES- prefix for local tracking (to match what state service sends)\n    const prefixedChannel = channel.startsWith('MES-') ? channel : `MES-${channel}`;\n    console.log('📢 unsubscribeFromNotificationChannel:', prefixedChannel);\n\n    // Remove from local subscribed channels immediately for UI feedback\n    const currentSubs = this.subscribedNotificationChannelsSubject.value;\n    currentSubs.delete(prefixedChannel);\n    this.subscribedNotificationChannelsSubject.next(new Set(currentSubs));\n\n    // Send unsubscription request to server (state service adds MES- prefix)\n    this.stateService.unsubscribeFromNotificationChannel(channel);\n  }\n\n  /**\n   * Send a notification to a channel\n   * NOTE: MES- prefix is added automatically by HTTPManagerStateService\n   */\n  sendNotification(channel: string, content: any, user?: any) {\n    const notificationContent = {\n      sessionId: {\n        id: user?.id,\n        ldap: user?.ldap,\n        name: user?.name,\n        email: user?.email,\n        color: user?.color,\n      },\n      ...content\n    };\n\n    console.log('📢 sendNotification:', channel, notificationContent);\n\n    // State service adds MES- prefix\n    this.stateService.sendNotification(channel, notificationContent);\n  }\n\n}\n","import { RandomPaletteColor } from \"../../../services/utils/random-color.utils\"\n\nexport interface UserDataInterface {\n  ldap: string\n  name: string\n  email: string\n  color: string\n}\n\nexport class UserData implements UserDataInterface {\n\n  constructor(\n    public ldap = '',\n    public name = '',\n    public email = '',\n    public color = RandomPaletteColor(),\n  ) {}\n\n  static adapt(item?: any): UserData {\n\n    const userName = `${item?.first_name} ${item?.last_name}`\n\n    return new UserData(\n      item?.ldap,\n      userName,\n      item?.email,\n      item?.color,\n    )\n\n  }\n\n}\n","import { Injectable } from '@angular/core';\nimport { RandomNumber } from 'encryption-helpers';\nimport { RetryOptions, DataType, DatabaseStorage } from '../../../../models';\n\nimport { HTTPManagerStateService, ApiRequest, RequestOptions } from '../../../../services';\n\nimport { OIDCClient } from '../../models/oidc-client.model';\nimport { UserData } from '../../models/user-data.model';\nimport { ChannelMessage } from '../../../../services/ws-manager-service/models/channel-message.model';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class StateDataRequestService extends HTTPManagerStateService<any> {\n\n  attempts$ = this.wsRetryAttempts$\n  nextRetry$ = this.wsNextRetry$\n\n  path: (string|number)[] = ['items']\n\n  constructor() {\n    super(\n        ApiRequest.adapt({\n          server: '',\n          retry: RetryOptions.adapt({\n            times: 3,\n            delay: 1,\n          }),\n          displayError: true,\n          adapter: OIDCClient.adapt,\n          ws: {\n            id: ``,\n            // wsChannels: ['allChannels'],\n            // access: ['read,write,delete,update'],\n            wsServer: '',\n            jwtToken: '',\n            user: UserData.adapt(),\n            retry: RetryOptions.adapt({\n              times: 3,\n              delay: 10,\n            }),\n          }\n        }),\n        DataType.ARRAY,\n        DatabaseStorage.adapt({\n          table: 'ws_demo_data',\n          expiresIn: '5mn',\n          // Guarantees the two-instance demo scenario converges even when a WS broadcast is\n          // missed (dropped connection, subscribe-window race) — see the\n          // http-request-manager-cross-instance-reconciliation change. A 15s interval keeps\n          // manual verification fast; production consumers would likely pick something longer.\n          reconcile: true,\n          reconcileIntervalMs: 15000,\n        })\n      )\n    }\n\n    updateConnection(\n      server: string,\n      wsServer: string,\n      jwtToken: string,\n      user: any,\n      path: (string|number)[] = [],\n    ) {\n\n      this.path = path\n\n      this.setApiRequestOptions({\n          server,\n          retry: RetryOptions.adapt({\n            times: 3,\n            delay: 1,\n          }),\n          displayError: true,\n          adapter: OIDCClient.adapt,\n          ws: {\n            id: this.path.join('/'),\n            wsServer,\n            jwtToken,\n            user, // general info about user\n            retry: RetryOptions.adapt({\n              times: 3,\n              delay: 10,\n            }),\n          }\n        })\n\n    }\n\n    addData() {\n\n      const num = RandomNumber(1000, 9999)\n\n      // name/domain/service are required by api-test-server's POST /items (CREATE_REQUIRED_FIELDS).\n      const newData = {\n          \"name\": \"Demo Service\",\n          \"domain\": \"sample.com\",\n          \"service\": `service-${num}`,\n          \"spiffe\": `sample.com/developer/${num}`,\n          \"email\": \"mikeboni@hotmail.com\"\n      }\n\n      this.createRecord(newData, RequestOptions.adapt({ path: this.path }) )\n\n    }\n\n    sendMessage(data: ChannelMessage) {\n      console.log('sendMessage', data)\n      this.wsMessaging(data)\n    }\n\n    getData() {\n      // This server wraps the list response as { data: [...] } but returns bare objects for\n      // single-record GET/POST/PUT/DELETE — selector is scoped to this GET call only (via\n      // updateRequestOptions's per-request override) so it doesn't affect addData/updateData/deleteData.\n      this.fetchRecords(RequestOptions.adapt({ path: this.path, selector: 'data' }) )\n    }\n\n    updateData(data: any) {\n      const sampleOptions = RequestOptions.adapt({ path: [...this.path, data.id] })\n      console.log('updateData', sampleOptions)\n      this.updateRecord(data, sampleOptions)\n\n    }\n\n    deleteData(data: any) {\n      const sampleOptions = RequestOptions.adapt({ path: [...this.path, data.id] })\n      console.log('deleteData', sampleOptions)\n      this.deleteRecord(sampleOptions)\n    }\n\n}\n","import { Component, inject, Input, OnInit, OnChanges, SimpleChanges, ChangeDetectionStrategy } from '@angular/core';\nimport { RandomNumber } from 'encryption-helpers';\n\nimport { StateDataRequestService } from '../services/state-data-request.service';\nimport { switchMap, timer, map, startWith } from 'rxjs';\nimport { WebSocketMessageService } from '../../../../services/ws-manager-service/messaging/websocket-message.service';\nimport { StateMessage } from '../../../../services/ws-manager-service/models/state-message.model';\nimport { RequestOptions } from '../../../../services';\n\n@Component({\n    selector: 'app-ws-data-control',\n    templateUrl: './ws-data-control.component.html',\n    styleUrls: ['./ws-data-control.component.scss'],\n    changeDetection: ChangeDetectionStrategy.Default,\n    standalone: false\n})\nexport class WsDataControlComponent implements OnInit, OnChanges {\n\n  @Input() server!: string;\n  @Input() wsServer!: string;\n  @Input() jwtToken!: string;\n  @Input() user!: any;\n  @Input() path: (string|number)[] = ['items'];\n\n  stateDataRequestService = inject(StateDataRequestService)\n  webSocketMessageService = inject(WebSocketMessageService)\n\n  userAction$ = this.stateDataRequestService.userAction$\n  .pipe(\n    switchMap((action) =>\n      timer(3 * 1000).pipe(\n        map(() => null),\n        startWith(action)\n      )\n    )\n  );\n\n  data$ = this.stateDataRequestService.data$;\n\n  ngOnInit() {\n    this.stateDataRequestService.updateConnection(this.server, this.wsServer, this.jwtToken, this.user, this.path);\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['jwtToken'] && !changes['jwtToken'].firstChange) {\n      this.stateDataRequestService.updateConnection(this.server, this.wsServer, this.jwtToken, this.user, this.path);\n      this.stateDataRequestService.getData()\n    }\n  }\n\n  onGetData() {\n    // reconcile() (not getData()/fetchRecords()) so the button forces the same immediate,\n    // authoritative correction the 15s auto-sync does, rather than a call that may just serve\n    // the (possibly stale) local cache — calling both here would race: they'd claim the same\n    // in-flight signature and one would silently no-op. Passes the path explicitly rather than\n    // relying on a prior fetchRecords() call to have set it: ngOnInit() only calls\n    // updateConnection(), not getData(), so this can be the very first request of the session.\n    this.stateDataRequestService.reconcile(RequestOptions.adapt({ path: this.path, selector: 'data' }))\n  }\n\n  onAddData() {\n    this.stateDataRequestService.addData()\n  }\n\n  onUpdateData(data: any[]) {\n\n    // This server's PUT validates the full record shape (name/domain/service/spiffe/secret/\n    // created/modified/icon/imageFile/email) and 400s on a partial body — spread the existing\n    // record so every required field survives, only overriding the ones this demo actually changes.\n    const existing = data?.[0]\n    if (!existing) return\n\n    // spiffe gets a fresh random suffix on every click (same technique as the original demo's\n    // hardcoded update) so the table's Spiffe column visibly changes — proof the PUT actually\n    // took effect, not just a no-op round-trip of the same values.\n    const num = RandomNumber(1000, 9999)\n\n    // PUT /items/:id replaces the whole record, so preserve the existing row's fields\n    // (name/domain/service/secret/icon/imageFile) required by api-test-server\n    // (REPLACE_REQUIRED_FIELDS) rather than sending only the demo-specific ones.\n    const newData = {\n      ...existing,\n      name: this.user?.name || existing.name,\n      email: this.user?.email || existing.email,\n      spiffe: `${existing.domain || 'example.com'}/developer/${num}`,\n    }\n\n    this.stateDataRequestService.updateData(newData)\n\n  }\n\n  onRemoveData(data: any) {\n    const lastRec = data[data.length -1]\n    this.stateDataRequestService.deleteData(lastRec)\n  }\n\n  /**\n   * Test direct state message via WebSocketMessageService\n   * Sends an UPDATE message that should trigger fetchRecord() in the state manager\n   *\n   * @param recordId - The record ID to update (default: 63)\n   * @param useFakeSessionId - If true, uses a fake sessionId to avoid filtering (default: true)\n   * @param customSessionId - Optional custom sessionId (overrides useFakeSessionId if provided)\n   */\n  onTestDirectStateMessage(recordId: number = 63, useFakeSessionId: boolean = true, customSessionId?: string) {\n    // Get actual sessionId from sessionStorage (stored by HTTPManagerStateService)\n    const actualSessionId = sessionStorage.getItem('WSID') || 'unknown';\n\n    // Determine sessionId to use\n    let sessionId: string;\n    if (customSessionId) {\n      sessionId = customSessionId;\n    } else if (useFakeSessionId) {\n      sessionId = `test-${Date.now()}`;\n    } else {\n      // Use actual sessionId (will be filtered out by receiver)\n      sessionId = actualSessionId;\n    }\n\n    // Build StateMessage with same structure as CRUD operations\n    const stateMessage: StateMessage = {\n      sessionId: {\n        id: sessionId,\n        name: useFakeSessionId ? 'Test Sender' : (this.user?.name || 'Current User')\n      },\n      content: {\n        method: 'UPDATE',\n        path: ['items', recordId],\n        user: {\n          id: sessionId,\n          name: useFakeSessionId ? 'Test Sender' : (this.user?.name || 'Current User')\n        }\n      }\n    };\n\n    console.log('🧪 [TEST] Sending direct state message:', {\n      recordId,\n      sessionId,\n      actualSessionId,\n      useFakeSessionId,\n      stateMessage\n    });\n\n    const success = this.webSocketMessageService.sendStateMessage(\n      ['items'],\n      stateMessage\n    );\n\n    console.log('🧪 [TEST] Message sent:', {\n      success,\n      actualSessionId,\n      sentSessionId: sessionId,\n      expectedBehavior: success\n        ? 'Server will broadcast to SYS-items subscribers'\n        : 'Failed to send (check connection)',\n      receiverBehavior: sessionId !== actualSessionId\n        ? 'Receiver will process message and call fetchRecord()'\n        : 'Receiver will filter out (sessionId match)'\n    });\n  }\n\n}\n","@if ((data$ | async); as data) {\n  <div style=\"margin: 1rem;\">\n    <div style=\"margin-top: 1rem; margin-bottom: 1rem;\">\n      <mat-divider></mat-divider>\n    </div>\n\n    @if ((userAction$ | async); as userAction) {\n      <div class=\"box\" style=\"margin-bottom: 1rem;\">\n        {{ userAction?.content?.user?.name }} has {{ userAction?.content?.method }}\n      </div>\n    }\n\n    <h3 style=\"margin: 0;\">Data Actions</h3>\n    <div style=\"display: flex; gap: 1rem; margin-bottom: 1rem;\">\n      <button mat-stroked-button (click)=\"onGetData()\">Get Data</button>\n      <div style=\"flex:1\"></div>\n      <button mat-stroked-button color=\"accent\" (click)=\"onUpdateData(data)\">Update Data</button>\n      <button mat-stroked-button color=\"warn\" (click)=\"onRemoveData(data)\">Remove Data</button>\n      <button mat-stroked-button color=\"primary\" (click)=\"onAddData()\">Add Data</button>\n    </div>\n\n    <h3 style=\"margin: 0; margin-top: 1rem;\">WebSocketMessageService Test</h3>\n\n    <p style=\"font-size: 0.875rem; color: #666; margin: 0;\">\n      <strong>Note:</strong> \"Fake SessionId\" will be received and processed. \"Current SessionId\" will be filtered out (self-message).\n      @if (data.length > 0) {\n        <div>\n          <table mat-table [dataSource]=\"data\" style=\"border: 1px solid grey;\">\n            <ng-container matColumnDef=\"id\">\n              <th mat-header-cell *matHeaderCellDef> ID </th>\n              <td mat-cell *matCellDef=\"let element\"> {{element.id}} </td>\n            </ng-container>\n            <ng-container matColumnDef=\"spiffe\">\n              <th mat-header-cell *matHeaderCellDef> Spiffe </th>\n              <td mat-cell *matCellDef=\"let element\"> {{element.spiffe}} </td>\n            </ng-container>\n            <ng-container matColumnDef=\"name\">\n              <th mat-header-cell *matHeaderCellDef> Name </th>\n              <td mat-cell *matCellDef=\"let element\"> {{element.name}}</td>\n            </ng-container>\n            <ng-container matColumnDef=\"email\">\n              <th mat-header-cell *matHeaderCellDef> Email </th>\n              <td mat-cell *matCellDef=\"let element\"> {{element.email}} </td>\n            </ng-container>\n            <tr mat-header-row *matHeaderRowDef=\"['id', 'spiffe', 'name', 'email']\"></tr>\n            <tr mat-row *matRowDef=\"let row; columns: ['id', 'spiffe', 'name', 'email'];\"></tr>\n          </table>\n          <div style=\"border: 1px solid grey; padding: .5rem; border-top: none;\">\n            <h3 style=\"margin: 0;\">Total Records {{ data.length }}</h3>\n          </div>\n        </div>\n      } @else {\n        <div style=\"margin-top: 1rem; font-style: italic;\">\n          No Data Available\n        </div>\n      }\n\n      <div style=\"margin-bottom: 1rem; margin-top: 1rem;\">\n        <mat-divider></mat-divider>\n      </div>\n\n      <div style=\"display: flex; gap: 0.5rem; margin-bottom: 1rem;\">\n        <button mat-flat-button color=\"primary\" (click)=\"onTestDirectStateMessage(63, true)\">\n          Test UPDATE (Fake Id)\n        </button>\n        <button mat-stroked-button (click)=\"onTestDirectStateMessage(63, false)\">\n          Test UPDATE (Current Id)\n        </button>\n        <button mat-stroked-button (click)=\"onTestDirectStateMessage(63, false, 'custom-session-123')\">\n          Test UPDATE (Custom Id)\n        </button>\n      </div>\n\n    </div>\n  }\n\n","import { Component, inject, Input, OnInit, OnDestroy, ChangeDetectionStrategy } from '@angular/core';\nimport { MessageServiceDemo } from '../../services/message-service-demo.service';\nimport { StateServiceDemo } from '../../services/state-service-demo.service';\nimport { FormBuilder, FormControl, Validators } from '@angular/forms';\nimport { Observable, combineLatest, map, EMPTY, Subject, takeUntil, filter, take, startWith, distinctUntilChanged } from 'rxjs';\n\nimport { ChannelMessage } from '../../../../services/ws-manager-service/models/channel-message.model';\nimport { MessageDisplayRouterService } from '../../../../message-display/services/message-display-router.service';\n\n@Component({\n    selector: 'app-ws-messaging',\n    templateUrl: './ws-messaging.component.html',\n    styleUrls: ['./ws-messaging.component.css'],\n    changeDetection: ChangeDetectionStrategy.Default,\n    standalone: false\n})\nexport class WsMessagingComponent implements OnInit, OnDestroy {\n\n  @Input() server!: string;\n  @Input() wsServer!: string;\n  @Input() jwtToken!: string;\n  @Input() user!: any;\n  @Input() path: (string|number)[] = ['items'];  // Default path for channel name\n\n  private destroy$ = new Subject<void>();\n\n  fb = inject(FormBuilder);\n  messageService = inject(MessageServiceDemo);\n  stateService = inject(StateServiceDemo);\n  messageDisplayService = inject(MessageDisplayRouterService);\n\n  // Only show public channels (starting with \"PUB-\"), strip prefix for display\n  // SYS- channels are private/internal and hidden from users\n  channels$ = this.messageService.channels$.pipe(\n    map(channels => channels\n      ?.filter(channel => channel.startsWith('PUB-'))\n      .map(channel => channel.replace('PUB-', '')) || []\n    ),\n    startWith([] as string[]),\n    distinctUntilChanged((prev, curr) => prev.length === curr.length && prev.every((v, i) => v === curr[i]))\n  );\n\n  // Track subscribed public channels only, strip prefix for display\n  subscribedChannels$ = this.messageService.subscribedChannels$.pipe(\n    map(set => Array.from(set)\n      .filter(channel => channel.startsWith('PUB-'))\n      .map(channel => channel.replace('PUB-', ''))\n    ),\n    startWith([] as string[]),\n    distinctUntilChanged((prev, curr) => prev.length === curr.length && prev.every((v, i) => v === curr[i]))\n  );\n\n  user$ = this.stateService.user$;\n\n  data$ = this.stateService.data$;\n\n  connectionStatus$ = this.stateService.connectionStatus$;\n\n  // Form for creating new channels\n  newChannelName = this.fb.control<string>('', [Validators.required, Validators.minLength(2)])\n\n  // Form for selecting channels to send to and message content.\n  // content starts disabled since selectedChannels starts empty; kept in sync in ngOnInit().\n  messages = this.fb.group({\n    selectedChannels: this.fb.control<string[]>([], Validators.required),\n    content: this.fb.control<string|null>({ value: null, disabled: true }, Validators.required),\n  })\n\n  get selectedChannels() {\n    return this.messages.get('selectedChannels') as FormControl\n  }\n\n  get content() {\n    return this.messages.get('content') as FormControl\n  }\n\n  communicationMessages$ = this.messageService.communicationMessages$;\n  latestCommunicationMessages$ = this.messageService.latestCommunicationMessages$;\n\n  chat$: Observable<{ user: any, messages: any[]}|any> = combineLatest([this.user$, this.communicationMessages$])\n  .pipe(\n    map(([user, messages]: any) => ({ user, messages })),\n    map(obj => {\n\n      if(!obj.user) return EMPTY\n\n      const mainUser = ''\n\n      const messages = obj.messages.map((item: any) => {\n        // Message transformation logic\n      })\n\n      return { user: mainUser, messages }\n\n    })\n  );\n\n  ngOnInit() {\n\n    this.stateService.updateConnection(this.server, this.wsServer, this.jwtToken, this.user, this.path);\n\n    // Keep the message field enabled only while a send target is actually selected.\n    // selectedChannels itself is never disabled here -- it's the only way to leave this state.\n    this.selectedChannels.valueChanges.pipe(\n      takeUntil(this.destroy$)\n    ).subscribe((channels) => {\n      if (channels && channels.length > 0) this.content.enable();\n      else this.content.disable();\n    });\n\n    // Fetch the channel list on every connect and reconnect, not just the first\n    this.connectionStatus$.pipe(\n      filter(status => status === true),\n      takeUntil(this.destroy$)\n    ).subscribe(() => {\n      console.log('📋 Fetching channels after connection...');\n      this.messageService.getAllChannels();\n    });\n\n    // Subscribe to latest messages and display using rule-based routing\n    this.latestCommunicationMessages$.pipe(\n      filter(message => !!message),\n      takeUntil(this.destroy$)\n    ).subscribe((message: any) => {\n      console.log('🔔 Message received, routing to display:', message);\n\n      // NEW: Delegate to MessageDisplayRouterService\n      // The message payload determines the display type via rules\n      this.messageDisplayService.display(message);\n\n      // OLD: Hardcoded snackbar (removed)\n      // const messageContent = message.content?.content?.message || message.content?.message || '';\n      // this.toastService.toastMessage(...);\n    });\n\n  }\n\n  ngOnDestroy() {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  /**\n   * Create a new public channel without auto-subscribing\n   * NOTE: PUB- prefix is added by messageService.createChannel\n   */\n  onCreateChannel() {\n    if (this.newChannelName.invalid) return;\n\n    const channelName = this.newChannelName.value?.trim();\n    if (channelName) {\n      // Pass base channel name - service adds PUB- prefix\n      this.messageService.createChannel(channelName);\n      this.newChannelName.reset();\n      // Server will broadcast updated channel list to all clients automatically\n    }\n  }\n\n  /**\n   * Subscribe to a channel to receive messages\n   * NOTE: PUB- prefix is added by messageService.subscribeToChannel\n   */\n  onSubscribeToChannel(channel: string) {\n    // Pass base channel name - service adds PUB- prefix\n    this.messageService.subscribeToChannel(channel);\n  }\n\n  /**\n   * Unsubscribe from a channel\n   * NOTE: PUB- prefix is added by messageService.unsubscribeFromChannel\n   */\n  onUnsubscribeFromChannel(channel: string) {\n    // Pass base channel name - service adds PUB- prefix\n    this.messageService.unsubscribeFromChannel(channel);\n  }\n\n  /**\n   * Channels the user has clicked but whose subscribe/unsubscribe confirmation\n   * hasn't arrived yet, keyed by channel with the intended (optimistic) selected\n   * state. Lets isSubscribed() reflect a click immediately instead of the stale\n   * subscribedChannels$ value a change-detection cycle would otherwise re-assert\n   * during the server round-trip, which is what caused the chip to visibly\n   * flicker back and require repeated clicks.\n   */\n  private pendingChipSelections = new Map<string, boolean>();\n\n  /**\n   * Handle chip toggle for subscribe/unsubscribe\n   */\n  onChipToggle(event: any, channel: string) {\n    const isSelected = event.selected;\n\n    console.log('🎯 Chip toggle event:', {\n      channel,\n      isSelected,\n      isUserInput: event.isUserInput,\n      option: event.source\n    });\n\n    // Only a real click/keyboard activation sets isUserInput; change detection\n    // re-pushing [selected] against a not-yet-confirmed subscribedChannels$ value\n    // also fires selectionChange (with isUserInput: false) and must not be\n    // treated as a second click, or it silently sends the opposite request.\n    if (!event.isUserInput) return;\n\n    this.pendingChipSelections.set(channel, isSelected);\n\n    if (isSelected) {\n      this.onSubscribeToChannel(channel);\n    } else {\n      this.onUnsubscribeFromChannel(channel);\n    }\n  }\n\n  /**\n   * Check if currently subscribed to a channel\n   * Compares display names (without PUB- prefix)\n   */\n  isSubscribed(channel: string, subscribedChannels: string[]): boolean {\n    const confirmed = subscribedChannels.includes(channel);\n    const pending = this.pendingChipSelections.get(channel);\n    if (pending === undefined) return confirmed;\n    if (pending === confirmed) {\n      // Confirmation caught up with the click -- nothing left to override.\n      this.pendingChipSelections.delete(channel);\n    }\n    return pending;\n  }\n\n  onSendMessage() {\n    this.messages.markAllAsTouched()\n\n    if (this.messages.invalid) return\n\n    const channelsToSend = this.selectedChannels.value as string[]\n    if (channelsToSend.length === 0) return\n\n    // Get user from observable - subscribe once\n    this.user$.pipe(take(1)).subscribe(user => {\n      if (!user) {\n        console.error('❌ No user found');\n        return;\n      }\n\n      // Pass base channel names - service adds PUB- prefix\n      const message = ChannelMessage.adapt({\n        sessionId: {  // user object with 'id' as the ID field\n          id: user.id,\n          ldap: user.ldap,\n          name: user.name,\n          email: user.email,\n        },\n        content: { message: this.messages.value.content },\n      })\n\n      this.messageService.sendMessage(message, channelsToSend);\n      this.content.reset();\n    });\n\n  }\n\n}\n","\n  @if ((data$ | async); as data) {\n  @if ((user$ | async); as user) {\n    <div style=\"display: flex; gap: 1rem; flex-direction: column; margin-top: 1rem;\">\n\n        <!-- Channel Creation Section -->\n        <div style=\"padding: 1rem; background: #e3f2fd; border-radius: 4px;\">\n          <strong>Create New Channel</strong>\n          <div style=\"display: flex; flex-direction: column; margin-top: 0.5rem;\">\n            <mat-form-field appearance=\"outline\" style=\"width: 100%;\">\n              <mat-label>Channel Name</mat-label>\n              <input matInput [formControl]=\"newChannelName\" placeholder=\"Enter channel name\"\n                     (keydown.enter)=\"onCreateChannel()\">\n            </mat-form-field>\n            <div style=\"display: flex; justify-content: flex-end; margin-top: -0.5rem;\">\n              <button mat-raised-button color=\"primary\" (click)=\"onCreateChannel()\"\n                      [disabled]=\"newChannelName.invalid\">\n                Create Channel\n              </button>\n            </div>\n          </div>\n        </div>\n\n    </div>\n  }\n  }\n\n  <!-- Send Message + Subscribe to Channel(s), side by side (collapses to 1 column below ~640px) -->\n  <div style=\"display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 1rem; margin-top: 1rem;\">\n\n    <!-- Messaging Section - only show when a channel exists to send to -->\n    @if ((data$ | async); as data) {\n    @if ((user$ | async); as user) {\n      @if ((channels$ | async); as channels) {\n        @if (channels.length > 0) {\n          <div style=\"padding: 1rem; background: #fff3e0; border-radius: 4px;\" [formGroup]=\"messages\"\n               [class.ws-messaging-send-panel--inactive]=\"content.disabled\">\n            <strong>Send Message</strong>\n\n            <!-- Channel Selection with Checkboxes -->\n            <div style=\"margin-top: 0.5rem;\">\n              <mat-form-field appearance=\"outline\" style=\"width: 100%;\">\n                <mat-label>Select Channels</mat-label>\n                <mat-select formControlName=\"selectedChannels\" multiple>\n                  <mat-select-trigger>\n                    @if (selectedChannels.value?.length === 1) {\n                      {{ selectedChannels.value[0] }}\n                    } @else if (selectedChannels.value?.length > 1) {\n                      {{ selectedChannels.value[0] }} (+{{ selectedChannels.value.length - 1 }} {{ selectedChannels.value.length === 2 ? 'other' : 'others' }})\n                    }\n                  </mat-select-trigger>\n                  @for (channel of channels; track channel; let i = $index) {\n                    <mat-option [value]=\"channel\">{{ channel }}</mat-option>\n                  }\n                </mat-select>\n              </mat-form-field>\n            </div>\n\n            <!-- Message Input -->\n            <div style=\"display: flex; flex-direction: column;\">\n              <mat-form-field style=\"width: 100%;\" appearance=\"outline\">\n                <mat-label>Message</mat-label>\n                <textarea\n                  matInput placeholder=\"Type your message...\"\n                  formControlName=\"content\"\n                  (keydown.enter)=\"onSendMessage(); $event.preventDefault()\"\n                ></textarea>\n              </mat-form-field>\n              <div style=\"display: flex; justify-content: flex-end; margin-top: -0.5rem;\">\n                <button mat-raised-button color=\"primary\" (click)=\"onSendMessage()\"\n                        [disabled]=\"messages.invalid\">\n                  Send\n                </button>\n              </div>\n            </div>\n          </div>\n        }\n      }\n    }\n    }\n\n    <!-- Channel List with Subscription Controls using Chips - only show when a channel exists -->\n    @if ((channels$ | async); as channels) {\n      @if (channels.length > 0) {\n        @if ((subscribedChannels$ | async); as subscribedChannels) {\n          <div style=\"padding: 1rem; background: #f5f5f5; border-radius: 4px;\">\n            <strong>Subscribe to Channel(s)</strong>\n            <!-- Debug: Show subscribed channels count -->\n            <div style=\"font-size: 0.8rem; color: #666; margin-bottom: 0.5rem;\">\n              Subscribed to {{ subscribedChannels.length }} channel(s): {{ subscribedChannels | json }}\n            </div>\n            <div style=\"margin-top: 0.5rem;\">\n              <mat-chip-listbox\n                aria-label=\"Channel selection\"\n                [multiple]=\"true\">\n                @for (channel of channels; track channel; let i = $index) {\n                  <mat-chip-option\n                    [selected]=\"isSubscribed(channel, subscribedChannels)\"\n                    (selectionChange)=\"onChipToggle($event, channel)\">\n                    {{ channel }}\n                  </mat-chip-option>\n                }\n              </mat-chip-listbox>\n            </div>\n          </div>\n        }\n      }\n    }\n\n  </div>\n","import { Component, inject, Input, OnInit, OnDestroy, ChangeDetectionStrategy } from '@angular/core';\nimport { NotificationServiceDemo } from '../../services/notification-service-demo.service';\nimport { StateServiceDemo } from '../../services/state-service-demo.service';\nimport { FormBuilder, FormControl, Validators } from '@angular/forms';\nimport { Subject, takeUntil, filter, startWith, distinctUntilChanged, map, tap, combineLatest } from 'rxjs';\n\n@Component({\n    selector: 'app-ws-notifications',\n    templateUrl: './ws-notifications.component.html',\n    styleUrls: ['./ws-notifications.component.css'],\n    changeDetection: ChangeDetectionStrategy.Default,\n    standalone: false\n})\nexport class WsNotificationsComponent implements OnInit, OnDestroy {\n\n  @Input() server!: string;\n  @Input() wsServer!: string;\n  @Input() jwtToken!: string;\n  @Input() user!: any;\n\n  private destroy$ = new Subject<void>();\n\n  fb = inject(FormBuilder);\n  notificationService = inject(NotificationServiceDemo);\n  stateService = inject(StateServiceDemo);\n\n  // Combine in-memory channels and today's DB channels, dedupe and strip prefix for display\n  todaysNotificationChannels$ = combineLatest([\n    this.notificationService.notificationChannels$.pipe(startWith([] as string[])),\n    this.notificationService.todaysNotificationChannels$.pipe(startWith([] as string[]))\n  ]).pipe(\n    tap(([inMemory, fromDb]) => console.log('📢 In-memory channels:', inMemory, 'DB channels:', fromDb)),\n    map(([inMemory, fromDb]) => {\n      // Merge both sources and dedupe\n      const allChannels = [...(inMemory || []), ...(fromDb || [])];\n      const uniqueChannels = [...new Set(allChannels)]\n        .filter(channel => channel.startsWith('MES-'))\n        .map(channel => channel.replace('MES-', ''));\n      return uniqueChannels.sort();\n    }),\n    tap(channels => console.log('📢 Combined channels for display:', channels)),\n    distinctUntilChanged((prev, curr) => prev.length === curr.length && prev.every((v, i) => v === curr[i]))\n  );\n\n  // Track subscribed notification channels, strip prefix for display\n  subscribedNotificationChannels$ = this.notificationService.subscribedNotificationChannels$.pipe(\n    map(set => Array.from(set)\n      .filter(channel => channel.startsWith('MES-'))\n      .map(channel => channel.replace('MES-', ''))\n    ),\n    startWith([] as string[]),\n    distinctUntilChanged((prev, curr) => prev.length === curr.length && prev.every((v, i) => v === curr[i]))\n  );\n\n  // Notification messages\n  notificationMessages$ = this.notificationService.notificationMessages$;\n\n  connectionStatus$ = this.stateService.connectionStatus$;\n\n  /**\n   * Helper to ensure channel has MES- prefix for outgoing communication\n   */\n  private toNotificationChannel(channel: string): string {\n    return channel.startsWith('MES-') ? channel : `MES-${channel}`;\n  }\n\n  // Form for creating new notification channels\n  newChannelName = this.fb.control<string>('', [Validators.required, Validators.minLength(2)]);\n\n  // Channel connection selection\n  selectedConnectionChannel = this.fb.control<string | null>(null);\n  connectedChannel: string | null = null;\n\n  // Table columns for notifications display\n  displayedColumns: string[] = ['date', 'user', 'message'];\n\n  // Form for date filter when subscribing\n  dateFilter = this.fb.group({\n    startDate: this.fb.control<Date | null>(null),\n    endDate: this.fb.control<Date | null>(null),\n  });\n\n  // Form for sending notifications\n  notificationForm = this.fb.group({\n    content: this.fb.control<string | null>(null, Validators.required),\n  });\n\n  get content() {\n    return this.notificationForm.get('content') as FormControl;\n  }\n\n  /**\n   * Check if currently connected to a channel\n   */\n  isChannelConnected(subscribedChannels: string[]): boolean {\n    return this.connectedChannel !== null && subscribedChannels.includes(this.connectedChannel);\n  }\n\n  /**\n   * Connect to the selected channel\n   */\n  onConnectToChannel() {\n    const channel = this.selectedConnectionChannel.value;\n    if (!channel) return;\n\n    this.connectedChannel = channel;\n    this.onSubscribeToChannel(channel);\n  }\n\n  /**\n   * Disconnect from the current channel\n   */\n  onDisconnectFromChannel() {\n    if (this.connectedChannel) {\n      this.onUnsubscribeFromChannel(this.connectedChannel);\n      this.connectedChannel = null;\n    }\n  }\n\n  ngOnInit() {\n    // Request today's notification channels when connection is established\n    this.connectionStatus$.pipe(\n      filter(isConnected => isConnected),\n      takeUntil(this.destroy$)\n    ).subscribe(() => {\n      // Request the list of today's notification channels from database\n      this.notificationService.getTodaysNotificationChannels();\n    });\n  }\n\n  ngOnDestroy() {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  /**\n   * Create a new notification channel\n   */\n  onCreateChannel() {\n    if (this.newChannelName.invalid) return;\n\n    const channelName = this.newChannelName.value?.trim();\n    if (channelName) {\n      this.notificationService.createNotificationChannel(channelName);\n      this.newChannelName.reset();\n    }\n  }\n\n  /**\n   * Define and load previous channels\n   */\n  onDefinePreviousChannels() {\n    this.notificationService.definePreviousNotificationChannels();\n  }\n\n  /**\n   * Subscribe to a notification channel with optional date filter\n   */\n  onSubscribeToChannel(channel: string) {\n    const startDate = this.dateFilter.get('startDate')?.value as Date | null;\n    const endDate = this.dateFilter.get('endDate')?.value as Date | null;\n\n    const options: { startEpoch?: number; endEpoch?: number } = {};\n\n    if (startDate) {\n      // Set to start of day\n      const startOfDay = new Date(startDate);\n      startOfDay.setHours(0, 0, 0, 0);\n      options.startEpoch = Math.floor(startOfDay.getTime() / 1000);\n    }\n    if (endDate) {\n      // Set to end of day\n      const endOfDay = new Date(endDate);\n      endOfDay.setHours(23, 59, 59, 999);\n      options.endEpoch = Math.floor(endOfDay.getTime() / 1000);\n    }\n\n    this.notificationService.subscribeToNotificationChannel(channel, options, this.user);\n  }\n\n  /**\n   * Unsubscribe from a notification channel\n   */\n  onUnsubscribeFromChannel(channel: string) {\n    this.notificationService.unsubscribeFromNotificationChannel(channel);\n  }\n\n  /**\n   * Check if currently subscribed to a channel\n   */\n  isSubscribed(channel: string, subscribedChannels: string[]): boolean {\n    return subscribedChannels.includes(channel);\n  }\n\n  /**\n   * Handle chip click - toggle subscription state\n   */\n  onChipClick(channel: string, subscribedChannels: string[]) {\n    const isCurrentlySubscribed = this.isSubscribed(channel, subscribedChannels);\n    if (isCurrentlySubscribed) {\n      this.onUnsubscribeFromChannel(channel);\n    } else {\n      this.onSubscribeToChannel(channel);\n    }\n  }\n\n  /**\n   * Send a notification\n   */\n  onSendNotification() {\n    this.notificationForm.markAllAsTouched();\n\n    if (this.notificationForm.invalid) return;\n\n    const channel = this.connectedChannel;\n    if (!channel) return;\n\n    const messageContent = {\n      message: this.content.value\n    };\n\n    this.notificationService.sendNotification(channel, messageContent, this.user);\n    this.content.reset();\n  }\n\n  /**\n   * Format epoch timestamp to readable date/time\n   */\n  formatTimestamp(epoch: number): string {\n    return new Date(epoch * 1000).toLocaleString();\n  }\n\n  /**\n   * Get today's date in YYYY-MM-DD format for date input default\n   */\n  getTodayDate(): string {\n    return new Date().toISOString().split('T')[0];\n  }\n\n}\n","<div style=\"display: flex; gap: 1rem; flex-direction: column; margin-top: 1rem;\">\n\n  <!-- Channel Creation Section -->\n  <div style=\"padding: 1rem; background: #e8f5e9; border-radius: 4px;\">\n    <strong>Create Notification Channel</strong>\n    <div style=\"display: flex; flex-direction: column; margin-top: 0.5rem;\">\n      <mat-form-field appearance=\"outline\" style=\"width: 100%;\">\n        <mat-label>Channel Name</mat-label>\n        <input\n          matInput\n          [formControl]=\"newChannelName\"\n          placeholder=\"Enter notification channel name\"\n          (keydown.enter)=\"onCreateChannel()\"\n        >\n      </mat-form-field>\n      <div style=\"display: flex; justify-content: flex-end; gap: 0.5rem;\">\n        <!-- <button mat-raised-button color=\"accent\" (click)=\"onDefinePreviousChannels()\">\n          Define Previous Channels\n        </button> -->\n        <button mat-raised-button color=\"primary\" (click)=\"onCreateChannel()\"\n                [disabled]=\"newChannelName.invalid\">\n          Create Channel 1\n        </button>\n      </div>\n    </div>\n  </div>\n\n  <!-- Channel Connection Section - Only shown when NOT connected -->\n  @if ((subscribedNotificationChannels$ | async); as subscribedChannels) {\n    @if (!isChannelConnected(subscribedChannels)) {\n      <div style=\"padding: 1rem; background: #e3f2fd; border-radius: 4px;\">\n        <strong>Connect to Channel</strong>\n        <div style=\"display: flex; gap: 1rem; margin-top: 0.5rem; flex-wrap: wrap; align-items: flex-start;\">\n          <!-- Channel Selection (from today's DB data) -->\n          <mat-form-field appearance=\"outline\" style=\"flex: 1; min-width: 200px;\">\n            <mat-label>Select Channel</mat-label>\n            <mat-select [formControl]=\"selectedConnectionChannel\" placeholder=\"Select a notification channel\">\n              @for (channel of (todaysNotificationChannels$ | async) || []; track channel) {\n                <mat-option [value]=\"channel\">{{ channel }}</mat-option>\n              }\n              @empty {\n                <mat-option disabled>No channels with data for today</mat-option>\n              }\n            </mat-select>\n          </mat-form-field>\n\n          <!-- Date Filter -->\n          <mat-form-field appearance=\"outline\" style=\"flex: 1; min-width: 200px;\" [formGroup]=\"dateFilter\">\n            <mat-label>Start Date</mat-label>\n            <input matInput [matDatepicker]=\"startPicker\" formControlName=\"startDate\">\n            <mat-datepicker-toggle matIconSuffix [for]=\"startPicker\"></mat-datepicker-toggle>\n            <mat-datepicker #startPicker></mat-datepicker>\n          </mat-form-field>\n\n          <mat-form-field appearance=\"outline\" style=\"flex: 1; min-width: 200px;\" [formGroup]=\"dateFilter\">\n            <mat-label>End Date</mat-label>\n            <input matInput [matDatepicker]=\"endPicker\" formControlName=\"endDate\">\n            <mat-datepicker-toggle matIconSuffix [for]=\"endPicker\"></mat-datepicker-toggle>\n            <mat-datepicker #endPicker></mat-datepicker>\n          </mat-form-field>\n        </div>\n\n        <div style=\"display: flex; gap: 0.5rem;\">\n          <span style=\"flex:1\"></span>\n          <button\n            mat-raised-button color=\"primary\"\n            (click)=\"onConnectToChannel()\"\n            [disabled]=\"!selectedConnectionChannel.value\"\n          >\n            Connect\n          </button>\n        </div>\n      </div>\n    }\n  }\n\n  <!-- Send Notification Section -->\n  @if ((subscribedNotificationChannels$ | async); as subscribedChannels) {\n    @if (subscribedChannels.length > 0) {\n      <div\n        style=\"padding: 1rem; background: #fff8e1; border-radius: 4px;\"\n        [formGroup]=\"notificationForm\"\n      >\n        <strong>Send Notification</strong>\n\n        <!-- Notification Content -->\n        <div style=\"display: flex; flex-direction: column; margin-top: 0.5rem;\">\n          <mat-form-field style=\"width: 100%;\" appearance=\"outline\">\n            <mat-label>Notification Message</mat-label>\n            <textarea\n              matInput placeholder=\"Type your notification...\"\n              formControlName=\"content\"\n              rows=\"2\"\n              (keydown.enter)=\"onSendNotification(); $event.preventDefault()\"\n            ></textarea>\n          </mat-form-field>\n          <div style=\"display: flex; justify-content: flex-end; margin-top: -0.5rem;\">\n            <button\n              mat-raised-button color=\"accent\"\n              (click)=\"onSendNotification()\"\n              [disabled]=\"notificationForm.invalid\"\n            >\n              Send Notification\n            </button>\n          </div>\n        </div>\n      </div>\n    }\n  }\n\n  <!-- Notifications Table - Only shown when connected -->\n  @if ((subscribedNotificationChannels$ | async); as subscribedChannels) {\n    @if (isChannelConnected(subscribedChannels)) {\n      @if ((notificationMessages$ | async); as notifications) {\n        <div>\n          <div style=\"display: flex; justify-content: space-between; align-items: center;\">\n            <strong>Notifications ({{ notifications.length }})</strong>\n          </div>\n\n          @if (notifications.length > 0) {\n            <div style=\"margin-top: 0.5rem; height: 400px; overflow: auto; border: 1px solid #888; border-radius: 4px;\">\n              <table mat-table [dataSource]=\"notifications\" style=\"width: 100%;\">\n\n                <!-- Date Column -->\n                <ng-container matColumnDef=\"date\">\n                  <th mat-header-cell *matHeaderCellDef style=\"width: 180px;\">Date</th>\n                  <td mat-cell *matCellDef=\"let notification\">\n                    {{ formatTimestamp(notification.created) | date }}\n                  </td>\n                </ng-container>\n\n                <!-- User Column -->\n                <ng-container matColumnDef=\"user\">\n                  <th mat-header-cell *matHeaderCellDef style=\"width: 150px;\">User</th>\n                  <td mat-cell *matCellDef=\"let notification\">\n                    <strong>{{ notification.user_name }}</strong>\n                  </td>\n                </ng-container>\n\n                <!-- Message Column -->\n                <ng-container matColumnDef=\"message\">\n                  <th mat-header-cell *matHeaderCellDef>Message</th>\n                  <td mat-cell *matCellDef=\"let notification\">\n                  <div class=\"pill\" [style.background-color]=\"notification.content.sessionId.color || '#000000'\">\n                    {{ notification.content?.message || notification.content }}\n                  </div>\n                  </td>\n                </ng-container>\n\n                <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n                <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n              </table>\n            </div>\n          } @else {\n            <div style=\"text-align: center; color: #666; padding: 2rem;\">\n              <mat-icon style=\"font-size: 48px; height: 48px; width: 48px; opacity: 0.5;\">notifications_none</mat-icon>\n              <p>No notifications yet. Waiting for notifications on this channel...</p>\n            </div>\n          }\n        </div>\n\n        <!-- Disconnect Button - Below the table -->\n        <div style=\"display: flex; justify-content: right; padding: 1rem;\">\n          <button mat-raised-button color=\"warn\" (click)=\"onDisconnectFromChannel()\">\n            Disconnect from Channel\n          </button>\n        </div>\n      }\n    }\n  }\n\n</div>\n","import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n    selector: 'app-ws-ai-messaging',\n    templateUrl: './ws-ai-messaging.component.html',\n    styleUrls: ['./ws-ai-messaging.component.css'],\n    changeDetection: ChangeDetectionStrategy.Default,\n    standalone: false\n})\nexport class WsAiMessagingComponent implements OnInit {\n\n  constructor() { }\n\n  ngOnInit() {\n  }\n\n}\n","<p>\n  ws-ai-messaging coming soon!\n</p>\n","import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n    selector: 'app-ws-chats',\n    templateUrl: './ws-chats.component.html',\n    styleUrls: ['./ws-chats.component.css'],\n    changeDetection: ChangeDetectionStrategy.Default,\n    standalone: false\n})\nexport class WsChatsComponent implements OnInit {\n\n  constructor() { }\n\n  ngOnInit() {\n  }\n\n}\n","<p>\n  ws-chats coming soon!\n</p>\n","import { Component, inject, OnInit, Input, OnChanges, SimpleChanges, ChangeDetectionStrategy } from '@angular/core';\nimport { FormBuilder, FormControl } from '@angular/forms';\n\nimport { HTTPManagerService } from '../../services/request-manager-services/http-manager.service';\nimport { StateServiceDemo } from './services';\n\n@Component({\n    selector: 'app-request-manager-ws-demo',\n    templateUrl: './request-manager-ws-demo.component.html',\n    styleUrls: ['./request-manager-ws-demo.component.css'],\n    changeDetection: ChangeDetectionStrategy.Default,\n    standalone: false\n})\nexport class RequestManagerWsDemoComponent implements OnInit, OnChanges {\n\n  httpManagerService = inject(HTTPManagerService)\n  stateService = inject(StateServiceDemo)\n\n  fb = inject(FormBuilder)\n\n  @Input() server!: string;\n  @Input() wsServer!: string;\n  @Input() jwtToken!: string;\n  @Input() user!: any;\n  @Input() path: string[] = ['items'];\n\n  retryCount$ = this.stateService.wsRetryCount$\n  maxRetries$ = this.stateService.wsMaxRetries$\n\n  connectionStatus$ = this.stateService.connectionStatus$\n  isConnecting$ = this.stateService.isConnecting$\n  connectionError$ = this.stateService.connectionError$\n\n  data$ = this.stateService.data$;\n  isPending$ = this.stateService.isPending$;\n\n  users$ = this.stateService.userList$\n  user$ = this.stateService.user$\n\n  wsServerControl = new FormControl('');\n\n  isUser = (user: any, userItem: any) => {\n    return user.id === userItem?.id\n  }\n\n  getUserLabel = (user: any) => {\n    const name = user.name || user.ldap || 'Anonymous';\n    const shortId = user.id ? user.id.substring(0, 8) : '';\n    return shortId ? `${name} (${shortId})` : name;\n  }\n\n  ngOnInit() {\n    this.wsServerControl.setValue(this.wsServer ?? '');\n    this.stateService.updateConnection(this.server, this.wsServer, this.jwtToken, this.user, this.path);\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['wsServer'] && !changes['wsServer'].firstChange && this.wsServerControl.pristine) {\n      this.wsServerControl.setValue(changes['wsServer'].currentValue ?? '');\n    }\n    if (changes['jwtToken'] && !changes['jwtToken'].firstChange) {\n      this.stateService.updateConnection(this.server, this.wsServerControl.value ?? '', this.jwtToken, this.user, this.path);\n    }\n  }\n\n  onConnect() {\n    this.stateService.updateConnection(this.server, this.wsServerControl.value ?? '', this.jwtToken, this.user, this.path);\n  }\n\n  onDisconnect() {\n    this.httpManagerService.disconnect();\n  }\n\n}\n","<div style=\"margin: 2rem;\">\n\n  <h2 style=\"display: flex;\">\n    <span style=\"flex:1\">HTTP Request State Manager - Websockets</span>\n    @if ((connectionStatus$ | async); as connected) {\n      <span>\n        WS -\n        <span style=\"color: green;\">Connected</span>\n      </span>\n    } @else if (connectionError$ | async) {\n      <span style=\"color: red;\">{{ connectionError$ | async }}</span>\n    } @else if (isConnecting$ | async) {\n      <span style=\"color: orange;\">Connecting... {{ retryCount$ | async }} / {{ maxRetries$ | async }}</span>\n    } @else {\n      <span style=\"color: red;\">Disconnected</span>\n    }\n  </h2>\n\n  <div>\n\n    @if (user) {\n      <div>\n        <mat-toolbar>\n          <div style=\"display: flex; flex:1\">\n            <div style=\"flex:1\">{{ user.name }}</div>\n            <div>({{ user.ldap }})</div>\n          </div>\n        </mat-toolbar>\n      </div>\n    }\n\n    @if ((isConnecting$ | async) && !(connectionStatus$ | async) && !(connectionError$ | async)) {\n      <div style=\"display: flex; align-items: center; gap: 1rem; padding: 0.5rem; background: #e3f2fd; border-radius: 4px; margin-bottom: 0.5rem;\">\n        <span>Connecting to WebSocket...</span>\n        <mat-progress-bar mode=\"indeterminate\" style=\"flex: 1;\"></mat-progress-bar>\n      </div>\n    }\n\n    @if (connectionError$ | async; as errorMsg) {\n      <div style=\"padding: 0.75rem 1rem; background: #fdecea; color: #b00020; border-left: 4px solid #b00020; border-radius: 2px; margin-bottom: 0.5rem;\">\n        {{ errorMsg }}\n      </div>\n    }\n\n    <div style=\"display: flex; align-items: center; justify-content: space-between; gap: 1rem; padding: 0.75rem 0; margin-bottom: 0.5rem;\">\n\n      <div style=\"display: flex; align-items: center; gap: 0.5rem;\">\n        @if ((users$ | async); as users) {\n          @if (users.length > 0) {\n            <h3 style=\"margin: 0;\">Connected Users</h3>\n          } @else {\n            <h3 style=\"margin: 0;\">No Users</h3>\n          }\n          <mat-chip-set>\n            @for (connectedUser of users; track $index) {\n              <mat-chip\n                [class.user-chip--primary]=\"isUser(connectedUser, (user$ | async))\"\n                [style.color]=\"isUser(connectedUser, (user$ | async)) ? '#fff' : null\"\n                [disableRipple]=\"true\"\n                >\n                {{ getUserLabel(connectedUser) }}\n              </mat-chip>\n            }\n          </mat-chip-set>\n        }\n      </div>\n\n      @if (!(connectionStatus$ | async) && !(isConnecting$ | async)) {\n        <div style=\"display: flex; align-items: center; gap: 0.75rem;\">\n          <mat-form-field appearance=\"outline\" style=\"margin-bottom: -1.25em;\">\n            <mat-label>WebSocket URL</mat-label>\n            <input matInput [formControl]=\"wsServerControl\" placeholder=\"ws://localhost:3000\" autocomplete=\"off\">\n          </mat-form-field>\n          <button mat-flat-button class=\"button-medium\" (click)=\"onConnect()\">Connect</button>\n        </div>\n      }\n\n      @if ((connectionStatus$ | async)) {\n        <button mat-stroked-button class=\"button-medium\" (click)=\"onDisconnect()\">Disconnect</button>\n      }\n\n    </div>\n\n    <mat-tab-group animationDuration=\"0ms\" [selectedIndex]=\"1\">\n\n      <mat-tab label=\"WS - Data Control\" [disabled]=\"!(connectionStatus$ | async)\">\n        <!-- DATA CONTROL -->\n        <app-ws-data-control\n          [server]=\"server\"\n          [wsServer]=\"wsServer\"\n          [jwtToken]=\"jwtToken\"\n          [user]=\"user\"\n          [path]=\"path\"\n        ></app-ws-data-control>\n\n      </mat-tab>\n\n      <mat-tab label=\"WS - Messaging\" [disabled]=\"!(connectionStatus$ | async)\">\n        <!-- MESSAGING -->\n        <app-ws-messaging\n          [server]=\"server\"\n          [wsServer]=\"wsServer\"\n          [jwtToken]=\"jwtToken\"\n          [user]=\"user\"\n          [path]=\"path\"\n        ></app-ws-messaging>\n\n    </mat-tab>\n\n    <mat-tab label=\"WS - Notifications\" [disabled]=\"!(connectionStatus$ | async)\">\n      <!-- WS - Notifications -->\n      <app-ws-notifications\n        [server]=\"server\"\n        [wsServer]=\"wsServer\"\n        [jwtToken]=\"jwtToken\"\n        [user]=\"user\"\n      ></app-ws-notifications>\n    </mat-tab>\n\n    <mat-tab label=\"WS - Chats\" [disabled]=\"true\">\n      <!-- WS - Chats -->\n      <app-ws-chats></app-ws-chats>\n    </mat-tab>\n\n    <mat-tab label=\"WS - AI Messaging\" [disabled]=\"true\">\n      <!-- WS - AI Messaging -->\n      <app-ws-ai-messaging></app-ws-ai-messaging>\n    </mat-tab>\n\n  </mat-tab-group>\n</div>\n\n</div>\n\n","export interface SettingsInterface {\n  enum_1: any\n  enum_2: any\n  enum_3: any\n  enum_4: any\n}\n\nexport class Settings implements SettingsInterface {\n\n  constructor(\n    public enum_1 = [],\n    public enum_2 = [],\n    public enum_3 = [],\n    public enum_4 = [],\n  ) {}\n\n  static adapt(item?: any): Settings {\n\n    return new Settings(\n      item?.enum_1,\n      item?.enum_2,\n      item?.enum_3,\n      item?.enum_4,\n    )\n\n  }\n\n}\n","import { Injectable } from '@angular/core';\n\nimport { map } from 'rxjs';\n\nimport { SettingOptions } from '../../../services/local-storage-manager-service/models/setting-options.model';\nimport { StorageType } from '../../../services/local-storage-manager-service/models/storage-type.enum';\nimport { StoreStateManagerService, StateStorageOptions } from '../../../services/store-state-manager-service';\nimport { Settings } from '../models/settings.model';\n\n\n@Injectable()\nexport class SettingsStateService extends StoreStateManagerService {\n\n  constructor() {\n\n    super(\n      StateStorageOptions.adapt({\n      store: 'sampleStore',\n      options: SettingOptions.adapt({\n        storage: StorageType.SESSION,\n        encrypted: false\n      }),\n      model: Settings.adapt,\n    }\n  ))\n\n  }\n\n  updateEnum_1(value: any) {\n    this.updateData(value)\n  }\n\n  updateEnum_2(value: any) {\n    this.updateData(value)\n  }\n\n  getEnum(key: string) {\n    return this.data$.pipe(\n      map(item => item[key])\n    )\n  }\n\n  getEnum_1() {\n    return this.data$.pipe(\n      map(item => item?.enum_1)\n    )\n  }\n\n}\n","export interface CounterStateInterface {\n  count: number\n}\n\nexport class CounterState implements CounterStateInterface {\n\n  constructor(\n    public count = 5,\n  ) {}\n\n  static adapt(item?: any): CounterState {\n    return new CounterState(\n      item?.count ?? 5,\n    )\n  }\n\n}\n","import { Injectable } from '@angular/core';\n\nimport { StoreStateManagerService, StateStorageOptions } from '../../../services/store-state-manager-service';\nimport { CounterState } from '../models/counter-state.model';\n\n@Injectable()\nexport class CounterStateService extends StoreStateManagerService<CounterState> {\n\n  constructor() {\n    super(\n      StateStorageOptions.adapt({\n        store: 'demoCounterState',\n        model: CounterState.adapt,\n      })\n    )\n  }\n\n  increment() {\n    const current = this.data()\n    this.updateData({ count: (current?.count ?? 0) + 1 })\n  }\n\n  decrement() {\n    const current = this.data()\n    this.updateData({ count: (current?.count ?? 0) - 1 })\n  }\n\n}\n","export interface TodoListStateInterface {\n  items: string[]\n}\n\nexport class TodoListState implements TodoListStateInterface {\n\n  constructor(\n    public items: string[] = ['Buy milk', 'Walk the dog'],\n  ) {}\n\n  static adapt(item?: any): TodoListState {\n    return new TodoListState(\n      item?.items ?? ['Buy milk', 'Walk the dog'],\n    )\n  }\n\n}\n","import { Injectable } from '@angular/core';\n\nimport { StoreStateManagerService, StateStorageOptions } from '../../../services/store-state-manager-service';\nimport { TodoListState } from '../models/todo-list-state.model';\n\n@Injectable()\nexport class TodoListStateService extends StoreStateManagerService<TodoListState> {\n\n  constructor() {\n    super(\n      StateStorageOptions.adapt({\n        store: 'demoTodoListState',\n        model: TodoListState.adapt,\n      })\n    )\n  }\n\n  addItem(item: string) {\n    if (!item?.trim()) return\n    const current = this.data()\n    this.updateData({ items: [...(current?.items ?? []), item.trim()] })\n  }\n\n  clear() {\n    this.updateData({ items: [] })\n  }\n\n}\n","import { Component, inject, OnInit, ChangeDetectionStrategy } from '@angular/core';\nimport { RandomNumber } from 'encryption-helpers';\nimport { SettingsStateService } from './services/settings-state.service';\nimport { CounterStateService } from './services/counter-state.service';\nimport { TodoListStateService } from './services/todo-list-state.service';\n\n@Component({\n    selector: 'app-store-state-manager-demo',\n    templateUrl: './store-state-manager-demo.component.html',\n    styleUrls: ['./store-state-manager-demo.component.scss'],\n    providers: [SettingsStateService, CounterStateService, TodoListStateService],\n    changeDetection: ChangeDetectionStrategy.Default,\n    standalone: false\n})\nexport class StoreStateManagerDemoComponent implements OnInit {\n\n  settingsStateService = inject(SettingsStateService)\n  dataState$ = this.settingsStateService.data$\n\n  dataEnum$ = this.settingsStateService.getEnum_1()\n\n  // Two more independent states, each its own StoreStateManagerService instance,\n  // showing the same merged class handling multiple unrelated shapes side by side.\n  counterStateService = inject(CounterStateService)\n  counterState$ = this.counterStateService.data$\n\n  todoListStateService = inject(TodoListStateService)\n  todoListState$ = this.todoListStateService.data$\n\n  ngOnInit() {\n    this.onUpdateEnum_1()\n    this.onUpdateEnum_2()\n  }\n\n  onUpdateEnum_1() {\n    const rnd = RandomNumber(1000, 9999)\n    this.settingsStateService.updateEnum_1({enum_1: [{ users: [1,2,3, rnd], random: rnd }]})\n  }\n\n  onUpdateEnum_2() {\n    const rnd = RandomNumber(1000, 9999)\n    this.settingsStateService.updateEnum_2({enum_2: [{ users: [1,2,3, rnd], random: rnd }]})\n  }\n\n  onGetEnum_1() {\n    this.settingsStateService.getEnum_1().subscribe(data => console.log('DUMP:', data))\n  }\n\n  onIncrement() {\n    this.counterStateService.increment()\n  }\n\n  onDecrement() {\n    this.counterStateService.decrement()\n  }\n\n  onResetCounter() {\n    this.counterStateService.resetState()\n  }\n\n  onAddTodoItem(item: string) {\n    this.todoListStateService.addItem(item)\n  }\n\n  onClearTodoList() {\n    this.todoListStateService.clear()\n  }\n\n}\n","<div class=\"demo-container\">\n\n  <h2>\n    <span>Store State Manager</span>\n    <span class=\"demo-heading-icon\">\n      <mat-icon color=\"accent\">fiber_new</mat-icon>\n    </span>\n  </h2>\n\n  {{ dataState$ | async | json}}\n\n  <div class=\"demo-actions\">\n    <button mat-stroked-button (click)=\"onUpdateEnum_1()\">Update Start</button>\n    <button mat-stroked-button (click)=\"onUpdateEnum_2()\">Update End</button>\n    <button mat-stroked-button (click)=\"onGetEnum_1()\">Dump</button>\n  </div>\n\n  <div>\n    <h3 class=\"demo-section-heading\">Enum 1</h3>\n    {{ dataEnum$ | async | json}}\n  </div>\n\n  <hr class=\"demo-divider\">\n\n  <h2 class=\"demo-section-heading\">Counter State</h2>\n\n  {{ counterState$ | async | json}}\n\n  <div class=\"demo-actions\">\n    <button mat-stroked-button (click)=\"onIncrement()\">Increment</button>\n    <button mat-stroked-button (click)=\"onDecrement()\">Decrement</button>\n    <button mat-stroked-button (click)=\"onResetCounter()\">Reset</button>\n  </div>\n\n  <hr class=\"demo-divider\">\n\n  <h2 class=\"demo-section-heading\">Todo List State</h2>\n\n  {{ todoListState$ | async | json}}\n\n  <div class=\"demo-actions\">\n    <input #todoInput placeholder=\"New item\" class=\"demo-input\">\n    <button mat-stroked-button (click)=\"onAddTodoItem(todoInput.value); todoInput.value = ''\">Add Item</button>\n    <button mat-stroked-button (click)=\"onClearTodoList()\">Clear</button>\n  </div>\n\n</div>\n","import { Component, OnInit, inject, OnDestroy, ChangeDetectionStrategy } from '@angular/core';\nimport { Subject, Observable, ReplaySubject } from 'rxjs';\nimport { tap } from 'rxjs/operators';\nimport { DataSource } from '@angular/cdk/collections';\n\nimport { TableSchemaDef } from '../../services/database-manager-service/models/table-schema';\nimport { DatabaseManagerService } from '../../services/database-manager-service';\nimport { DexieSqlService } from '../../services/SQL-DixieJS service/dexie-sql.service';\n\nexport interface TableRecord {\n  id: number;\n  last_name: string;\n  age: number;\n  amount: number;\n}\n\n@Component({\n    selector: 'app-database-data-demo',\n    templateUrl: './database-data-demo.component.html',\n    styleUrls: ['./database-data-demo.component.scss'],\n    changeDetection: ChangeDetectionStrategy.Default,\n    standalone: false\n})\nexport class DatabaseDataDemoComponent implements OnInit, OnDestroy {\n\n  db  = inject(DatabaseManagerService);\n  sql = inject(DexieSqlService);\n  private destroy$ = new Subject<void>();\n\n  dataToDisplay: TableRecord[] = [];\n  dataSource = new DatabaseDataSource(this.dataToDisplay);\n  displayedColumns: string[] = ['id', 'last_name', 'age', 'amount'];\n\n  names = ['Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller', 'Davis'];\n\n  // ── SQL Query section ────────────────────────────────────────────────────\n  sqlQuery        = 'SELECT * FROM sample_table';\n  sqlResults:     any[]    = [];\n  sqlResultCols:  string[] = [];\n  sqlError:       string | null = null;\n  sqlLoading      = false;\n\n  constructor() { }\n\n  ngOnDestroy() {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  addData() {\n\n    const newRecord: TableRecord = {\n      id: Math.max(...this.dataToDisplay.map(r => r.id), 0) + 1,\n      last_name: this.names[Math.floor(Math.random() * this.names.length)],\n      age: Math.floor(Math.random() * 80) + 18,\n      amount: Math.floor(Math.random() * 1000)\n    };\n\n    this.dataToDisplay = [...this.dataToDisplay, newRecord];\n    this.db.createTableRecord('sample_table', newRecord).subscribe(\n      () => this.refreshData()\n    );\n\n  }\n\n  removeData() {\n    if (this.dataToDisplay.length > 0) {\n      const removedRecord = this.dataToDisplay[this.dataToDisplay.length - 1];\n      this.dataToDisplay = this.dataToDisplay.slice(0, -1);\n      this.db.deleteTableRecord('sample_table', removedRecord.id).subscribe(\n        () => this.refreshData()\n      );\n    }\n  }\n\n  updateData() {\n\n    if (this.dataToDisplay.length === 0) return;\n\n    const randomIndex = Math.floor(Math.random() * this.dataToDisplay.length);\n    const recordToUpdate = this.dataToDisplay[randomIndex];\n\n    const updatedRecord: TableRecord = {\n      ...recordToUpdate,\n      last_name: this.names[Math.floor(Math.random() * this.names.length)],\n      age: Math.floor(Math.random() * 80) + 18,\n      amount: Math.floor(Math.random() * 1000)\n    };\n\n    this.dataToDisplay = this.dataToDisplay.map((r, index) =>\n      index === randomIndex ? updatedRecord : r\n    );\n\n    this.db.updateTableRecord('sample_table', updatedRecord).subscribe(\n      () => this.refreshData()\n    );\n\n  }\n\n  clearAllData() {\n    if (this.dataToDisplay.length === 0) return;\n\n    const idsToDelete = this.dataToDisplay.map(r => r.id);\n    this.dataToDisplay = [];\n\n    this.db.deleteTableRecords('sample_table', idsToDelete).subscribe(\n      () => this.refreshData()\n    );\n  }\n\n  private refreshData() {\n    this.db.getTableRecords('sample_table').subscribe(\n      (records: any) => {\n        this.dataToDisplay = records || [];\n        this.dataSource.setData(this.dataToDisplay);\n      }\n    );\n  }\n\n  ngOnInit() {\n\n    const tableDef = TableSchemaDef.adapt({\n      table: 'sample_table',\n      schema: '++id, last_name, age, amount'\n    });\n\n    this.db.createDatabaseTable(tableDef).subscribe(() => {\n      console.log('Database Table Initialized');\n\n      // hasTable\n      this.db.hasDatabaseTable('sample_table')\n        .subscribe(data => console.log('hasDatabaseTable:', data))\n\n      // Tables\n      this.db.getDatabaseTables()\n        .subscribe(data => console.log('getDatabaseTables:', data))\n\n      // getTable\n      this.db.getDatabaseTable('sample_table')\n        .subscribe(data => console.log('getDatabaseTable:', data))\n\n      // Table Schema\n      this.db.getDatabaseTableSchema('sample_table')\n        .subscribe(data => console.log('getDatabaseTableSchema:', data))\n\n      // Insert Table Records\n      const records = [\n        { id: 1, age: 12, last_name: 'Bonifacio', amount: 80 },\n        { id: 2, age: 15, last_name: 'Johns', amount: 700 },\n        { id: 3, age: 22, last_name: 'Kims', amount: 234 },\n        { id: 4, age: 45, last_name: 'Harrys', amount: 1200 },\n      ]\n\n      this.db.createTableRecords('sample_table', records).subscribe(() => {\n        this.refreshData();\n      });\n    });\n  }\n\n  createTable(tableDef: TableSchemaDef) {\n    return this.db.createDatabaseTable(tableDef)\n  }\n\n  // CRUD\n  findTableRecords(table: string, column: string, value: any) {\n    return this.db.findTableRecords(table, column, value)\n    .pipe(\n      tap((data: any) => console.log('findTableRecords:', data))\n    )\n  }\n\n  findTableRecord(table: string, column: string, value: any) {\n    return this.db.findTableRecord(table, column, value)\n    .pipe(\n      tap((data: any) => console.log('findTableRecord:', data))\n    )\n  }\n\n  getTableRecords(table: string) {\n    return this.db.getTableRecords(table)\n    .pipe(\n      tap((data: any) => console.log('getTableRecords:', data))\n    )\n  }\n\n  getTableRecord(table: string, id: number) {\n    return this.db.getTableRecord(table, id)\n    .pipe(\n      tap((data: any) => console.log('getTableRecord:', data))\n    )\n  }\n\n  createTableRecord<T>(table: string, record: T) {\n    return this.db.createTableRecord(table, record)\n    .pipe(\n      tap((data: any) => console.log('createTableRecord:', data))\n    )\n  }\n\n  updateTableRecord<T>(table: string, record: T) {\n    return this.db.updateTableRecord(table, record)\n    .pipe(\n      tap((data: any) => console.log('updateTableRecord:', data))\n    )\n  }\n\n  deleteTableRecord<T>(table: string, id: number) {\n    return this.db.deleteTableRecord(table, id)\n    .pipe(\n      tap((data: any) => console.log('deleteTableRecord:', data))\n    )\n  }\n\n  runSqlQuery() {\n    const q = (this.sqlQuery ?? '').trim();\n    if (!q) return;\n\n    this.sqlLoading = true;\n    this.sqlError   = null;\n    this.sqlResults = [];\n    this.sqlResultCols = [];\n\n    this.sql.query(q).subscribe({\n      next: rows => {\n        this.sqlResults    = rows;\n        this.sqlResultCols = rows.length > 0 ? Object.keys(rows[0]) : [];\n        this.sqlLoading    = false;\n      },\n      error: err => {\n        this.sqlError   = err?.message ?? String(err);\n        this.sqlLoading = false;\n      }\n    });\n  }\n\n}\n\nclass DatabaseDataSource extends DataSource<TableRecord> {\n  private _dataStream = new ReplaySubject<TableRecord[]>();\n\n  constructor(initialData: TableRecord[]) {\n    super();\n    this.setData(initialData);\n  }\n\n  connect(): Observable<TableRecord[]> {\n    return this._dataStream;\n  }\n\n  disconnect() {}\n\n  setData(data: TableRecord[]) {\n    this._dataStream.next(data);\n  }\n\n}\n","<div style=\"padding: 2rem;\">\n\n  <h2>\n    Database Manager Service Demo\n  </h2>\n\n  <div style=\"margin-bottom: 1rem; display: flex; gap: 1rem;\">\n    <button mat-stroked-button\n      color=\"primary\"\n      (click)=\"clearAllData()\"\n      >\n      Clear Data\n    </button>\n    <button mat-stroked-button\n      color=\"primary\"\n      (click)=\"updateData()\"\n      >\n      Update Data\n    </button>\n    <div style=\"flex:1\"></div>\n    <button\n      mat-stroked-button\n      color=\"warn\"\n      [disabled]=\"!dataToDisplay.length\"\n      (click)=\"removeData()\"\n      >\n      Remove Data\n    </button>\n    <button mat-stroked-button\n      color=\"primary\"\n      (click)=\"addData()\"\n      >\n      Add Data\n    </button>\n  </div>\n\n  <div class=\"table-container\">\n    <table mat-table [dataSource]=\"dataSource\">\n\n      <ng-container matColumnDef=\"id\">\n        <th mat-header-cell *matHeaderCellDef>ID</th>\n        <td mat-cell *matCellDef=\"let element\">{{element.id}}</td>\n      </ng-container>\n\n      <ng-container matColumnDef=\"last_name\">\n        <th mat-header-cell *matHeaderCellDef>Last Name</th>\n        <td mat-cell *matCellDef=\"let element\">{{element.last_name}}</td>\n      </ng-container>\n\n      <ng-container matColumnDef=\"age\">\n        <th mat-header-cell *matHeaderCellDef>Age</th>\n        <td mat-cell *matCellDef=\"let element\">{{element.age}}</td>\n      </ng-container>\n\n      <ng-container matColumnDef=\"amount\">\n        <th mat-header-cell *matHeaderCellDef>Amount</th>\n        <td mat-cell *matCellDef=\"let element\">{{element.amount | currency}}</td>\n      </ng-container>\n\n      <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n      <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n    </table>\n  </div>\n\n  <!-- ── SQL Query Section ─────────────────────────────────────────────── -->\n  <mat-divider style=\"margin: 2rem 0;\"></mat-divider>\n\n  <h3 style=\"margin-bottom: 1rem;\">SQL Query with DexieJS</h3>\n\n  <div style=\"display: flex; gap: 1rem; align-items: flex-start;\">\n    <mat-form-field style=\"flex: 1;\" appearance=\"outline\">\n      <mat-label>SQL Query</mat-label>\n      <textarea\n        matInput\n        [(ngModel)]=\"sqlQuery\"\n        rows=\"3\"\n        placeholder=\"e.g. SELECT * FROM sample_table WHERE age > 20\"\n        (keydown.control.enter)=\"runSqlQuery()\"\n      ></textarea>\n    </mat-form-field>\n  </div>\n\n  <div style=\"display: flex;\">\n    <div style=\"flex:1\"></div>\n    <button\n      mat-flat-button\n      color=\"primary\"\n      style=\"margin-top: 4px;\"\n      [disabled]=\"sqlLoading || !sqlQuery.trim()\"\n      (click)=\"runSqlQuery()\"\n      >\n      {{ sqlLoading ? 'Running…' : 'Execute' }}\n    </button>\n  </div>\n\n  <div style=\"margin-top: 1rem;\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <!-- Error -->\n  @if (sqlError) {\n    <div style=\"color: #d32f2f; margin: 0.5rem 0 1rem; font-size: 0.875rem;\">\n      <mat-icon style=\"vertical-align: middle; font-size: 16px; height: 16px; width: 16px;\">error</mat-icon>\n      {{ sqlError }}\n    </div>\n  }\n\n  <!-- Results table (dynamic columns) -->\n  @if (!sqlLoading && sqlResults.length > 0) {\n    <div class=\"table-container\" style=\"margin-top: 1rem;\">\n      <div>\n        {{ sqlResults | json }}\n      </div>\n      <p style=\"font-size: 0.8rem; color: #666; margin-top: 0.5rem;\">\n        {{ sqlResults.length }} row{{ sqlResults.length === 1 ? '' : 's' }} returned\n      </p>\n    </div>\n  }\n\n  <!-- Empty state -->\n  @if (!sqlLoading && !sqlError && sqlResults.length === 0 && sqlQuery.trim()) {\n    <p\n      style=\"color: #888; font-size: 0.875rem; margin-top: 0.5rem;\">\n      No results to display. Execute a query above.\n    </p>\n  }\n\n</div>\n","import { Signal, WritableSignal, signal } from '@angular/core'\nimport { Observable, Subject } from 'rxjs'\n\nexport interface UploadStateInterface {\n  selectedFiles: File[]\n  isUploading: boolean\n  progress: number\n  currentFile: string | null\n  errorMessage: string | null\n  successMessage: string | null\n}\n\nexport class UploadStateModel {\n\n  // Pinged synchronously by every mutator. The $-observables below read off this\n  // instead of toObservable() (an effect() under the hood), because effects coalesce\n  // rapid synchronous writes into one async flush — multiple progress updates within\n  // the same event-loop turn would only ever deliver the last one to a subscriber.\n  // This ping fires once per mutation, so each subscribe emits the current value\n  // immediately, then one more emission per subsequent mutation, in order, none skipped.\n  private readonly stateChanged$ = new Subject<void>()\n\n  private readonly _selectedFiles: WritableSignal<File[]>\n  private readonly _isUploading: WritableSignal<boolean>\n  private readonly _progress: WritableSignal<number>\n  private readonly _currentFile: WritableSignal<string | null>\n  private readonly _errorMessage: WritableSignal<string | null>\n  private readonly _successMessage: WritableSignal<string | null>\n\n  readonly selectedFiles: Signal<File[]>\n  readonly isUploading: Signal<boolean>\n  readonly progress: Signal<number>\n  readonly currentFile: Signal<string | null>\n  readonly errorMessage: Signal<string | null>\n  readonly successMessage: Signal<string | null>\n\n  readonly selectedFiles$: Observable<File[]>\n  readonly isUploading$: Observable<boolean>\n  readonly progress$: Observable<number>\n  readonly currentFile$: Observable<string | null>\n  readonly errorMessage$: Observable<string | null>\n  readonly successMessage$: Observable<string | null>\n\n  constructor(\n    selectedFiles: File[] = [],\n    isUploading: boolean = false,\n    progress: number = 0,\n    currentFile: string | null = null,\n    errorMessage: string | null = null,\n    successMessage: string | null = null\n  ) {\n    this._selectedFiles = signal(selectedFiles)\n    this._isUploading = signal(isUploading)\n    this._progress = signal(progress)\n    this._currentFile = signal(currentFile)\n    this._errorMessage = signal(errorMessage)\n    this._successMessage = signal(successMessage)\n\n    this.selectedFiles = this._selectedFiles.asReadonly()\n    this.isUploading = this._isUploading.asReadonly()\n    this.progress = this._progress.asReadonly()\n    this.currentFile = this._currentFile.asReadonly()\n    this.errorMessage = this._errorMessage.asReadonly()\n    this.successMessage = this._successMessage.asReadonly()\n\n    this.selectedFiles$ = this.toSyncObservable(this.selectedFiles)\n    this.isUploading$ = this.toSyncObservable(this.isUploading)\n    this.progress$ = this.toSyncObservable(this.progress)\n    this.currentFile$ = this.toSyncObservable(this.currentFile)\n    this.errorMessage$ = this.toSyncObservable(this.errorMessage)\n    this.successMessage$ = this.toSyncObservable(this.successMessage)\n  }\n\n  static adapt(item?: any): UploadStateModel {\n    return new UploadStateModel(\n      Array.isArray(item?.selectedFiles) ? item.selectedFiles : [],\n      item?.isUploading ?? false,\n      item?.progress ?? 0,\n      item?.currentFile ?? null,\n      item?.errorMessage ?? null,\n      item?.successMessage ?? null\n    )\n  }\n\n  private toSyncObservable<T>(sig: Signal<T>): Observable<T> {\n    return new Observable<T>(subscriber => {\n      let last = sig()\n      subscriber.next(last)\n\n      const sub = this.stateChanged$.subscribe(() => {\n        const value = sig()\n        if (!Object.is(value, last)) {\n          last = value\n          subscriber.next(value)\n        }\n      })\n\n      return () => sub.unsubscribe()\n    })\n  }\n\n  // --- MUTATORS ---\n  // The only way to write this state — every mutation pings stateChanged$ here,\n  // in one place, instead of every call site remembering to do it.\n\n  setSelectedFiles(files: File[]): void {\n    this._selectedFiles.set(files)\n    this.stateChanged$.next()\n  }\n\n  setUploading(isUploading: boolean): void {\n    this._isUploading.set(isUploading)\n    this.stateChanged$.next()\n  }\n\n  setProgress(progress: number): void {\n    this._progress.set(progress)\n    this.stateChanged$.next()\n  }\n\n  setCurrentFile(currentFile: string | null): void {\n    this._currentFile.set(currentFile)\n    this.stateChanged$.next()\n  }\n\n  setError(errorMessage: string | null): void {\n    this._errorMessage.set(errorMessage)\n    this.stateChanged$.next()\n  }\n\n  setSuccess(successMessage: string | null): void {\n    this._successMessage.set(successMessage)\n    this.stateChanged$.next()\n  }\n\n  clear(): void {\n    this._selectedFiles.set([])\n    this._errorMessage.set(null)\n    this._successMessage.set(null)\n    this._progress.set(0)\n    this._currentFile.set(null)\n    this.stateChanged$.next()\n  }\n}\n","import { Component, OnInit, OnDestroy, inject, ChangeDetectionStrategy } from '@angular/core'\nimport { MatSelectionListChange } from '@angular/material/list'\nimport { ApiRequest, HTTPManagerService } from '../../'\nimport { UploadStateModel } from './models/upload-state.model'\nimport { FileTypeOptionInterface } from './models/file-type-option.model'\n\n@Component({\n  selector: 'lib-upload-demo',\n  templateUrl: './upload-demo.component.html',\n  styleUrls: ['./upload-demo.component.scss'],\n  changeDetection: ChangeDetectionStrategy.Default,\n  standalone: false\n})\nexport class UploadDemoComponent implements OnInit, OnDestroy {\n\n  private httpManager = inject(HTTPManagerService)\n\n  uploadState = UploadStateModel.adapt()\n\n  fileTypeOptions: FileTypeOptionInterface[] = [\n    { id: 'image/jpeg', value: 'JPG' },\n    { id: 'image/png', value: 'PNG' },\n    { id: 'image/gif', value: 'GIF' },\n    { id: 'application/pdf', value: 'PDF' },\n    { id: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', value: 'EXCEL' },\n    { id: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', value: 'WORD' }\n  ]\n\n  acceptedTypeIds: string[] = ['image/jpeg', 'image/png']\n  maxFileSize = 40 * 1024 * 1024 // 40MB\n\n  uploadMode: 'single' | 'multiple' = 'multiple'\n\n  ngOnInit(): void {\n    // Initialize component\n  }\n\n  ngOnDestroy(): void {\n    // Clean up subscriptions\n  }\n\n  onUploadModeChange(mode: 'single' | 'multiple'): void {\n    this.uploadMode = mode\n    this.clearSelection()\n  }\n\n  onFileSelected(event: Event): void {\n    const input = event.target as HTMLInputElement\n    const files = input.files\n\n    if (!files || files.length === 0) {\n      return\n    }\n\n    const validFiles: File[] = []\n    let errorMessage: string | null = null\n\n    for (let i = 0; i < files.length; i++) {\n      const file = files[i]\n      const validationError = this.validateFile(file)\n\n      if (validationError) {\n        errorMessage = validationError\n        continue\n      }\n\n      validFiles.push(file)\n    }\n\n    if (validFiles.length === 0 && !errorMessage) {\n      errorMessage = `Please select at least one valid file (${this.getAcceptedTypeLabels()})`\n    }\n\n    this.uploadState.setSelectedFiles(validFiles)\n    this.uploadState.setError(errorMessage)\n\n    input.value = ''\n\n    if (this.uploadMode === 'single') {\n      this.startUpload()\n    }\n  }\n\n  onFileTypesChanged(event: MatSelectionListChange): void {\n    this.acceptedTypeIds = event.source.selectedOptions.selected.map(option => option.value)\n    this.clearSelection()\n  }\n\n  validateFile(file: File): string | null {\n    // Check file type\n    if (!this.acceptedTypeIds.includes(file.type)) {\n      return `File \"${file.name}\" is not a valid type. Only ${this.getAcceptedTypeLabels()} files are allowed.`\n    }\n\n    // Check file size\n    if (file.size > this.maxFileSize) {\n      return `File \"${file.name}\" exceeds maximum size of 10MB.`\n    }\n\n    return null\n  }\n\n  getAcceptedTypeLabels(): string {\n    return this.fileTypeOptions\n      .filter(option => this.acceptedTypeIds.includes(option.id))\n      .map(option => option.value)\n      .join(', ')\n  }\n\n  clearSelection(): void {\n    this.uploadState.clear()\n  }\n\n  startUpload(): void {\n    if (this.uploadState.selectedFiles().length === 0) {\n      if (!this.uploadState.errorMessage()) {\n        this.uploadState.setError('Please select at least one file to upload')\n      }\n      return\n    }\n\n    if (this.uploadState.errorMessage()) {\n      return\n    }\n\n    this.uploadState.setUploading(true)\n    this.uploadState.setProgress(0)\n    this.uploadState.setError(null)\n    this.uploadState.setSuccess(null)\n\n    const isSingleMode = this.uploadMode === 'single'\n    const selectedFiles = this.uploadState.selectedFiles()\n\n    const options = ApiRequest.adapt({\n      server: 'gtlcApi',\n      path: ['uploader'],\n      uploadFieldName: isSingleMode ? 'file' : 'files',\n      allowedTypes: this.acceptedTypeIds,\n      maxFileSize: this.maxFileSize,\n      displayError: true,\n      displaySuccess: true,\n      successMessage: `Successfully uploaded ${selectedFiles.length} file(s)`\n    })\n\n    const uploadFiles = isSingleMode ? selectedFiles[0] : selectedFiles\n\n    this.httpManager.uploadRequest<any>(uploadFiles, options, ['upload'])\n    .subscribe({\n      next: (response) => {\n        this.uploadState.setProgress(100)\n        this.uploadState.setSuccess(`Successfully uploaded ${selectedFiles.length} file(s)`)\n        this.uploadState.setUploading(false)\n      },\n      error: (error: any) => {\n        this.uploadState.setSelectedFiles([])\n        this.uploadState.setError(error.message || 'Upload failed. Please try again.')\n        this.uploadState.setUploading(false)\n        this.uploadState.setProgress(0)\n      }\n    })\n  }\n\n  getFileSizeString(size: number): string {\n    if (size < 1024) {\n      return `${size} bytes`\n    } else if (size < 1024 * 1024) {\n      return `${(size / 1024).toFixed(1)} KB`\n    } else {\n      return `${(size / (1024 * 1024)).toFixed(1)} MB`\n    }\n  }\n}\n","<div class=\"upload-demo-container\">\n  <h2>File Upload Demo</h2>\n  <p class=\"demo-description\">Upload multiple files with progress tracking</p>\n\n  <!-- Accepted File Types -->\n  <div class=\"file-type-selection\">\n    <h3>Accepted File Types</h3>\n    <mat-selection-list (selectionChange)=\"onFileTypesChanged($event)\" [disabled]=\"uploadState.isUploading()\">\n      @for (option of fileTypeOptions; track option.id) {\n        <mat-list-option [value]=\"option.id\" [selected]=\"acceptedTypeIds.includes(option.id)\">\n          {{option.value}}\n        </mat-list-option>\n      }\n    </mat-selection-list>\n  </div>\n\n  <!-- Upload Mode -->\n  <div class=\"upload-mode-toggle\">\n    <mat-button-toggle-group\n      name=\"uploadMode\"\n      [value]=\"uploadMode\"\n      (change)=\"onUploadModeChange($event.value)\">\n      <mat-button-toggle value=\"single\">Single</mat-button-toggle>\n      <mat-button-toggle value=\"multiple\">Multiple</mat-button-toggle>\n    </mat-button-toggle-group>\n  </div>\n\n  <!-- Upload Button & File Input -->\n  <div class=\"upload-controls\">\n    <button\n      mat-raised-button\n      color=\"primary\"\n      (click)=\"fileInput.click()\"\n      [disabled]=\"uploadState.isUploading() || acceptedTypeIds.length === 0\"\n      class=\"upload-button\">\n      <span class=\"material-icons\">upload_file</span>\n      Select Files\n    </button>\n    <input\n      #fileInput\n      type=\"file\"\n      [multiple]=\"uploadMode === 'multiple'\"\n      [attr.accept]=\"acceptedTypeIds.join(',')\"\n      (change)=\"onFileSelected($event)\"\n      [disabled]=\"uploadState.isUploading()\"\n      hidden>\n\n    <button\n      mat-button\n      color=\"warn\"\n      (click)=\"clearSelection()\"\n      [disabled]=\"uploadState.selectedFiles().length === 0 || uploadState.isUploading()\"\n      class=\"clear-button\">\n      Clear\n    </button>\n  </div>\n\n  <!-- Selected Files Display -->\n  @if (uploadMode === 'multiple' && uploadState.selectedFiles().length > 0) {\n    <div class=\"selected-files\">\n      <h3>Selected Files ({{uploadState.selectedFiles().length}})</h3>\n      <ul class=\"file-list\">\n        @for (file of uploadState.selectedFiles(); track file) {\n          <li class=\"file-item\">\n            <span class=\"file-icon\">\n              <span class=\"material-icons\">insert_drive_file</span>\n            </span>\n            <span class=\"file-name\">{{file.name}}</span>\n            <span class=\"file-size\">{{getFileSizeString(file.size)}}</span>\n            <span class=\"file-status valid\">✓</span>\n          </li>\n        }\n      </ul>\n    </div>\n  }\n\n  <!-- Validation Errors -->\n  @if (uploadState.errorMessage() && !uploadState.isUploading()) {\n    <div class=\"error-message\">\n      <span class=\"material-icons\">error</span>\n      <span>{{uploadState.errorMessage()}}</span>\n    </div>\n  }\n\n  <!-- Progress Bar -->\n  @if (uploadState.isUploading()) {\n    <div class=\"progress-container\">\n      <div class=\"progress-header\">\n        <span>Uploading...</span>\n        <span class=\"progress-percentage\">{{uploadState.progress()}}%</span>\n      </div>\n      <mat-progress-bar\n        mode=\"determinate\"\n        [value]=\"uploadState.progress()\"\n        color=\"primary\">\n      </mat-progress-bar>\n      @if (uploadState.currentFile()) {\n        <div class=\"current-file\">\n          Current: {{uploadState.currentFile()}}\n        </div>\n      }\n    </div>\n  }\n\n  <!-- Success Message -->\n  @if (uploadState.successMessage()) {\n    <div class=\"success-message\">\n      <span class=\"material-icons\">check_circle</span>\n      <span>{{uploadState.successMessage()}}</span>\n    </div>\n  }\n\n  <!-- Upload Action Button -->\n  @if (uploadMode === 'multiple' && uploadState.selectedFiles().length > 0 && !uploadState.isUploading()) {\n    <div class=\"upload-actions\">\n      <button\n        mat-raised-button\n        color=\"primary\"\n        (click)=\"startUpload()\"\n        [disabled]=\"uploadState.selectedFiles().length === 0 || uploadState.errorMessage() !== null\"\n        class=\"start-upload-button\">\n        Upload {{uploadState.selectedFiles().length}} File{{uploadState.selectedFiles().length > 1 ? 's' : ''}}\n      </button>\n    </div>\n  }\n</div>\n","export type DownloadQueueStatus = 'pending' | 'downloading' | 'done' | 'error'\n\nexport interface DownloadQueueItemInterface {\n  url: string\n  fileName: string\n  status: DownloadQueueStatus\n}\n\nexport class DownloadQueueItemModel implements DownloadQueueItemInterface {\n  constructor(\n    public url: string = '',\n    public fileName: string = '',\n    public status: DownloadQueueStatus = 'pending'\n  ) {}\n\n  static adapt(item?: any): DownloadQueueItemModel {\n    return new DownloadQueueItemModel(\n      item?.url ?? '',\n      item?.fileName ?? '',\n      item?.status ?? 'pending'\n    )\n  }\n}\n","import { Component, ChangeDetectionStrategy, inject } from '@angular/core'\nimport { HttpClient } from '@angular/common/http'\nimport { catchError, forkJoin, map, of, switchMap, tap } from 'rxjs'\nimport { zipSync } from 'fflate'\nimport { ApiRequest } from '../../'\nimport { DownloadQueueItemModel } from './models'\n\ninterface FetchedFile {\n  fileName: string\n  blob: Blob\n}\n\n@Component({\n    selector: 'lib-download-demo',\n    templateUrl: './download-demo.component.html',\n    styleUrls: ['./download-demo.component.scss'],\n    changeDetection: ChangeDetectionStrategy.Default,\n    standalone: false\n})\nexport class DownloadDemoComponent {\n\n  private http = inject(HttpClient)\n\n  singleDownloadRequest = ApiRequest.adapt({\n    server: 'assets/images',\n    path: ['lego.png'],\n  })\n\n  downloadUrls: string[] = [\n    'assets/images/lego.png',\n    'assets/icons/facebook_icon.png',\n    'assets/icons/google_icon.png',\n  ]\n\n  downloadQueue: DownloadQueueItemModel[] = this.downloadUrls\n    .filter(url => !!url)\n    .map(url => DownloadQueueItemModel.adapt({ url, fileName: url.split('/').pop() }))\n\n  isDownloadingAll = false\n\n  downloadAllAsZip() {\n    if (this.isDownloadingAll) return\n    this.isDownloadingAll = true\n    this.downloadQueue.forEach(item => item.status = 'pending')\n\n    const fetches = this.downloadQueue.map(item => this.fetchQueuedFile(item))\n\n    forkJoin(fetches).pipe(\n      switchMap(files => this.buildZip(files.filter((file): file is FetchedFile => !!file)))\n    ).subscribe({\n      next: zipBlob => {\n        if (zipBlob) this.saveBlob(zipBlob, 'downloads.zip')\n        this.isDownloadingAll = false\n      },\n      error: () => this.isDownloadingAll = false\n    })\n  }\n\n  private fetchQueuedFile(item: DownloadQueueItemModel) {\n    if (!item.fileName || !item.url) {\n      item.status = 'error'\n      return of(null)\n    }\n\n    item.status = 'downloading'\n\n    return this.http.get(item.url, { responseType: 'blob' }).pipe(\n      tap(() => item.status = 'done'),\n      map((blob): FetchedFile => ({ fileName: item.fileName, blob })),\n      catchError(() => {\n        item.status = 'error'\n        return of(null)\n      })\n    )\n  }\n\n  private async buildZip(files: FetchedFile[]): Promise<Blob | null> {\n    if (files.length === 0) return null\n\n    const entries: Record<string, Uint8Array> = {}\n    for (const file of files) {\n      entries[file.fileName] = new Uint8Array(await file.blob.arrayBuffer())\n    }\n\n    return new Blob([zipSync(entries)], { type: 'application/zip' })\n  }\n\n  private saveBlob(blob: Blob, fileName: string) {\n    const link = document.createElement('a')\n    const url = window.URL.createObjectURL(blob)\n    link.href = url\n    link.download = fileName\n    document.body.appendChild(link)\n    link.click()\n    document.body.removeChild(link)\n    window.URL.revokeObjectURL(url)\n  }\n\n}\n","<div class=\"download-demo-container\">\n  <h2>File Download Demo</h2>\n  <p class=\"demo-description\">Download a single file, or several files bundled into one zip archive.</p>\n\n  <div class=\"download-section\">\n    <h3>Single File Download</h3>\n    <ul class=\"file-list\">\n      <li class=\"file-item\">\n        <span class=\"file-icon\">\n          <span class=\"material-icons\">insert_drive_file</span>\n        </span>\n        <span class=\"file-name\">{{ singleDownloadRequest.path![singleDownloadRequest.path!.length - 1] }}</span>\n        <app-file-downloader\n          [apiRequest]=\"singleDownloadRequest\"\n          [displayErrorMessage]=\"true\"\n        ></app-file-downloader>\n      </li>\n    </ul>\n  </div>\n\n  <div class=\"download-section\">\n    <div class=\"section-header\">\n      <h3>Multiple File Downloads</h3>\n      <button\n        mat-raised-button\n        color=\"primary\"\n        (click)=\"downloadAllAsZip()\"\n        [disabled]=\"isDownloadingAll\"\n        class=\"download-all-button\">\n        {{ isDownloadingAll ? 'Zipping…' : 'Download All as ZIP (' + downloadQueue.length + ')' }}\n      </button>\n    </div>\n    <p class=\"download-all-note\">Fetches each file, bundles them into one zip archive, and saves a single download — this avoids browsers' automatic-downloads restrictions entirely, since only one file is ever saved.</p>\n    <ul class=\"file-list\">\n      @for (item of downloadQueue; track item) {\n        <li class=\"file-item\">\n          <span class=\"file-icon\">\n            <span class=\"material-icons\">insert_drive_file</span>\n          </span>\n          <span class=\"file-name\">{{ item.fileName }}</span>\n          <span class=\"file-status\" [class]=\"item.status\">{{ item.status }}</span>\n        </li>\n      }\n    </ul>\n  </div>\n</div>\n","import { Component, Inject, Input, OnInit, ChangeDetectionStrategy } from '@angular/core';\n\nimport { CONFIG_SETTINGS_TOKEN } from '../models/config-token.model';\nimport { ConfigOptions } from '../models/config-options.model';\nimport { UserData } from './request-manager-ws-demo/models/user-data.model';\n\n@Component({\n    selector: 'app-http-request-services-demo',\n    templateUrl: './http-request-services-demo.component.html',\n    styleUrls: ['./http-request-services-demo.component.scss'],\n    changeDetection: ChangeDetectionStrategy.Default,\n    standalone: false\n})\nexport class HttpRequestServicesDemoComponent implements OnInit {\n\n  @Input() wsServer = ''\n  @Input() jwtToken = ''\n  @Input() server = 'http:'\n  @Input() user?: UserData\n  @Input() path: string[] = ['items'];\n\n  // Matches src/environments/environment.ts's `testPosts` value, duplicated here rather than\n  // imported: this file compiles as part of the standalone http-request-manager library build\n  // (ng-packagr), which cannot reach outside its own project root for a source file to\n  // type-check and emit declarations against — doing so crashes the Angular compiler (same\n  // constraint documented on request-manager-basic-demo.component.ts).\n  // request-manager-demo needs its own jsonplaceholder-backed target (posts/{id}-style testing)\n  // independent of the shared `server` input above, which now points at httpbin.org's\n  // verb-echo endpoints for the other sub-demos.\n  requestManagerDemoServer = 'postsRest'\n\n  @Input() adapter?: Function\n  @Input() mapper?: Function\n\n  requestTypes = [\n    { name: \"Http Service\", value: 'http_service' },\n    // { name: \"Http Signals Service\", value: 'http_signals_service', new: true },\n    { name: \"Http State Service\", value: 'http_state_service' },\n    { name: \"Http State Service - Websockets\", value: 'http_state_service_ws', new: false },\n    { name: \"File Upload Demo\", value: 'file_upload_demo', new: true, divider: true },\n    { name: \"File Download Demo\", value: 'file_download_demo', new: true },\n    { name: \"Database Service\", value: 'database_service', divider: true, disabled: false },\n    { name: \"Local Storage Service\", value: 'local_storage_service' },\n    // { name: \"Local Signals Storage Service\", value: 'local_storage_signals_service', new: true },\n    { name: \"Store State Manager Service\", value: 'store_state_manager', new: true },\n    { name: \"Basic Http Service\", value: 'basic_http_service', divider: true },\n  ]\n\n  selectedService = this.requestTypes[1].value //menu selection default\n\n  injectionOptions?: ConfigOptions\n\n  constructor(\n    @Inject(CONFIG_SETTINGS_TOKEN) private configOptions?: ConfigOptions\n  ) { }\n\n  ngOnInit() {\n    if(this.configOptions) this.injectionOptions = this.configOptions\n  }\n\n  onSelected(type: number) {\n    this.selectedService = this.requestTypes[type].value\n  }\n\n}\n","<mat-toolbar  style=\"display:flex\">\n  <div>Http Request Manager Services</div>\n  <div style=\"flex:1\"></div>\n  <button mat-stroked-button [matMenuTriggerFor]=\"menu\">Services</button>\n  <mat-menu #menu=\"matMenu\">\n    @for (type of requestTypes; track type; let i = $index) {\n      @if (type?.divider) {\n        <div\n          style=\"margin-top: .5rem; margin-bottom: .5rem;\"\n          >\n          <mat-divider></mat-divider>\n        </div>\n      }\n      <button\n        mat-menu-item\n        (click)=\"onSelected(i)\"\n        [disabled]=\"type.disabled\"\n        >\n        {{ type.name }}\n      </button>\n    }\n\n  </mat-menu>\n</mat-toolbar>\n\n<span>\n  @switch (selectedService) {\n    @case ('basic_http_service') {\n      <p>\n        <app-request-manager-basic-demo></app-request-manager-basic-demo>\n      </p>\n    }\n    @case ('http_service') {\n      <p>\n        <ng-container *ngTemplateOutlet=\"HTTP_OPTIONS\"></ng-container>\n        <app-request-manager-demo\n          [server]=\"requestManagerDemoServer\"\n          [adapter]=\"adapter\"\n          [mapper]=\"mapper\"\n        ></app-request-manager-demo>\n      </p>\n    }\n    <!-- <p *ngSwitchCase=\"'http_signals_service'\">\n    <ng-container *ngTemplateOutlet=\"HTTP_OPTIONS\"></ng-container>\n    <app-request-signals-manager-demo></app-request-signals-manager-demo>\n  </p> -->\n  @case ('http_state_service') {\n    <p>\n      <ng-container *ngTemplateOutlet=\"HTTP_OPTIONS\"></ng-container>\n      <app-request-manager-state-demo\n        [server]=\"server\"\n        [adapter]=\"adapter\"\n        [mapper]=\"mapper\"\n      ></app-request-manager-state-demo>\n    </p>\n  }\n  @case ('http_state_service_ws') {\n    <p>\n      <ng-container *ngTemplateOutlet=\"HTTP_OPTIONS\"></ng-container>\n      <app-request-manager-ws-demo\n        [server]=\"server\"\n        [wsServer]=\"wsServer\"\n        [jwtToken]=\"jwtToken\"\n        [user]=\"user\"\n        [path]=\"path\"\n      ></app-request-manager-ws-demo>\n    </p>\n  }\n  @case ('file_upload_demo') {\n    <p>\n      <lib-upload-demo></lib-upload-demo>\n    </p>\n  }\n  @case ('file_download_demo') {\n    <p>\n      <lib-download-demo></lib-download-demo>\n    </p>\n  }\n  @case ('database_service') {\n    <p>\n      <app-database-data-demo></app-database-data-demo>\n    </p>\n  }\n  @case ('local_storage_service') {\n    <p>\n      <ng-container *ngTemplateOutlet=\"LOCAL_OPTIONS\"></ng-container>\n      <app-local-storage-demo></app-local-storage-demo>\n    </p>\n  }\n@case ('store_state_manager') {\n  <p>\n    <ng-container *ngTemplateOutlet=\"LOCAL_OPTIONS\"></ng-container>\n    <app-store-state-manager-demo></app-store-state-manager-demo>\n  </p>\n}\n@default {\n  <p>\n    Other\n  </p>\n}\n}\n</span>\n\n<ng-template #HTTP_OPTIONS>\n  @if (injectionOptions?.httpRequestOptions) {\n    <div class=\"box\">\n      <h3 style=\"font-weight: bold;\">Injection Token Detected - HTTP Options</h3>\n      {{ injectionOptions?.httpRequestOptions | json }}\n    </div>\n  }\n</ng-template>\n\n<ng-template #LOCAL_OPTIONS>\n  @if (injectionOptions?.LocalStorageOptions) {\n    <ng-container class=\"box\">\n      <div class=\"box\">\n        <h3 style=\"font-weight: bold;\">Injection Token Detected - LocalStorage Options</h3>\n        {{ injectionOptions?.LocalStorageOptions | json }}\n      </div>\n    </ng-container>\n  }\n</ng-template>\n\n\n","export interface ClientInfoInterface {\n  domain: string\n  service: string\n  id: number\n  name: string\n}\n\nexport class ClientInfo implements ClientInfoInterface {\n\n  constructor(\n    public domain = '',\n    public service = '',\n    public id = 0,\n    public name = '',\n  ) {}\n\n  static adapt(item?: any): ClientInfo {\n\n    return new ClientInfo(\n      item?.domain,\n      item?.service,\n      item?.id,\n      (item?.first_name || item?.last_name) ? `${item?.first_name} ${item?.last_name}` : '',\n    )\n\n  }\n\n}\n\n\n","export interface ClientInfoMapperInterface {\n  id: number\n  first_name: string\n  last_name: string\n  email: string\n}\n\nexport class ClientInfoMapper implements ClientInfoMapperInterface {\n\n  constructor(\n    public id = 0,\n    public first_name = '',\n    public last_name = '',\n    public email = '',\n  ) {}\n\n  static adapt(item?: any): ClientInfoMapper {\n\n    const first_name = (item?.name) ? item.name.split(' ')[0] : ''\n    const last_name = (item?.name) ? item.name.split(' ')[1] : ''\n\n    return new ClientInfoMapper(\n      item?.id,\n      first_name,\n      last_name,\n      item?.email,\n    )\n\n  }\n\n}\n\n\n","export interface AIPromptInterface {\n  response: string\n}\n\nexport class AIPrompt implements AIPromptInterface {\n\n  constructor(\n    public response = '',\n  ) {}\n\n  static adapt(item?: any): AIPrompt {\n\n    return new AIPrompt(\n      item?.response,\n    )\n\n  }\n\n}\n","import { Component, OnInit, ViewChild, inject, ChangeDetectionStrategy } from '@angular/core'\n\nimport { FormArray, FormBuilder, Validators } from '@angular/forms'\n\nimport { ClientInfo } from './models/sample-client-info'\nimport { ClientInfoMapper } from './models/sample-mapper-client-info'\nimport { AIPrompt } from './models/sample-ai-prompt'\nimport { ApiRequest, HTTPManagerService } from '../..'\n\nimport { ToastColors, ToastDisplay, ToastMessageDisplayService } from 'toast-message-display'\n\n@Component({\n    selector: 'app-request-signals-manager-demo',\n    templateUrl: './request-signals-manager-demo.component.html',\n    styleUrls: ['./request-signals-manager-demo.component.scss'],\n    changeDetection: ChangeDetectionStrategy.Default,\n    standalone: false\n})\nexport class RequestSignalsManagerDemoComponent implements OnInit {\n\n  displayedColumns = ['id','name', 'lastName', 'age']\n\n  private fb = inject(FormBuilder)\n  private toastMessage = inject(ToastMessageDisplayService)\n\n  httpManagerService = inject(HTTPManagerService)\n\n  // Using signals service: signals are callable in templates (e.g. isPending())\n  isPending = this.httpManagerService.isPending\n  countdown = this.httpManagerService.countdown\n\n  // per-operation plain results and error messages (no rxjs in component)\n  GET_result: any = null\n  POST_result: any = null\n  PUT_result: any = null\n  PATCH_result: any = null\n  DELETE_result: any = null\n\n  STREAM_result: any = null\n  STREAM_AI_result: any = null\n\n  GET_error: string = ''\n  POST_error: string = ''\n  PUT_error: string = ''\n  PATCH_error: string = ''\n  DELETE_error: string = ''\n  STREAM_error: string = ''\n  STREAM_AI_error: string = ''\n\n  requestParams = {\n    GET: ApiRequest.adapt(),\n    POST: ApiRequest.adapt(),\n    PUT: ApiRequest.adapt(),\n    PATCH: ApiRequest.adapt(),\n    DELETE: ApiRequest.adapt(),\n    STREAM: ApiRequest.adapt(),\n  }\n\n  @ViewChild(\"failedState\", { static: true }) failedState: any\n  @ViewChild(\"pollingState\", { static: true }) pollingState: any\n\n  questionControl = this.fb.control(\"\", [Validators.required])\n\n  downloadRequest = ApiRequest.adapt({\n    server: 'assets/images',\n    path: ['lego.png'],\n    // saveAs: 'john.jpg' // Optional\n  })\n\n  // downloadRequest = ApiRequest.adapt({\n  //   server: 'oidc/ai/file'\n  // })\n\n  sampleClientData = {\n      id: 0,\n      name: \"Old School Dates\",\n      domain: \"osd.com\",\n      service: \"osd\",\n      spiffe: \"osd.com/osd\",\n      secret: \"SMOPECXP-OS4P-USOG-X2II-3XMD1FQDR3IJX\",\n      created: 1693003138,\n      modified: 1693003138,\n      icon: \"\",\n      imageFile: \"\",\n      email: \"wavecoders@gmail.com\"\n  }\n\n  requestForm = this.fb.group({\n    path: this.fb.control<string>(\"ai/\"),\n    headers: this.fb.array([]),\n    adapter: [null],\n    mapper: [null],\n    selector: [''],\n    retry: this.fb.group({\n      times: [3],\n      delay: [3],\n    }),\n    polling: [3],\n  })\n\n  AIType = 0\n\n  sampleAdaptors = [\n    { label: \"ClientInfo Basic\", value: ClientInfo.adapt },\n    { label: \"AI Prompt\", value: AIPrompt.adapt },\n  ]\n\n  sampleMappers = [\n    { label: \"Mapper Basic\", value: ClientInfoMapper.adapt },\n    { label: \"AI Prompt\", value: AIPrompt.adapt },\n  ]\n\n  get retry() {\n    return this.requestForm.get('retry')?.value\n  }\n\n  get headers(): FormArray {\n    return this.requestForm.get('headers') as FormArray\n  }\n\n  get isValid() {\n    this.requestForm.markAllAsTouched()\n    return this.requestForm.valid\n  }\n\n  hasId = (arr: any[]) => {\n    if (arr.length === 0) return false\n    return !isNaN(arr[arr.length - 1])\n  }\n\n  props = (adapter: any) => {\n    return (adapter) ? adapter() : null\n  }\n\n  // server = `http://sample-endpoint/as/authorization.oauth2`\n\n  arrayObjectsToObjects = (arr: any[]) => {\n    return Array.isArray(arr) ? arr.reduce((obj, item) => Object.assign(obj, { [item.key]: item.value }), {}) : {}\n  }\n\n  constructor() { }\n\n  ngOnInit() {\n\n    // const reqGet2 = ApiRequest.adapt({\n    //   server,\n    //   path: ['clients'],\n    //   headers: { authentication: \"Bearer <KEY>\" },\n    //   adapter: ClientInfo,\n    //   dataType: DataType.OBJECT,\n    //   // concurrent: false,\n    //   // polling: 3, //seconds\n    // })\n\n    // const req2 = [1024,1025,1026].map(item => {\n    //   return this.httpManagerService.getRequest<ClientInfo[]>(reqGet2, [item])\n    //   .pipe(\n    //     catchError(error => {\n    //       return throwError(() => new Error(error.error.message))\n    //     })\n    //   )\n    // })\n\n    // forkJoin(req2)\n    // .subscribe(res => console.log(res))\n\n  }\n\n  addHeader() {\n    const header = this.fb.group({\n      key: ['', Validators.required],\n      value: ['']\n    })\n    this.headers.push(header)\n  }\n\n  removeHeader(index: number) {\n    this.headers.removeAt(index)\n  }\n\n  compileRequest() {\n\n    const requestParams = this.requestForm.value\n\n    requestParams.headers = this.arrayObjectsToObjects(\n      requestParams.headers || []\n    )\n\n    const pathReq = (requestParams.path === \"\") ? [] : (requestParams.path || \"\").split(\"/\")\n\n    if (!this.pollingState.checked) requestParams.polling = 0\n\n    if (!this.failedState.checked) {\n      requestParams.retry = { times: 0,delay: 0 }\n    }\n\n    const apiOptions = ApiRequest.adapt(requestParams)\n    apiOptions.path = []\n    apiOptions.selector = this.requestForm.get('selector')?.value || undefined\n\n    return { apiOptions: apiOptions, path: pathReq }\n\n  }\n\n  onGetRequest() {\n\n    if(!this.isValid) return\n\n    const reqParams = this.compileRequest()\n\n    this.requestParams.GET = reqParams.apiOptions\n\n    // reset local state\n    this.GET_result = null\n    this.GET_error = ''\n\n    this.httpManagerService.getRequest<ClientInfo[]>(reqParams.apiOptions, reqParams.path)\n      .subscribe({\n        next: (res) => this.GET_result = res,\n        error: (err) => this.errorHandling(err, 'GET')\n      })\n\n  }\n\n  onCreateRequest() {\n\n    if(!this.isValid) return\n\n    const reqParams = this.compileRequest()\n    this.requestParams.POST = reqParams.apiOptions\n\n    // reset local state\n    this.POST_result = null\n    this.POST_error = ''\n\n    this.httpManagerService.postRequest<ClientInfo>(this.sampleClientData, reqParams.apiOptions, reqParams.path)\n      .subscribe({\n        next: (res) => this.POST_result = res,\n        error: (err) => this.errorHandling(err, 'POST')\n      })\n\n  }\n\n  onUpdateRequest() {\n\n    if(!this.isValid) return\n\n    const reqParams = this.compileRequest()\n\n    if(!this.hasId(reqParams.path)) {\n      console.log(\"Missing ID\")\n      return\n    }\n\n    this.sampleClientData.id = parseInt(reqParams.path[reqParams.path.length-1])\n    this.requestParams.PUT = reqParams.apiOptions\n\n    // reset local state\n    this.PUT_result = null\n    this.PUT_error = ''\n\n    this.httpManagerService.putRequest<any>(this.sampleClientData, reqParams.apiOptions, reqParams.path)\n      .subscribe({\n        next: (res) => this.PUT_result = res,\n        error: (err) => this.errorHandling(err, 'PUT')\n      })\n\n  }\n\n  onPatchRequest() {\n\n    if(!this.isValid) return\n\n    const reqParams = this.compileRequest()\n\n    if(!this.hasId(reqParams.path)) {\n      console.log(\"Missing ID\")\n      return\n    }\n\n    this.sampleClientData.id = parseInt(reqParams.path[reqParams.path.length-1])\n    this.requestParams.PATCH = reqParams.apiOptions\n\n    // reset local state\n    this.PATCH_result = null\n    this.PATCH_error = ''\n\n    this.httpManagerService.patchRequest<any>(this.sampleClientData, reqParams.apiOptions, reqParams.path)\n      .subscribe({\n        next: (res) => this.PATCH_result = res,\n        error: (err) => this.errorHandling(err, 'PATCH')\n      })\n\n  }\n\n  onDeleteRequest() {\n\n    if(!this.isValid) return\n\n    const reqParams = this.compileRequest()\n    this.requestParams.DELETE = reqParams.apiOptions\n\n    if(!this.hasId(reqParams.path)) {\n      console.log(\"Missing ID\")\n      return\n    }\n\n    this.sampleClientData.id = parseInt(reqParams.path[reqParams.path.length-1])\n    this.requestParams.DELETE = reqParams.apiOptions\n\n    // reset local state\n    this.DELETE_result = null\n    this.DELETE_error = ''\n\n    this.httpManagerService.deleteRequest<ClientInfo>(reqParams.apiOptions, reqParams.path)\n      .subscribe({\n        next: (res) => this.DELETE_result = res,\n        error: (err) => this.errorHandling(err, 'DELETE')\n      })\n\n  }\n\n  onStreamPostRequest() {\n\n    if (!this.isValid) return\n\n    const reqParams = this.compileRequest()\n\n    let payload = {}\n    let apiPath: string[] = reqParams.path\n    let apiOptions = reqParams.apiOptions\n    let responseMapper: (items: any) => any = (items) => items.response\n\n    if (this.AIType === 0) {\n\n      // API request\n      payload = { prompt: this.questionControl.value }\n\n    } else {\n\n      // Local Ollama request\n      apiOptions.server = \"api\"\n      apiPath = [\"generate\"]\n      apiOptions.stream = true\n      payload = {\n        model: \"phi3:latest\",\n        prompt: this.questionControl.value,\n        stream: true,\n      }\n\n      responseMapper = (items) => items.map((word: any) => word.response).flat().join('')\n\n    }\n\n    this.requestParams.STREAM = apiOptions\n    this.STREAM_AI_result = null\n    this.STREAM_AI_error = ''\n\n    this.httpManagerService.postRequest<any>(payload, apiOptions, apiPath)\n      .subscribe({\n        next: (res) => {\n          try {\n            this.STREAM_AI_result = responseMapper(res)\n          } catch (e) {\n            this.STREAM_AI_result = res\n          }\n          this.questionControl.reset()\n        },\n        error: (err) => this.errorHandling(err, 'STREAM')\n      })\n\n  }\n\n\n  onStreamRequest() {\n\n    if(!this.isValid) return\n\n    const reqParams = this.compileRequest()\n\n    reqParams.apiOptions.stream = true\n\n    this.requestParams.GET = reqParams.apiOptions\n    this.STREAM_result = null\n    this.STREAM_error = ''\n\n    this.httpManagerService.getRequest<ClientInfo[]>(reqParams.apiOptions, reqParams.path)\n      .subscribe({\n        next: (res) => this.STREAM_result = res,\n        error: (err) => this.errorHandling(err, 'STREAM')\n      })\n\n  }\n\n  onDownloadCompleted() {\n\n    const message = \"Download Completed\"\n\n    const display = ToastDisplay.adapt({\n      message,\n      action: 'Ok',\n      color: ToastColors.SUCCESS,\n      icon: 'sentiment_satisfied_alt',\n    })\n\n    this.toastMessage.toastMessage(display)\n  }\n\n  onDownloadFailed(err: string) {\n\n    const message = \"Download Failed\"\n\n    const display = ToastDisplay.adapt({\n      message,\n      action: 'Ok',\n      color: ToastColors.ERROR,\n      icon: 'warning',\n    })\n\n    this.toastMessage.toastMessage(display)\n  }\n\n  errorHandling(err: any, type: string) {\n    const message = err?.message || String(err)\n    // set local error state\n    if (type === 'GET') this.GET_error = message\n    if (type === 'POST') this.POST_error = message\n    if (type === 'PUT') this.PUT_error = message\n    if (type === 'PATCH') this.PATCH_error = message\n    if (type === 'DELETE') this.DELETE_error = message\n    if (type === 'STREAM') this.STREAM_error = message\n\n    // also set the shared service error signal — boolean flag, not the message string; the\n    // per-operation GET_error/POST_error/etc. fields above already carry the real message.\n    this.httpManagerService.error.set(true)\n\n    return err\n  }\n\n  onSelectAIType(type: number) {\n    this.AIType = type\n  }\n\n}\n","<div style=\"margin: 2rem;\">\n\n  <h2>\n    <span>HTTP Request Signals Manager</span>\n    <span style=\"margin-left: .5rem;\">\n      <mat-icon color=\"accent\">fiber_new</mat-icon>\n    </span>\n  </h2>\n\n  <div [formGroup]=\"requestForm\" style=\"margin-top: 2rem;\">\n    <div style=\"display: flex; gap: .5rem\">\n      <mat-form-field appearance=\"outline\">\n        <mat-label>Adapter (Model)</mat-label>\n        <mat-select formControlName=\"adapter\" #adapterSelect>\n          <mat-option>None</mat-option>\n          @for (adapter of sampleAdaptors; track adapter) {\n            <mat-option [value]=\"adapter.value\">\n              {{adapter.label}}\n            </mat-option>\n          }\n        </mat-select>\n      </mat-form-field>\n      <mat-form-field appearance=\"outline\">\n        <mat-label>Mapper (Model)</mat-label>\n        <mat-select formControlName=\"mapper\" #mapperSelect>\n          <mat-option>None</mat-option>\n          @for (mapper of sampleMappers; track mapper) {\n            <mat-option [value]=\"mapper.value\">\n              {{mapper.label}}\n            </mat-option>\n          }\n        </mat-select>\n      </mat-form-field>\n      <mat-form-field appearance=\"outline\">\n        <mat-label>Selector (response path)</mat-label>\n        <input matInput placeholder=\"data.items\" formControlName=\"selector\">\n      </mat-form-field>\n    </div>\n    @if (adapterSelect.value || mapperSelect.value) {\n      <div style=\"display: flex; margin-bottom: 2rem;\">\n        <div style=\"flex:1\" class=\"box\">\n          <h3>Adapter (Incoming)</h3>\n          @if (adapterSelect.value) {\n            <div>\n              {{ props(adapterSelect.value) | json }}\n            </div>\n          } @else {\n            No Transformation\n          }\n        </div>\n        <div style=\"flex:1\" class=\"box\">\n          <h3>Mapper (Outgoing)</h3>\n          @if (mapperSelect.value) {\n            <div>\n              {{ props(mapperSelect.value) | json }}\n            </div>\n          } @else {\n            No Transformation\n          }\n        </div>\n      </div>\n    }\n    <div>\n      <mat-form-field appearance=\"outline\">\n        <mat-label>RestPath (/ delimited)</mat-label>\n        <input matInput placeholder=\"clients/list\" formControlName=\"path\">\n      </mat-form-field>\n    </div>\n    <div>\n      <div formArrayName=\"headers\">\n        @for (task of headers.controls; track task; let i = $index) {\n          <div [formGroupName]=\"i\">\n            <div style=\"display: flex; gap: .5rem\">\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Key</mat-label>\n                <input matInput placeholder=\"authentication\" formControlName=\"key\">\n              </mat-form-field>\n              <mat-form-field appearance=\"outline\" style=\"flex:1\">\n                <mat-label>Value</mat-label>\n                <input matInput placeholder=\"sample\" formControlName=\"value\">\n              </mat-form-field>\n              <div style=\"margin-top: .5rem;\">\n                <button mat-icon-button (click)=\"removeHeader(i)\">\n                  <mat-icon>close</mat-icon>\n                </button>\n              </div>\n            </div>\n          </div>\n        }\n      </div>\n      <button mat-stroked-button (click)=\"addHeader()\" class=\"btn\">Add Header</button>\n    </div>\n    <div style=\"margin-top: 2rem; display: flex; flex-direction:column; gap: 1rem;\">\n      <div>\n        <mat-slide-toggle #failedState>Retry on Failed</mat-slide-toggle>\n        @if (failedState?.checked) {\n          <div style=\"display: flex; gap: .5rem; margin-top: 1rem;\" formGroupName=\"retry\">\n            <mat-form-field appearance=\"outline\">\n              <mat-label>#of Times</mat-label>\n              <input matInput placeholder=\"3\" formControlName=\"times\" value=\"3\">\n            </mat-form-field>\n            <mat-form-field appearance=\"outline\">\n              <mat-label>Delay Until Next</mat-label>\n              <input matInput placeholder=\"3\" formControlName=\"delay\" value=\"3\">\n            </mat-form-field>\n          </div>\n        }\n      </div>\n      <div>\n        <mat-slide-toggle #pollingState>Polling</mat-slide-toggle>\n        @if (pollingState?.checked) {\n          <div>\n            <mat-form-field appearance=\"outline\" style=\"margin-top: 1rem\">\n              <mat-label>#of Seconds</mat-label>\n              <input matInput placeholder=\"3\" formControlName=\"polling\" value=\"3\">\n            </mat-form-field>\n          </div>\n        }\n      </div>\n    </div>\n  </div>\n\n  <div style=\"margin-bottom: 1rem; margin-top: 2rem;\">\n    @if (isPending()) {\n      <mat-progress-bar mode=\"indeterminate\"\n      ></mat-progress-bar>\n    }\n    @if (pollingState?.checked && !isPending()) {\n      <mat-progress-bar mode=\"determinate\"\n        [value]=\"countdown()\"\n      ></mat-progress-bar>\n    }\n  </div>\n\n  <div style=\"margin-top: 1rem\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <div style=\"display: flex;\">\n      <h2 style=\"flex:1\">GET Request</h2>\n      <div>\n        <button mat-raised-button (click)=\"onGetRequest()\" class=\"btn\">Request</button>\n      </div>\n    </div>\n\n    @if (GET_error) {\n      <div style=\"margin-top: .5rem;\">\n        <mat-error>{{ GET_error }}</mat-error>\n      </div>\n    }\n\n    @if (GET_result) {\n      <div style=\"margin-top: 1rem;\">\n        {{ GET_result | json }}\n      </div>\n    }\n\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <div style=\"display: flex;\">\n      <h2 style=\"flex:1\">POST Request</h2>\n      <div>\n        <button mat-raised-button (click)=\"onCreateRequest()\" class=\"btn\">Request</button>\n      </div>\n    </div>\n\n    @if (POST_error) {\n      <div style=\"margin-top: .5rem;\">\n        <mat-error>{{ POST_error }}</mat-error>\n      </div>\n    }\n\n    @if (POST_result) {\n      <div style=\"margin-top: 1rem;\">\n        {{ POST_result | json }}\n      </div>\n    }\n\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <div style=\"display: flex;\">\n      <h2 style=\"flex:1\">PUT Request</h2>\n      <div>\n        <button mat-raised-button (click)=\"onUpdateRequest()\" class=\"btn\">Request</button>\n      </div>\n    </div>\n\n    @if (PUT_error) {\n      <div style=\"margin-top: .5rem;\">\n        <mat-error>{{ PUT_error }}</mat-error>\n      </div>\n    }\n\n    <h3>Include Record ID in the RestPath</h3>\n\n    @if (PUT_result) {\n      <div style=\"margin-top: 1rem;\">\n        {{ PUT_result | json }}\n      </div>\n    }\n\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <div style=\"display: flex;\">\n      <h2 style=\"flex:1\">DELETE Request</h2>\n      <div>\n        <button mat-raised-button (click)=\"onDeleteRequest()\" class=\"btn\">Request</button>\n      </div>\n    </div>\n\n    <h3>Include Record ID in the RestPath</h3>\n\n    @if (DELETE_error) {\n      <div style=\"margin-top: .5rem;\">\n        <mat-error>{{ DELETE_error }}</mat-error>\n      </div>\n    }\n\n    @if (DELETE_result) {\n      <div style=\"margin-top: 1rem;\">\n        {{ DELETE_result | json }}\n      </div>\n    }\n\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <div style=\"display: flex;\">\n      <h2 style=\"flex:1\">PATCH Request</h2>\n      <div>\n        <button mat-raised-button (click)=\"onPatchRequest()\" class=\"btn\">Request</button>\n      </div>\n    </div>\n\n    <h3>Include Record ID in the RestPath</h3>\n\n    @if (PATCH_error) {\n      <div style=\"margin-top: .5rem;\">\n        <mat-error>{{ PATCH_error }}</mat-error>\n      </div>\n    }\n\n    @if (PATCH_result) {\n      <div style=\"margin-top: 1rem;\">\n        {{ PATCH_result | json }}\n      </div>\n    }\n\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <mat-divider></mat-divider>\n  </div>\n\n  <div style=\"margin-top: 2rem\">\n    <div style=\"display: flex;\">\n      <h2 style=\"flex:1\">Streaming GET Request</h2>\n      <div>\n        <button mat-raised-button (click)=\"onStreamRequest()\" class=\"btn\">Request</button>\n      </div>\n    </div>\n\n    <!-- <div *ngIf=\"(STREAM_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n    <mat-error>{{ stream_error }}</mat-error>\n  </div> -->\n\n  <div style=\"margin-top: 1rem;\">\n    @if (STREAM_result; as data) {\n      <div class=\"container\">\n        <table mat-table [dataSource]=\"data\">\n          <ng-container matColumnDef=\"id\">\n            <th mat-header-cell *matHeaderCellDef> ID </th>\n            <td mat-cell *matCellDef=\"let element\"> {{element.id}} </td>\n          </ng-container>\n          <ng-container matColumnDef=\"name\">\n            <th mat-header-cell *matHeaderCellDef> First Name </th>\n            <td mat-cell *matCellDef=\"let element\"> {{element.name}} </td>\n          </ng-container>\n          <ng-container matColumnDef=\"lastName\">\n            <th mat-header-cell *matHeaderCellDef> Last Name </th>\n            <td mat-cell *matCellDef=\"let element\"> {{element.lastName}} </td>\n          </ng-container>\n          <ng-container matColumnDef=\"age\">\n            <th mat-header-cell *matHeaderCellDef> Age </th>\n            <td mat-cell *matCellDef=\"let element\"> {{element.age}} </td>\n          </ng-container>\n          <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n          <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n        </table>\n      </div>\n    }\n  </div>\n\n</div>\n\n<div style=\"margin-top: 2rem\">\n  <mat-divider></mat-divider>\n</div>\n\n<div style=\"margin-top: 2rem\">\n  <div style=\"display: flex;\">\n    <h2 style=\"flex:1; padding-top: .5rem;\">AI -@if (AIType === 1) {\n      <span>STREAMING</span>\n    } POST Request</h2>\n    <div style=\"display: flex; gap: 1rem;\">\n      <button mat-raised-button [matMenuTriggerFor]=\"menu\" style=\"min-width: 120px;\">\n        <mat-icon>lan</mat-icon>\n        @if (AIType === 0) {\n          <span>Server</span>\n        } @else {\n          Local\n        }\n      </button>\n      <mat-menu #menu=\"matMenu\">\n        <button mat-menu-item (click)=\"onSelectAIType(0)\">Server</button>\n        <button mat-menu-item (click)=\"onSelectAIType(1)\">Local</button>\n      </mat-menu>\n      <div>\n        <button mat-raised-button (click)=\"onStreamPostRequest()\" class=\"btn\">Ask Me</button>\n      </div>\n    </div>\n  </div>\n\n  <div style=\"display: flex;\">\n    <mat-form-field appearance=\"outline\" style=\"flex:1\">\n      <mat-label>Ask me a Question</mat-label>\n      <textarea matInput placeholder=\"Why is the sky blue?\" [formControl]=\"questionControl\"></textarea>\n    </mat-form-field>\n  </div>\n\n  @if (STREAM_AI_error) {\n    <div style=\"margin-top: .5rem;\">\n      <mat-error>{{ STREAM_AI_error }}</mat-error>\n    </div>\n  }\n\n  @if (AIType === 1) {\n    <div style=\"color: red;\">\n      You must have Ollama active and the 'phi3:latest' model to use this feature.\n    </div>\n  } @else {\n    <span style=\"color: gray;\">\n      Define the RestPath to the API endpoint that will handle the AI request.\n      Use: 'ai/chat' for server\n    </span>\n  }\n\n  <div>\n    @if (STREAM_AI_result) {\n      <div style=\"margin-top: 1rem; font-size: 1.2rem; border-radius: 1rem; border: black 1px solid; padding: 2rem;\">\n        <p style=\"margin-bottom: .5rem; white-space:pre-wrap; line-height: 1.6rem;\">{{STREAM_AI_result}}</p>\n      </div>\n    }\n  </div>\n\n</div>\n\n<div style=\"margin-top: 1.5rem; margin-bottom: 1rem; line-height: 1.5rem;\">\n  <mat-divider></mat-divider>\n</div>\n\n<div>\n  <div style=\"display: flex;\">\n    <h2 style=\"flex:1; margin-bottom: 0; padding-top: .5rem; display: flex;\">\n      <div>\n        Download File\n      </div>\n      <div style=\"flex:1; margin-left: 1rem;\">\n        <mat-slide-toggle #disable>\n          @if (disable?.checked) {\n            <span>\n              Enable\n            </span>\n          } @else {\n            Disable\n          }\n        </mat-slide-toggle>\n      </div>\n    </h2>\n    <div>\n      <app-file-downloader\n        [disabled]=\"!!disable?.checked\"\n        [delayError]=\"3\"\n        [apiRequest]=\"downloadRequest\"\n        (completed)=\"onDownloadCompleted()\"\n        (failed)=\"onDownloadFailed($event)\"\n      ></app-file-downloader>\n    </div>\n  </div>\n</div>\n\n</div>\n","import { HTTP_INTERCEPTORS } from '@angular/common/http';\nimport { ModuleWithProviders, NgModule } from '@angular/core';\n\n\nimport { WithCredentialsInterceptor, RequestHeadersInterceptor, RequestErrorInterceptor } from './interceptors';\nimport { TranslateModule } from '@ngx-translate/core';\n\nimport { CommonModule } from '@angular/common';\n\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatListModule } from '@angular/material/list';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSidenavModule } from '@angular/material/sidenav';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatNativeDateModule } from '@angular/material/core';\nimport { MatCardModule } from '@angular/material/card';\nimport { ProxyDebuggerInterceptor } from './interceptors/proxy-debugger.interceptor';\nimport { MatTabsModule } from '@angular/material/tabs';\n\nimport { ConfigOptions } from './models/config-options.model';\nimport { CONFIG_SETTINGS_TOKEN } from './models/config-token.model';\nimport { EncryptionHelpersModule } from 'encryption-helpers';\nimport { HTTPManagerService } from './services/request-manager-services/http-manager.service';\nimport { LocalStorageManagerService } from './services/local-storage-manager-service/local-storage-manager.service';\n\nimport { FileDownloaderModule } from './http-request-services-demo/request-manager-demo/file-downloader/file-download.module';\nimport { ToastMessageDisplayModule, ToastMessageDisplayService } from 'toast-message-display';\n\n// Message Display System\nimport { MessageDisplayRouterService, SnackbarStrategy } from './message-display';\n\n// Fix: Import components directly instead of from public-api to avoid circular dependency\nimport { HttpRequestServicesDemoComponent } from './http-request-services-demo/http-request-services-demo.component';\nimport { DatabaseDataDemoComponent } from './http-request-services-demo/database-data-demo/database-data-demo.component';\nimport { LocalStorageDemoComponent } from './http-request-services-demo/local-storage-demo/local-storage-demo.component';\nimport { RequestManagerDemoComponent } from './http-request-services-demo/request-manager-demo/request-manager-demo.component';\nimport { RequestManagerStateDemoComponent } from './http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component';\n\nimport { RequestManagerWsDemoComponent } from './http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component';\nimport { RequestSignalsManagerDemoComponent } from './http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component';\nimport { StoreStateManagerDemoComponent } from './http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component';\n\nimport { WsDataControlComponent } from './http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component';\nimport { WsMessagingComponent } from './http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component';\nimport { WsNotificationsComponent } from './http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component';\nimport { WsAiMessagingComponent } from './http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component';\nimport { WsChatsComponent } from './http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component';\nimport { RequestManagerBasicDemoComponent } from './http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component';\nimport { UploadDemoComponent } from './http-request-services-demo/upload-demo/upload-demo.component';\nimport { DownloadDemoComponent } from './http-request-services-demo/download-demo/download-demo.component';\n\n// import { MessengerChatModule } from 'src/app/components/messenger-chat/messenger-chat.module';\n// import { StoreStateManagerModule } from \"src/app/beta_components/store-state-manager/store-state-manager.module\";\n\n\n@NgModule({\n  imports: [\n    CommonModule,\n    ToastMessageDisplayModule,\n    FormsModule,\n    ReactiveFormsModule,\n    MatButtonModule,\n    MatTabsModule,\n    MatSelectModule,\n    MatChipsModule,\n    MatMenuModule,\n    MatIconModule,\n    MatListModule,\n    MatTableModule,\n    MatButtonToggleModule,\n    MatAutocompleteModule,\n    MatProgressBarModule,\n    MatProgressSpinnerModule,\n    MatSlideToggleModule,\n    MatDividerModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatToolbarModule,\n    MatSlideToggleModule,\n    TranslateModule.forRoot(),\n    MatSidenavModule,\n    MatDatepickerModule,\n    MatNativeDateModule,\n    MatCardModule,\n    FileDownloaderModule,\n    // MessengerChatModule,\n    // StoreStateManagerModule\n],\n  declarations: [\n    RequestManagerBasicDemoComponent,\n    HttpRequestServicesDemoComponent,\n    RequestManagerStateDemoComponent,\n    RequestManagerDemoComponent,\n    RequestSignalsManagerDemoComponent,\n    LocalStorageDemoComponent,\n    RequestManagerWsDemoComponent,\n    StoreStateManagerDemoComponent,\n    DatabaseDataDemoComponent,\n    WsDataControlComponent,\n    WsMessagingComponent,\n    WsNotificationsComponent,\n    WsAiMessagingComponent,\n    WsChatsComponent,\n    UploadDemoComponent,\n    DownloadDemoComponent,\n  ],\n  exports: [\n    HttpRequestServicesDemoComponent,\n    UploadDemoComponent,\n    DownloadDemoComponent,\n  ],\n  providers: [\n    { provide: HTTP_INTERCEPTORS, useClass: WithCredentialsInterceptor, multi: true },\n    { provide: HTTP_INTERCEPTORS, useClass: RequestHeadersInterceptor, multi: true },\n    { provide: HTTP_INTERCEPTORS, useClass: ProxyDebuggerInterceptor, multi: true },\n    { provide: HTTP_INTERCEPTORS, useClass: RequestErrorInterceptor, multi: true },\n    { provide: CONFIG_SETTINGS_TOKEN, useValue: ConfigOptions.adapt() },\n    HTTPManagerService, LocalStorageManagerService,\n    ToastMessageDisplayService,\n    MessageDisplayRouterService,\n    SnackbarStrategy\n  ],\n})\nexport class HttpRequestManagerModule {\n\n  static forRoot(config: ConfigOptions = ConfigOptions.adapt()): ModuleWithProviders<HttpRequestManagerModule> {\n    return {\n      ngModule: HttpRequestManagerModule,\n      providers: [\n        { provide: CONFIG_SETTINGS_TOKEN, useValue: ConfigOptions.adapt(config) },\n        ...EncryptionHelpersModule.forRoot({ appId: config.appId ?? '' }).providers ?? [],\n        HTTPManagerService, LocalStorageManagerService //all services that need access to config\n      ],\n    };\n    }\n\n}\n\n\n","/*\n * Public API Surface of http-request-manager\n */\n\nexport * from 'encryption-helpers';\n\nexport * from './lib/index';\nexport * from './lib/http-request-manager.module';\n\nexport * from './lib/http-request-services-demo/http-request-services-demo.component';\n\nexport * from './lib/http-request-services-demo/database-data-demo/database-data-demo.component';\nexport * from './lib/http-request-services-demo/local-storage-demo/local-storage-demo.component';\nexport * from './lib/http-request-services-demo/request-manager-demo/request-manager-demo.component';\nexport * from './lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component';\nexport * from './lib/http-request-services-demo/request-manager-ws-demo/models/user-data.model';\n\nexport * from './lib/http-request-services-demo/upload-demo/upload-demo.component';\nexport * from './lib/http-request-services-demo/download-demo/download-demo.component';\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.WebSocketManagerService","ChannelType","i1.DatabaseStorage","i1.StateStorageOptions","catchError","i1","i3","i1.DownloadFileComponent","i2","i5","i6","i7","ClientInfo","ClientInfoMapper","map","AIPrompt","tap","i4","i8","i10","i11","i9","i12","i14","switchMap","startWith","distinctUntilChanged","takeUntil","filter","take","i9.WsDataControlComponent","i10.WsMessagingComponent","i11.WsNotificationsComponent","i12.WsAiMessagingComponent","i13.WsChatsComponent","i2.FileDownloaderComponent","i6.RequestManagerBasicDemoComponent","i7.RequestManagerStateDemoComponent","i8.RequestManagerDemoComponent","i9.LocalStorageDemoComponent","i10.RequestManagerWsDemoComponent","i11.StoreStateManagerDemoComponent","i12.DatabaseDataDemoComponent","i13.UploadDemoComponent","i14.DownloadDemoComponent","i11.FileDownloaderComponent"],"mappings":"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"}