@katlux/providers 0.1.1-alpha.100 → 0.1.1-alpha.102

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -47,7 +47,8 @@ declare enum EDataFilterOperator {
47
47
  }
48
48
  declare enum ECacheStrategy {
49
49
  Application = "Application",
50
- Session = "Session",
50
+ ServerSession = "ServerSession",
51
+ BrowserSession = "BrowserSession",
51
52
  Memory = "Memory",
52
53
  LocalStorage = "LocalStorage",
53
54
  IndexedDB = "IndexedDB",
@@ -69,14 +70,13 @@ interface IRequestOptions {
69
70
  query?: Record<string, any>;
70
71
  deduplicate?: boolean;
71
72
  context?: any;
72
- /** @deprecated Use `context` instead */
73
- nuxtApp?: any;
74
73
  disableCache?: boolean;
75
74
  queue?: boolean;
76
75
  queueLabel?: string;
77
76
  label?: string;
78
77
  tags?: string[];
79
78
  signal?: AbortSignal;
79
+ _generation?: number;
80
80
  }
81
81
  /** Queue persistence backend with automatic fallback: IndexedDB → LocalStorage → Memory */
82
82
  declare enum EQueueStorage {
@@ -122,19 +122,20 @@ type TDataRow = {
122
122
  interface IDataFilter {
123
123
  operator: EDataFilterOperator;
124
124
  field: TDataRow | IDataFilter[];
125
- active: Boolean;
125
+ active: boolean;
126
126
  }
127
127
  interface IDataSort {
128
128
  field: string;
129
129
  direction: 'asc' | 'desc';
130
130
  }
131
- interface IDataResult {
131
+ interface IDataResult<TRow = TDataRow> {
132
132
  rowCount: number;
133
- rows: TDataRow[];
133
+ rows: TRow[];
134
134
  }
135
- type TPageDataHandler = (currentPage: number, pageSize: number, filter: IDataFilter, sortList: IDataSort[], options?: {
135
+ type TPageDataHandler<TRow = TDataRow> = (currentPage: number, pageSize: number, filter: IDataFilter, sortList: IDataSort[], options?: {
136
136
  disableCache?: boolean;
137
- }) => IDataResult | Promise<IDataResult>;
137
+ signal?: AbortSignal;
138
+ }) => IDataResult<TRow> | Promise<IDataResult<TRow>>;
138
139
  interface IDataProviderOptions {
139
140
  idKey?: string;
140
141
  filter?: IDataFilter;
@@ -147,29 +148,56 @@ interface IDataProviderOptions {
147
148
  cacheLifetime?: number;
148
149
  deduplicate?: boolean;
149
150
  context?: any;
150
- /** @deprecated Use `context` instead for framework-agnostic SSR context */
151
- nuxtApp?: any;
151
+ contextKey?: string;
152
152
  urlPageParam?: string;
153
153
  refreshOnMutation?: boolean;
154
+ filterDebounce?: number;
155
+ sortDebounce?: number;
154
156
  }
155
157
 
156
- interface ITreeNode {
157
- data: TDataRow;
158
+ interface ITreeNode<TRow = TDataRow> {
159
+ data: TRow;
158
160
  id: string | number;
159
161
  parentId: string | number | null;
160
162
  depth: number;
161
163
  hasChildren: boolean;
162
164
  isExpanded: boolean;
163
165
  }
164
- interface ITreeNodeStatic {
165
- data: TDataRow;
166
+ interface ITreeNodeStatic<TRow = TDataRow> {
167
+ data: TRow;
166
168
  id: string | number;
167
169
  parentId: string | number | null;
168
170
  depth: number;
169
171
  hasChildren: boolean;
170
172
  childIds?: (string | number)[];
171
173
  }
174
+ /**
175
+ * A row enriched with tree metadata by a tree data provider
176
+ */
177
+ type TTreeRow<TRow = TDataRow> = TRow & {
178
+ id?: string | number;
179
+ __treeNode?: ITreeNode<TRow>;
180
+ depth?: number;
181
+ hasChildren?: boolean;
182
+ isExpanded?: boolean;
183
+ parentId?: string | number | null;
184
+ };
172
185
  type TreePaginationMode = 'all' | 'root';
186
+ /**
187
+ * Interface describing a DataProvider with hierarchical tree capabilities
188
+ */
189
+ interface ITreeDataProvider<TRow = TDataRow> {
190
+ toggleNode(id: string | number): void;
191
+ expandedNodes: Set<string | number> | {
192
+ value: Set<string | number>;
193
+ };
194
+ parentKey?: string;
195
+ expandedByDefault?: boolean;
196
+ paginateBy?: TreePaginationMode;
197
+ collapseAll?(): void;
198
+ expandAll?(): void;
199
+ isExpanded?(id: string | number): boolean;
200
+ }
173
201
  interface ITreeDataProviderOptions extends IDataProviderOptions {
174
202
  parentKey?: string;
175
203
  idKey?: string;
@@ -180,7 +208,7 @@ interface ITreeDataProviderOptions extends IDataProviderOptions {
180
208
  * Tree-specific page data handler that includes tree parameters
181
209
  * Server handles tree building, visibility, and pagination
182
210
  */
183
- type TTreePageDataHandler = (currentPage: number, pageSize: number, filter: IDataFilter, sortList: IDataSort[], treeParams: {
211
+ type TTreePageDataHandler<TRow = TDataRow> = (currentPage: number, pageSize: number, filter: IDataFilter, sortList: IDataSort[], treeParams: {
184
212
  expandedNodes: (string | number)[] | Set<string | number>;
185
213
  parentKey: string;
186
214
  idKey: string;
@@ -188,7 +216,7 @@ type TTreePageDataHandler = (currentPage: number, pageSize: number, filter: IDat
188
216
  expandedByDefault: boolean;
189
217
  }, options?: {
190
218
  disableCache?: boolean;
191
- }) => IDataResult | Promise<IDataResult>;
219
+ }) => IDataResult<TRow> | Promise<IDataResult<TRow>>;
192
220
  interface KProductItemData {
193
221
  id: string | number;
194
222
  title: string;
@@ -205,21 +233,31 @@ interface KProductRowAction {
205
233
  color?: 'primary' | 'danger' | 'success' | 'warning' | 'info' | 'light' | 'dark' | 'default';
206
234
  }
207
235
 
208
- declare abstract class ADataProvider {
236
+ declare abstract class ADataProvider<TRow = TDataRow> {
209
237
  idKey: string;
210
- pageData: TDataRow[];
211
- rowCount: number;
212
- loading: boolean;
213
- initialLoad: boolean;
214
- error: any;
238
+ pageData: TRow[];
239
+ protected _rowCount: number;
240
+ get rowCount(): number;
241
+ set rowCount(val: number);
242
+ protected _loading: boolean;
243
+ get loading(): boolean;
244
+ set loading(val: boolean);
245
+ protected _initialLoad: boolean;
246
+ get initialLoad(): boolean;
247
+ set initialLoad(val: boolean);
248
+ protected _error: any;
249
+ get error(): any;
250
+ set error(val: any);
215
251
  SSR: boolean;
216
252
  deduplicate: boolean;
217
253
  context: any;
218
- get nuxtApp(): any;
219
- set nuxtApp(val: any);
220
254
  urlPageParam: string;
221
- selectedRows: any[];
222
- selectAll: boolean;
255
+ protected _selectedRows: TRow[];
256
+ get selectedRows(): TRow[];
257
+ set selectedRows(val: TRow[]);
258
+ protected _selectAll: boolean;
259
+ get selectAll(): boolean;
260
+ set selectAll(val: boolean);
223
261
  protected _currentPage: number;
224
262
  protected _pageSize: number;
225
263
  protected _filter: IDataFilter | null;
@@ -234,11 +272,19 @@ declare abstract class ADataProvider {
234
272
  set sortList(s: IDataSort[]);
235
273
  private _listeners;
236
274
  private _debouncedFilterLoad;
275
+ private _debouncedSortLoad;
237
276
  constructor(options?: IDataProviderOptions);
277
+ private _batchDepth;
278
+ private _pendingNotify;
279
+ private _isNotifying;
280
+ /**
281
+ * Batches multiple state updates so notify() fires exactly once upon completion.
282
+ */
283
+ batchUpdates<R>(fn: () => R): R;
238
284
  subscribe(listener: TDataProviderListener<this>): TUnsubscribe;
239
285
  notify(): void;
240
286
  getState(): {
241
- pageData: TDataRow[];
287
+ pageData: TRow[];
242
288
  rowCount: number;
243
289
  currentPage: number;
244
290
  pageSize: number;
@@ -247,27 +293,40 @@ declare abstract class ADataProvider {
247
293
  error: any;
248
294
  filter: IDataFilter | null;
249
295
  sortList: IDataSort[];
250
- selectedRows: any[];
296
+ selectedRows: TRow[];
251
297
  selectAll: boolean;
252
298
  };
253
- setFilter(filter: IDataFilter | null): void;
254
- setSortList(sortList: IDataSort[]): void;
299
+ setFilter(filter: IDataFilter | null, immediate?: boolean): void;
300
+ setSortList(sortList: IDataSort[], immediate?: boolean): void;
255
301
  setCurrentPage(currentPage: number): void;
256
302
  setPageSize(pageSize: number): void;
257
- setSelectedRows(rows: any[]): void;
303
+ setSelectedRows(rows: TRow[]): void;
258
304
  setSelectAll(val: boolean): void;
259
305
  abstract loadPageData(options?: {
260
306
  disableCache?: boolean;
261
307
  signal?: AbortSignal;
262
308
  }): void | Promise<void>;
263
309
  refresh(hardRefresh?: boolean): Promise<void>;
310
+ cancelPending(): void;
264
311
  }
265
312
 
266
- declare class CFlatClientDataProvider extends ADataProvider {
267
- allData: TDataRow[];
268
- filteredData: TDataRow[];
313
+ declare class CFlatClientDataProvider<TRow = TDataRow> extends ADataProvider<TRow> {
314
+ private _allData;
315
+ filteredData: TRow[];
316
+ private _rowMap;
317
+ private _filterDirty;
318
+ private _sortDirty;
269
319
  constructor(options?: IDataProviderOptions);
270
- setData(data: TDataRow[]): void;
320
+ get allData(): TRow[];
321
+ set allData(data: TRow[]);
322
+ get rowMap(): readonly TRow[];
323
+ setData(data: TRow[]): void;
324
+ setFilter(filter: IDataFilter | null, immediate?: boolean): void;
325
+ setSortList(sortList: IDataSort[], immediate?: boolean): void;
326
+ /**
327
+ * Explicitly rebuilds the reference map array if row properties inside allData were mutated in-place.
328
+ */
329
+ updateMap(): void;
271
330
  refreshData(options?: {
272
331
  disableCache?: boolean;
273
332
  }): Promise<void>;
@@ -277,12 +336,12 @@ declare class CFlatClientDataProvider extends ADataProvider {
277
336
 
278
337
  declare abstract class ACacheProvider {
279
338
  constructor();
280
- abstract getKeyList(nuxtApp?: any): Array<string> | Promise<Array<string>>;
281
- abstract get<T>(key: string, nuxtApp?: any): Promise<T | null>;
282
- abstract set<T>(key: string, data: T, lifetime: number, nuxtApp?: any): Promise<void>;
283
- abstract remove(key: string, nuxtApp?: any): Promise<void>;
284
- abstract removeByPrefix(prefix: string, nuxtApp?: any): Promise<void>;
285
- abstract getRemainingTime(key: string, nuxtApp?: any): Promise<number | null>;
339
+ abstract getKeyList(context?: any): Array<string> | Promise<Array<string>>;
340
+ abstract get<T>(key: string, context?: any): Promise<T | null>;
341
+ abstract set<T>(key: string, data: T, lifetime: number, context?: any): Promise<void>;
342
+ abstract remove(key: string, context?: any): Promise<void>;
343
+ abstract removeByPrefix(prefix: string, context?: any): Promise<void>;
344
+ abstract getRemainingTime(key: string, context?: any): Promise<number | null>;
286
345
  abstract cleanupExpired(): Promise<void>;
287
346
  }
288
347
 
@@ -306,12 +365,16 @@ declare class RequestProvider {
306
365
  setCacheProvider(provider?: ACacheProvider | ECacheStrategy): void;
307
366
  setCacheLifetime(lifetime: number): void;
308
367
  setDeduplicate(deduplicate: boolean): void;
309
- onDataReceived(callback: (data: any) => void): void;
368
+ onDataReceived(callback: (data: any, generation?: number) => void): void;
369
+ private invokeDataReceivedCallback;
310
370
  hasLastUrl(): boolean;
311
371
  refresh(hardRefresh?: boolean): Promise<any>;
372
+ private resolveContext;
373
+ private getInFlightMap;
312
374
  private getUniqueKey;
313
375
  registerRequest<T>(url: string, options?: IRequestOptions): Promise<T>;
314
376
  static executeAll(): void;
377
+ private isSameOriginUrl;
315
378
  request<T>(url: string, options?: IRequestOptions): Promise<T>;
316
379
  }
317
380
 
@@ -328,7 +391,7 @@ declare abstract class AAPIDataProvider {
328
391
  abstract delete(items: any[]): Promise<void>;
329
392
  }
330
393
 
331
- declare class CAPIFlatClientDataProvider extends CFlatClientDataProvider implements AAPIDataProvider {
394
+ declare class CAPIFlatClientDataProvider<TRow = TDataRow> extends CFlatClientDataProvider<TRow> implements AAPIDataProvider {
332
395
  apiUrl: string;
333
396
  contextKey: string;
334
397
  requestProvider: RequestProvider;
@@ -337,25 +400,25 @@ declare class CAPIFlatClientDataProvider extends CFlatClientDataProvider impleme
337
400
  refreshOnMutation: boolean | undefined;
338
401
  constructor(options?: IDataProviderOptions);
339
402
  setContextKey(key: string): void;
340
- refresh(hardRefresh?: boolean): Promise<void>;
403
+ setCacheStrategy(strategy: ECacheStrategy): void;
404
+ setCacheLifetime(lifetime: number): void;
341
405
  refreshData(options?: {
342
406
  disableCache?: boolean;
343
407
  }): Promise<void>;
344
- private _initialFetch;
345
408
  setAPIUrl(url: string): Promise<void>;
346
409
  create(item: any): Promise<void>;
347
410
  update(item: any): Promise<void>;
348
411
  delete(items: any[]): Promise<void>;
349
412
  }
350
413
 
351
- declare class CFlatServerDataProvider extends ADataProvider {
352
- pageDataHandler: TPageDataHandler;
414
+ declare class CFlatServerDataProvider<TRow = TDataRow> extends ADataProvider<TRow> {
415
+ pageDataHandler: TPageDataHandler<TRow>;
353
416
  contextKey: string;
354
417
  private latestRequestId;
355
418
  private abortController;
356
419
  constructor(options?: IDataProviderOptions);
357
420
  setContextKey(key: string): void;
358
- setPageDataHandler(handler: TPageDataHandler): Promise<void>;
421
+ setPageDataHandler(handler: TPageDataHandler<TRow>): Promise<void>;
359
422
  loadPageData(options?: {
360
423
  disableCache?: boolean;
361
424
  signal?: AbortSignal;
@@ -363,12 +426,14 @@ declare class CFlatServerDataProvider extends ADataProvider {
363
426
  refresh(hardRefresh?: boolean): Promise<void>;
364
427
  }
365
428
 
366
- declare class CAPIFlatServerDataProvider extends CFlatServerDataProvider implements AAPIDataProvider {
429
+ declare class CAPIFlatServerDataProvider<TRow = TDataRow> extends CFlatServerDataProvider<TRow> implements AAPIDataProvider {
367
430
  apiUrl: string;
368
431
  requestProvider: RequestProvider;
369
432
  cacheStrategy: ECacheStrategy | null;
370
433
  cacheLifetime: number;
371
434
  refreshOnMutation: boolean | undefined;
435
+ /** Incremented on every new request; stale onDataReceived callbacks are discarded. */
436
+ private _requestGeneration;
372
437
  constructor(options?: IDataProviderOptions);
373
438
  refresh(hardRefresh?: boolean): Promise<void>;
374
439
  refreshData(options?: {
@@ -380,7 +445,7 @@ declare class CAPIFlatServerDataProvider extends CFlatServerDataProvider impleme
380
445
  update(item: any): Promise<void>;
381
446
  }
382
447
 
383
- declare class CTreeClientDataProvider extends CFlatClientDataProvider {
448
+ declare class CTreeClientDataProvider<TRow extends TDataRow = TDataRow> extends CFlatClientDataProvider<TRow> implements ITreeDataProvider<TRow> {
384
449
  parentKey: string;
385
450
  idKey: string;
386
451
  expandedByDefault: boolean;
@@ -389,22 +454,24 @@ declare class CTreeClientDataProvider extends CFlatClientDataProvider {
389
454
  private _staticNodesCache;
390
455
  private _nodeMapCache;
391
456
  private _sortedNodeIdsCache;
457
+ private _filteredNodesCache;
392
458
  invalidateStaticCache(): void;
459
+ setFilter(filter: IDataFilter | null, immediate?: boolean): void;
393
460
  private get _staticNodes();
394
461
  private get _nodeMap();
395
462
  private get _sortedNodeIds();
396
463
  constructor(options?: ITreeDataProviderOptions);
397
- setData(data: TDataRow[]): void;
464
+ setData(data: TRow[]): void;
398
465
  private buildStaticNodes;
399
466
  private computeSortedIds;
400
467
  private isNodeVisible;
401
468
  private paginateNodes;
402
469
  private updatePageData;
403
470
  loadPageData(): Promise<void>;
404
- get treeNodes(): ITreeNode[];
405
- get visibleRows(): ITreeNode[];
406
- getAllNodes(): ITreeNode[];
407
- getFlatNodes(): ITreeNode[];
471
+ get treeNodes(): ITreeNode<TRow>[];
472
+ get visibleRows(): ITreeNode<TRow>[];
473
+ getAllNodes(): ITreeNode<TRow>[];
474
+ getFlatNodes(): ITreeNode<TRow>[];
408
475
  toggleNode(nodeId: string | number): void;
409
476
  expand(nodeId: string | number): void;
410
477
  collapse(nodeId: string | number): void;
@@ -412,12 +479,12 @@ declare class CTreeClientDataProvider extends CFlatClientDataProvider {
412
479
  collapseNode(nodeId: string | number): void;
413
480
  expandAll(): void;
414
481
  collapseAll(): void;
415
- getNode(nodeId: string | number): ITreeNode | undefined;
416
- getChildren(nodeId: string | number): ITreeNode[];
417
- getParent(nodeId: string | number): ITreeNode | undefined;
482
+ getNode(nodeId: string | number): ITreeNode<TRow> | undefined;
483
+ getChildren(nodeId: string | number): ITreeNode<TRow>[];
484
+ getParent(nodeId: string | number): ITreeNode<TRow> | undefined;
418
485
  }
419
486
 
420
- declare class CAPITreeClientDataProvider extends CTreeClientDataProvider implements AAPIDataProvider {
487
+ declare class CAPITreeClientDataProvider<TRow extends TDataRow = TDataRow> extends CTreeClientDataProvider<TRow> implements AAPIDataProvider {
421
488
  apiUrl: string;
422
489
  contextKey: string;
423
490
  requestProvider: RequestProvider;
@@ -446,17 +513,17 @@ declare class CAPITreeClientDataProvider extends CTreeClientDataProvider impleme
446
513
  * - Server returns already-paginated visible rows with __treeNode metadata
447
514
  * - No allData - server handles everything
448
515
  */
449
- declare class CTreeServerDataProvider extends ADataProvider {
516
+ declare class CTreeServerDataProvider<TRow = TDataRow> extends ADataProvider<TRow> implements ITreeDataProvider<TRow> {
450
517
  parentKey: string;
451
518
  idKey: string;
452
519
  expandedByDefault: boolean;
453
520
  paginateBy: TreePaginationMode;
454
521
  expandedNodes: Set<string | number>;
455
- pageDataHandler: TTreePageDataHandler | null;
522
+ pageDataHandler: TTreePageDataHandler<TRow> | null;
456
523
  contextKey: string;
457
524
  constructor(options?: ITreeDataProviderOptions);
458
525
  setContextKey(key: string): void;
459
- setPageDataHandler(handler: TTreePageDataHandler): Promise<void>;
526
+ setPageDataHandler(handler: TTreePageDataHandler<TRow>): Promise<void>;
460
527
  private latestRequestId;
461
528
  private abortController;
462
529
  /**
@@ -483,12 +550,14 @@ declare class CTreeServerDataProvider extends ADataProvider {
483
550
  * - Request management (caching, deduplication)
484
551
  * - Automatic tree parameter serialization in query
485
552
  */
486
- declare class CAPITreeServerDataProvider extends CTreeServerDataProvider implements AAPIDataProvider {
553
+ declare class CAPITreeServerDataProvider<TRow = TDataRow> extends CTreeServerDataProvider<TRow> implements AAPIDataProvider {
487
554
  apiUrl: string;
488
555
  requestProvider: RequestProvider;
489
556
  cacheStrategy: ECacheStrategy | null;
490
557
  cacheLifetime: number;
491
558
  refreshOnMutation: boolean | undefined;
559
+ /** Incremented on every new request; stale onDataReceived callbacks are discarded. */
560
+ private _requestGeneration;
492
561
  constructor(options?: ITreeDataProviderOptions);
493
562
  refresh(hardRefresh?: boolean): Promise<void>;
494
563
  refreshData(options?: {
@@ -525,6 +594,7 @@ declare class KatluxIndexedDB {
525
594
  * Safe to call multiple times — always resolves to the same instance.
526
595
  */
527
596
  static open(): Promise<IDBDatabase>;
597
+ private static upgradeToVersion;
528
598
  /**
529
599
  * Dynamically ensures that an object store exists in the database.
530
600
  * If not present, performs a database version bump and creates the store.
@@ -569,15 +639,18 @@ declare class CacheProviderFactory {
569
639
  static clearInstances(): void;
570
640
  }
571
641
 
572
- declare class CSessionCache extends ACacheProvider {
642
+ declare class CServerSessionCache extends ACacheProvider {
573
643
  private static instance;
574
- static getInstance(): CSessionCache;
644
+ static getInstance(): CServerSessionCache;
575
645
  static get storage(): Map<string, Map<string, ICacheEntry<any>>>;
576
646
  static getSnapshot(): Map<string, Map<string, ICacheEntry<any>>>;
577
- private static cleanupTimer;
578
- private static initCleanupTimer;
647
+ static MAX_SERVER_SESSIONS: number;
648
+ /**
649
+ * Purges expired entries across all server sessions synchronously when the storage
650
+ * exceeds MAX_SERVER_SESSIONS. Avoids persistent background setInterval timers on Node.js/SSR.
651
+ */
652
+ static purgeExpiredServerSessions(): void;
579
653
  private sessionIdCache;
580
- private sessionId;
581
654
  private readonly SESSION_ID_KEY;
582
655
  constructor();
583
656
  /**
@@ -585,18 +658,43 @@ declare class CSessionCache extends ACacheProvider {
585
658
  */
586
659
  private generateSessionId;
587
660
  /**
588
- * Get or create sessionId
661
+ * Get or create sessionId — server-only path.
662
+ * Returns '__no_session__' sentinel when no isolatable H3 event context is available.
589
663
  */
590
664
  private getSessionId;
591
- getKeyList(nuxtApp?: any): Promise<Array<string>>;
592
- get<T>(key: string, nuxtApp?: any): Promise<T | null>;
593
- set<T>(key: string, data: T, lifetime: number, nuxtApp?: any): Promise<void>;
594
- remove(key: string, nuxtApp?: any): Promise<void>;
595
- removeByPrefix(prefix: string, nuxtApp?: any): Promise<void>;
596
- getRemainingTime(key: string, nuxtApp?: any): Promise<number | null>;
665
+ getKeyList(context?: any): Promise<Array<string>>;
666
+ get<T>(key: string, context?: any): Promise<T | null>;
667
+ set<T>(key: string, data: T, lifetime: number, context?: any): Promise<void>;
668
+ remove(key: string, context?: any): Promise<void>;
669
+ removeByPrefix(prefix: string, context?: any): Promise<void>;
670
+ getRemainingTime(key: string, context?: any): Promise<number | null>;
597
671
  cleanupExpired(): Promise<void>;
598
672
  }
599
673
 
674
+ /**
675
+ * CBrowserSessionCache — client-side tab-lifetime cache backed by window.sessionStorage.
676
+ *
677
+ * - Server-side: all write operations store only into the SSR context payload for hydration
678
+ * transfer to the client. No server memory is allocated.
679
+ * - Client-side: reads and writes use window.sessionStorage exclusively.
680
+ * - Hydration: on the first client-side get() miss, checks the SSR payload and promotes
681
+ * the entry into sessionStorage for subsequent reads.
682
+ *
683
+ * Storage key prefix: 'bscache:' (distinct from the server session 'cache:' prefix)
684
+ */
685
+ declare class CBrowserSessionCache extends ACacheProvider {
686
+ private static instance;
687
+ static getInstance(): CBrowserSessionCache;
688
+ private readonly PREFIX;
689
+ getKeyList(_context?: any): Promise<string[]>;
690
+ get<T>(key: string, context?: any): Promise<T | null>;
691
+ set<T>(key: string, data: T, lifetime: number, context?: any): Promise<void>;
692
+ remove(key: string, _context?: any): Promise<void>;
693
+ removeByPrefix(prefix: string, _context?: any): Promise<void>;
694
+ getRemainingTime(key: string, _context?: any): Promise<number | null>;
695
+ cleanupExpired(_context?: any): Promise<void>;
696
+ }
697
+
600
698
  declare class CCookieCache extends ACacheProvider {
601
699
  private static instance;
602
700
  static getInstance(): CCookieCache;
@@ -605,12 +703,12 @@ declare class CCookieCache extends ACacheProvider {
605
703
  private getCookieKey;
606
704
  private parseKeyFromCookieName;
607
705
  private isClient;
608
- getKeyList(nuxtApp?: any): Promise<Array<string>>;
609
- get<T>(key: string, nuxtApp?: any): Promise<T | null>;
610
- set<T>(key: string, data: T, lifetime: number, nuxtApp?: any): Promise<void>;
611
- remove(key: string, nuxtApp?: any): Promise<void>;
612
- removeByPrefix(prefix: string, nuxtApp?: any): Promise<void>;
613
- getRemainingTime(key: string, nuxtApp?: any): Promise<number | null>;
706
+ getKeyList(context?: any): Promise<Array<string>>;
707
+ get<T>(key: string, context?: any): Promise<T | null>;
708
+ set<T>(key: string, data: T, lifetime: number, context?: any): Promise<void>;
709
+ remove(key: string, context?: any): Promise<void>;
710
+ removeByPrefix(prefix: string, context?: any): Promise<void>;
711
+ getRemainingTime(key: string, context?: any): Promise<number | null>;
614
712
  cleanupExpired(): Promise<void>;
615
713
  }
616
714
 
@@ -620,27 +718,29 @@ declare class CLocalStorageCache extends ACacheProvider {
620
718
  type: string;
621
719
  private constructor();
622
720
  private _hydrateFromPayload;
623
- getKeyList(nuxtApp?: any): Promise<Array<string>>;
624
- get<T>(key: string, nuxtApp?: any): Promise<T | null>;
625
- set<T>(key: string, data: T, lifetime: number, nuxtApp?: any): Promise<void>;
626
- remove(key: string, nuxtApp?: any): Promise<void>;
627
- removeByPrefix(prefix: string, nuxtApp?: any): Promise<void>;
628
- getRemainingTime(key: string, nuxtApp?: any): Promise<number | null>;
721
+ getKeyList(context?: any): Promise<Array<string>>;
722
+ get<T>(key: string, context?: any): Promise<T | null>;
723
+ set<T>(key: string, data: T, lifetime: number, context?: any): Promise<void>;
724
+ remove(key: string, context?: any): Promise<void>;
725
+ removeByPrefix(prefix: string, context?: any): Promise<void>;
726
+ getRemainingTime(key: string, context?: any): Promise<number | null>;
629
727
  cleanupExpired(): Promise<void>;
630
728
  }
631
729
 
632
730
  declare class CIndexedDBCache extends ACacheProvider {
633
731
  private static instance;
634
- static getInstance(): CIndexedDBCache;
635
- private constructor();
732
+ private static instances;
733
+ readonly storeName: string;
734
+ static getInstance(storeName?: string): CIndexedDBCache;
735
+ constructor(storeName?: string);
636
736
  private _hydrateFromPayload;
637
737
  private getStore;
638
- getKeyList(nuxtApp?: any): Promise<Array<string>>;
639
- get<T>(key: string, nuxtApp?: any): Promise<T | null>;
640
- set<T>(key: string, data: T, lifetime: number, nuxtApp?: any): Promise<void>;
641
- remove(key: string, nuxtApp?: any): Promise<void>;
642
- removeByPrefix(prefix: string, nuxtApp?: any): Promise<void>;
643
- getRemainingTime(key: string, nuxtApp?: any): Promise<number | null>;
738
+ getKeyList(context?: any): Promise<Array<string>>;
739
+ get<T>(key: string, context?: any): Promise<T | null>;
740
+ set<T>(key: string, data: T, lifetime: number, context?: any): Promise<void>;
741
+ remove(key: string, context?: any): Promise<void>;
742
+ removeByPrefix(prefix: string, context?: any): Promise<void>;
743
+ getRemainingTime(key: string, context?: any): Promise<number | null>;
644
744
  cleanupExpired(): Promise<void>;
645
745
  }
646
746
 
@@ -651,12 +751,13 @@ declare class CMemoryCache extends ACacheProvider {
651
751
  static getInstance(): CMemoryCache;
652
752
  private constructor();
653
753
  private _hydrateFromPayload;
654
- getKeyList(nuxtApp?: any): Promise<Array<string>>;
655
- get<T>(key: string, nuxtApp?: any): Promise<T | null>;
656
- set<T>(key: string, data: T, lifetime: number, nuxtApp?: any): Promise<void>;
657
- remove(key: string, nuxtApp?: any): Promise<void>;
658
- removeByPrefix(prefix: string, nuxtApp?: any): Promise<void>;
659
- getRemainingTime(key: string, nuxtApp?: any): Promise<number | null>;
754
+ getKeyList(context?: any): Promise<Array<string>>;
755
+ get<T>(key: string, context?: any): Promise<T | null>;
756
+ private isServer;
757
+ set<T>(key: string, data: T, lifetime: number, context?: any): Promise<void>;
758
+ remove(key: string, context?: any): Promise<void>;
759
+ removeByPrefix(prefix: string, context?: any): Promise<void>;
760
+ getRemainingTime(key: string, context?: any): Promise<number | null>;
660
761
  cleanupExpired(): Promise<void>;
661
762
  }
662
763
 
@@ -665,15 +766,26 @@ declare class CApplicationCache extends ACacheProvider {
665
766
  private static _storage;
666
767
  private static get storage();
667
768
  static getInstance(): CApplicationCache;
769
+ static readonly MAX_ENTRIES = 10000;
668
770
  static getSnapshot(): Map<string, ICacheEntry<any>>;
771
+ /**
772
+ * Purges expired entries when storage size reaches MAX_ENTRIES watermark.
773
+ * Avoids persistent background setInterval timers on Node.js/SSR.
774
+ */
775
+ static purgeExpiredEntries(): void;
776
+ /**
777
+ * Clears all cached entries (used for test isolation).
778
+ */
779
+ static clear(): void;
669
780
  private constructor();
670
- getKeyList(nuxtApp?: any): Promise<Array<string>>;
671
- get<T>(key: string, nuxtApp?: any): Promise<T | null>;
672
- set<T>(key: string, data: T, lifetime: number, nuxtApp?: any): Promise<void>;
673
- remove(key: string, nuxtApp?: any): Promise<void>;
674
- removeByPrefix(prefix: string, nuxtApp?: any): Promise<void>;
675
- getRemainingTime(key: string, nuxtApp?: any): Promise<number | null>;
676
- cleanupExpired(): Promise<void>;
781
+ private isServer;
782
+ getKeyList(context?: any): Promise<Array<string>>;
783
+ get<T>(key: string, context?: any): Promise<T | null>;
784
+ set<T>(key: string, data: T, lifetime: number, context?: any): Promise<void>;
785
+ remove(key: string, context?: any): Promise<void>;
786
+ removeByPrefix(prefix: string, context?: any): Promise<void>;
787
+ getRemainingTime(key: string, context?: any): Promise<number | null>;
788
+ cleanupExpired(context?: any): Promise<void>;
677
789
  }
678
790
 
679
791
  interface IRegistryEntry {
@@ -707,6 +819,8 @@ declare class RequestProviderRegistry {
707
819
  /**
708
820
  * Register a provider with one or more tags.
709
821
  * If the provider is already registered, its tags are updated.
822
+ * In SSR (Node.js), registration is skipped to prevent process-global memory leaks
823
+ * and cross-user multi-tenant invalidation.
710
824
  */
711
825
  static register(provider: RequestProvider, tags: string[]): void;
712
826
  /**
@@ -738,6 +852,7 @@ declare class RequestProviderRegistry {
738
852
  static clear(): void;
739
853
  }
740
854
 
855
+ declare const SENSITIVE_HEADER_KEYS: string[];
741
856
  /**
742
857
  * RequestQueue
743
858
  *
@@ -766,11 +881,25 @@ declare class RequestQueue {
766
881
  static queue: IQueuedOperation[];
767
882
  static deadLetterQueue: IDeadLetterItem[];
768
883
  static isFlushing: boolean;
884
+ private static MAX_PAYLOAD_SIZE_BYTES;
885
+ private static MAX_QUEUE_SIZE;
886
+ private static MAX_DEAD_LETTER_SIZE;
887
+ static setMaxPayloadSize(bytes: number): void;
888
+ static setMaxQueueSize(limit: number): void;
889
+ static setMaxDeadLetterSize(limit: number): void;
890
+ /**
891
+ * Strips sensitive headers (e.g., authorization, cookie, x-csrf-token) before persisting
892
+ * request options to persistent storage (IndexedDB / LocalStorage).
893
+ * Sensitive credentials must never be stored in plaintext in browser storage, and are
894
+ * instead regenerated dynamically at execution time.
895
+ */
896
+ private static sanitizeOptions;
769
897
  private static _subscribers;
770
898
  static subscribe(listener: () => void): () => void;
771
899
  static notify(): void;
772
900
  private static adapter;
773
901
  private static initialized;
902
+ private static initPromise;
774
903
  private static _onDeadLetter;
775
904
  private static _onFlushComplete;
776
905
  private static _onNetworkError;
@@ -820,6 +949,7 @@ declare class RequestQueue {
820
949
  * Fully permissive — causal ordering is the app's responsibility.
821
950
  */
822
951
  static reorder(ids: string[]): void;
952
+ private static regenerateHeaders;
823
953
  private static executeRequest;
824
954
  private static moveToDeadLetter;
825
955
  private static persistQueue;
@@ -895,11 +1025,12 @@ declare const useSortLogic: () => {
895
1025
  sortData: (sortList: IDataSort[], rows: TDataRow[]) => TDataRow[];
896
1026
  };
897
1027
 
898
- /**
899
- * Universal debounce utility
900
- */
901
- declare const useDebounce: <T extends (...args: any[]) => any>(callback: T, delay: number) => ((...args: Parameters<T>) => void);
902
- declare const debounce: <T extends (...args: any[]) => any>(callback: T, delay: number) => ((...args: Parameters<T>) => void);
1028
+ interface IDebouncedFunction<T extends (...args: any[]) => any> {
1029
+ (...args: Parameters<T>): void;
1030
+ cancel: () => void;
1031
+ }
1032
+ declare const useDebounce: <T extends (...args: any[]) => any>(callback: T, delay: number) => IDebouncedFunction<T>;
1033
+ declare const debounce: <T extends (...args: any[]) => any>(callback: T, delay: number) => IDebouncedFunction<T>;
903
1034
 
904
1035
  /**
905
1036
  * defaultAdapter.ts — Framework-agnostic default implementation of ISSRHydrationAdapter.
@@ -913,19 +1044,6 @@ declare class DefaultHydrationAdapter implements ISSRHydrationAdapter {
913
1044
  getSSRPayload(context?: any): Record<string, any> | null;
914
1045
  }
915
1046
 
916
- /**
917
- * nuxtAdapter.ts — Nuxt 3 implementation of ISSRHydrationAdapter.
918
- * Bridges to Nuxt 3's useNuxtData, useAsyncData, and useNuxtApp when running in Nuxt.
919
- */
920
-
921
- declare class NuxtHydrationAdapter implements ISSRHydrationAdapter {
922
- private fallback;
923
- getSSRData<T>(key: string, context?: any): T | null;
924
- fetchWithSSR<T>(key: string, fetcher: () => Promise<T>, context?: any): Promise<T | null>;
925
- clearSSRData(key: string, context?: any): void;
926
- getSSRPayload(context?: any): Record<string, any> | null;
927
- }
928
-
929
1047
  /**
930
1048
  * index.ts — Framework-agnostic hydration and platform bridge.
931
1049
  * Provides unified, safe methods for SSR hydration, routing, and lifecycle hooks.
@@ -969,5 +1087,5 @@ declare function getAppRouter(): any;
969
1087
  */
970
1088
  declare function onPlatformReady(cb: () => void): void;
971
1089
 
972
- export { AAPIDataProvider, ADataProvider, CAPIFlatClientDataProvider, CAPIFlatServerDataProvider, CAPITreeClientDataProvider, CAPITreeServerDataProvider, CApplicationCache, CCookieCache, CFlatClientDataProvider, CFlatServerDataProvider, CIndexedDBCache, CLocalStorageCache, CMemoryCache, CSessionCache, CTreeClientDataProvider, CTreeServerDataProvider, CacheProviderFactory, DefaultHydrationAdapter, ECacheStrategy, EDataFilterOperator, EQueueStorage, KatluxIndexedDB, NuxtHydrationAdapter, QueueStorageFactory, RequestProvider, RequestProviderRegistry, RequestQueue, applyOperator, clearSSRData, compareAnd, compareEqual, compareIn, compareOr, compareValues, debounce, evaluateFilter, fetchWithSSR, filterData, filterTreeData, getAppRoute, getAppRouter, getHydrationAdapter, getPlatformApp, getSSRData, getSSRPayload, onPlatformReady, setHydrationAdapter, sortData, useDebounce, useFilterLogic, useSortLogic };
973
- export type { CacheDriverLoader, ICacheEntry, IDataFilter, IDataProviderOptions, IDataResult, IDataSort, IDeadLetterItem, IFlushOptions, IKDatatableAction, IPlatformRouter, IQueueStorageAdapter, IQueuedOperation, IRequestOptions, ISSRHydrationAdapter, ITreeDataProviderOptions, ITreeNode, ITreeNodeStatic, KProductItemData, KProductRowAction, TDataProviderListener, TDataRow, TKatluxStore, TPageDataHandler, TQueueItemStatus, TTreePageDataHandler, TUnsubscribe, TreePaginationMode };
1090
+ export { AAPIDataProvider, ADataProvider, CAPIFlatClientDataProvider, CAPIFlatServerDataProvider, CAPITreeClientDataProvider, CAPITreeServerDataProvider, CApplicationCache, CBrowserSessionCache, CCookieCache, CFlatClientDataProvider, CFlatServerDataProvider, CIndexedDBCache, CLocalStorageCache, CMemoryCache, CServerSessionCache, CTreeClientDataProvider, CTreeServerDataProvider, CacheProviderFactory, DefaultHydrationAdapter, ECacheStrategy, EDataFilterOperator, EQueueStorage, KatluxIndexedDB, QueueStorageFactory, RequestProvider, RequestProviderRegistry, RequestQueue, SENSITIVE_HEADER_KEYS, applyOperator, clearSSRData, compareAnd, compareEqual, compareIn, compareOr, compareValues, debounce, evaluateFilter, fetchWithSSR, filterData, filterTreeData, getAppRoute, getAppRouter, getHydrationAdapter, getPlatformApp, getSSRData, getSSRPayload, onPlatformReady, setHydrationAdapter, sortData, useDebounce, useFilterLogic, useSortLogic };
1091
+ export type { CacheDriverLoader, ICacheEntry, IDataFilter, IDataProviderOptions, IDataResult, IDataSort, IDeadLetterItem, IDebouncedFunction, IFlushOptions, IKDatatableAction, IPlatformRouter, IQueueStorageAdapter, IQueuedOperation, IRequestOptions, ISSRHydrationAdapter, ITreeDataProvider, ITreeDataProviderOptions, ITreeNode, ITreeNodeStatic, KProductItemData, KProductRowAction, TDataProviderListener, TDataRow, TKatluxStore, TPageDataHandler, TQueueItemStatus, TTreePageDataHandler, TTreeRow, TUnsubscribe, TreePaginationMode };