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

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
@@ -69,14 +69,13 @@ interface IRequestOptions {
69
69
  query?: Record<string, any>;
70
70
  deduplicate?: boolean;
71
71
  context?: any;
72
- /** @deprecated Use `context` instead */
73
- nuxtApp?: any;
74
72
  disableCache?: boolean;
75
73
  queue?: boolean;
76
74
  queueLabel?: string;
77
75
  label?: string;
78
76
  tags?: string[];
79
77
  signal?: AbortSignal;
78
+ _generation?: number;
80
79
  }
81
80
  /** Queue persistence backend with automatic fallback: IndexedDB → LocalStorage → Memory */
82
81
  declare enum EQueueStorage {
@@ -122,19 +121,20 @@ type TDataRow = {
122
121
  interface IDataFilter {
123
122
  operator: EDataFilterOperator;
124
123
  field: TDataRow | IDataFilter[];
125
- active: Boolean;
124
+ active: boolean;
126
125
  }
127
126
  interface IDataSort {
128
127
  field: string;
129
128
  direction: 'asc' | 'desc';
130
129
  }
131
- interface IDataResult {
130
+ interface IDataResult<TRow = TDataRow> {
132
131
  rowCount: number;
133
- rows: TDataRow[];
132
+ rows: TRow[];
134
133
  }
135
- type TPageDataHandler = (currentPage: number, pageSize: number, filter: IDataFilter, sortList: IDataSort[], options?: {
134
+ type TPageDataHandler<TRow = TDataRow> = (currentPage: number, pageSize: number, filter: IDataFilter, sortList: IDataSort[], options?: {
136
135
  disableCache?: boolean;
137
- }) => IDataResult | Promise<IDataResult>;
136
+ signal?: AbortSignal;
137
+ }) => IDataResult<TRow> | Promise<IDataResult<TRow>>;
138
138
  interface IDataProviderOptions {
139
139
  idKey?: string;
140
140
  filter?: IDataFilter;
@@ -147,29 +147,54 @@ interface IDataProviderOptions {
147
147
  cacheLifetime?: number;
148
148
  deduplicate?: boolean;
149
149
  context?: any;
150
- /** @deprecated Use `context` instead for framework-agnostic SSR context */
151
- nuxtApp?: any;
150
+ contextKey?: string;
152
151
  urlPageParam?: string;
153
152
  refreshOnMutation?: boolean;
154
153
  }
155
154
 
156
- interface ITreeNode {
157
- data: TDataRow;
155
+ interface ITreeNode<TRow = TDataRow> {
156
+ data: TRow;
158
157
  id: string | number;
159
158
  parentId: string | number | null;
160
159
  depth: number;
161
160
  hasChildren: boolean;
162
161
  isExpanded: boolean;
163
162
  }
164
- interface ITreeNodeStatic {
165
- data: TDataRow;
163
+ interface ITreeNodeStatic<TRow = TDataRow> {
164
+ data: TRow;
166
165
  id: string | number;
167
166
  parentId: string | number | null;
168
167
  depth: number;
169
168
  hasChildren: boolean;
170
169
  childIds?: (string | number)[];
171
170
  }
171
+ /**
172
+ * A row enriched with tree metadata by a tree data provider
173
+ */
174
+ type TTreeRow<TRow = TDataRow> = TRow & {
175
+ id?: string | number;
176
+ __treeNode?: ITreeNode<TRow>;
177
+ depth?: number;
178
+ hasChildren?: boolean;
179
+ isExpanded?: boolean;
180
+ parentId?: string | number | null;
181
+ };
172
182
  type TreePaginationMode = 'all' | 'root';
183
+ /**
184
+ * Interface describing a DataProvider with hierarchical tree capabilities
185
+ */
186
+ interface ITreeDataProvider<TRow = TDataRow> {
187
+ toggleNode(id: string | number): void;
188
+ expandedNodes: Set<string | number> | {
189
+ value: Set<string | number>;
190
+ };
191
+ parentKey?: string;
192
+ expandedByDefault?: boolean;
193
+ paginateBy?: TreePaginationMode;
194
+ collapseAll?(): void;
195
+ expandAll?(): void;
196
+ isExpanded?(id: string | number): boolean;
197
+ }
173
198
  interface ITreeDataProviderOptions extends IDataProviderOptions {
174
199
  parentKey?: string;
175
200
  idKey?: string;
@@ -180,7 +205,7 @@ interface ITreeDataProviderOptions extends IDataProviderOptions {
180
205
  * Tree-specific page data handler that includes tree parameters
181
206
  * Server handles tree building, visibility, and pagination
182
207
  */
183
- type TTreePageDataHandler = (currentPage: number, pageSize: number, filter: IDataFilter, sortList: IDataSort[], treeParams: {
208
+ type TTreePageDataHandler<TRow = TDataRow> = (currentPage: number, pageSize: number, filter: IDataFilter, sortList: IDataSort[], treeParams: {
184
209
  expandedNodes: (string | number)[] | Set<string | number>;
185
210
  parentKey: string;
186
211
  idKey: string;
@@ -188,7 +213,7 @@ type TTreePageDataHandler = (currentPage: number, pageSize: number, filter: IDat
188
213
  expandedByDefault: boolean;
189
214
  }, options?: {
190
215
  disableCache?: boolean;
191
- }) => IDataResult | Promise<IDataResult>;
216
+ }) => IDataResult<TRow> | Promise<IDataResult<TRow>>;
192
217
  interface KProductItemData {
193
218
  id: string | number;
194
219
  title: string;
@@ -205,21 +230,31 @@ interface KProductRowAction {
205
230
  color?: 'primary' | 'danger' | 'success' | 'warning' | 'info' | 'light' | 'dark' | 'default';
206
231
  }
207
232
 
208
- declare abstract class ADataProvider {
233
+ declare abstract class ADataProvider<TRow = TDataRow> {
209
234
  idKey: string;
210
- pageData: TDataRow[];
211
- rowCount: number;
212
- loading: boolean;
213
- initialLoad: boolean;
214
- error: any;
235
+ pageData: TRow[];
236
+ protected _rowCount: number;
237
+ get rowCount(): number;
238
+ set rowCount(val: number);
239
+ protected _loading: boolean;
240
+ get loading(): boolean;
241
+ set loading(val: boolean);
242
+ protected _initialLoad: boolean;
243
+ get initialLoad(): boolean;
244
+ set initialLoad(val: boolean);
245
+ protected _error: any;
246
+ get error(): any;
247
+ set error(val: any);
215
248
  SSR: boolean;
216
249
  deduplicate: boolean;
217
250
  context: any;
218
- get nuxtApp(): any;
219
- set nuxtApp(val: any);
220
251
  urlPageParam: string;
221
- selectedRows: any[];
222
- selectAll: boolean;
252
+ protected _selectedRows: TRow[];
253
+ get selectedRows(): TRow[];
254
+ set selectedRows(val: TRow[]);
255
+ protected _selectAll: boolean;
256
+ get selectAll(): boolean;
257
+ set selectAll(val: boolean);
223
258
  protected _currentPage: number;
224
259
  protected _pageSize: number;
225
260
  protected _filter: IDataFilter | null;
@@ -234,11 +269,19 @@ declare abstract class ADataProvider {
234
269
  set sortList(s: IDataSort[]);
235
270
  private _listeners;
236
271
  private _debouncedFilterLoad;
272
+ private _debouncedSortLoad;
237
273
  constructor(options?: IDataProviderOptions);
274
+ private _batchDepth;
275
+ private _pendingNotify;
276
+ private _isNotifying;
277
+ /**
278
+ * Batches multiple state updates so notify() fires exactly once upon completion.
279
+ */
280
+ batchUpdates<R>(fn: () => R): R;
238
281
  subscribe(listener: TDataProviderListener<this>): TUnsubscribe;
239
282
  notify(): void;
240
283
  getState(): {
241
- pageData: TDataRow[];
284
+ pageData: TRow[];
242
285
  rowCount: number;
243
286
  currentPage: number;
244
287
  pageSize: number;
@@ -247,27 +290,28 @@ declare abstract class ADataProvider {
247
290
  error: any;
248
291
  filter: IDataFilter | null;
249
292
  sortList: IDataSort[];
250
- selectedRows: any[];
293
+ selectedRows: TRow[];
251
294
  selectAll: boolean;
252
295
  };
253
296
  setFilter(filter: IDataFilter | null): void;
254
- setSortList(sortList: IDataSort[]): void;
297
+ setSortList(sortList: IDataSort[], immediate?: boolean): void;
255
298
  setCurrentPage(currentPage: number): void;
256
299
  setPageSize(pageSize: number): void;
257
- setSelectedRows(rows: any[]): void;
300
+ setSelectedRows(rows: TRow[]): void;
258
301
  setSelectAll(val: boolean): void;
259
302
  abstract loadPageData(options?: {
260
303
  disableCache?: boolean;
261
304
  signal?: AbortSignal;
262
305
  }): void | Promise<void>;
263
306
  refresh(hardRefresh?: boolean): Promise<void>;
307
+ cancelPending(): void;
264
308
  }
265
309
 
266
- declare class CFlatClientDataProvider extends ADataProvider {
267
- allData: TDataRow[];
268
- filteredData: TDataRow[];
310
+ declare class CFlatClientDataProvider<TRow = TDataRow> extends ADataProvider<TRow> {
311
+ allData: TRow[];
312
+ filteredData: TRow[];
269
313
  constructor(options?: IDataProviderOptions);
270
- setData(data: TDataRow[]): void;
314
+ setData(data: TRow[]): void;
271
315
  refreshData(options?: {
272
316
  disableCache?: boolean;
273
317
  }): Promise<void>;
@@ -277,12 +321,12 @@ declare class CFlatClientDataProvider extends ADataProvider {
277
321
 
278
322
  declare abstract class ACacheProvider {
279
323
  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>;
324
+ abstract getKeyList(context?: any): Array<string> | Promise<Array<string>>;
325
+ abstract get<T>(key: string, context?: any): Promise<T | null>;
326
+ abstract set<T>(key: string, data: T, lifetime: number, context?: any): Promise<void>;
327
+ abstract remove(key: string, context?: any): Promise<void>;
328
+ abstract removeByPrefix(prefix: string, context?: any): Promise<void>;
329
+ abstract getRemainingTime(key: string, context?: any): Promise<number | null>;
286
330
  abstract cleanupExpired(): Promise<void>;
287
331
  }
288
332
 
@@ -306,12 +350,16 @@ declare class RequestProvider {
306
350
  setCacheProvider(provider?: ACacheProvider | ECacheStrategy): void;
307
351
  setCacheLifetime(lifetime: number): void;
308
352
  setDeduplicate(deduplicate: boolean): void;
309
- onDataReceived(callback: (data: any) => void): void;
353
+ onDataReceived(callback: (data: any, generation?: number) => void): void;
354
+ private invokeDataReceivedCallback;
310
355
  hasLastUrl(): boolean;
311
356
  refresh(hardRefresh?: boolean): Promise<any>;
357
+ private resolveContext;
358
+ private getInFlightMap;
312
359
  private getUniqueKey;
313
360
  registerRequest<T>(url: string, options?: IRequestOptions): Promise<T>;
314
361
  static executeAll(): void;
362
+ private isSameOriginUrl;
315
363
  request<T>(url: string, options?: IRequestOptions): Promise<T>;
316
364
  }
317
365
 
@@ -328,7 +376,7 @@ declare abstract class AAPIDataProvider {
328
376
  abstract delete(items: any[]): Promise<void>;
329
377
  }
330
378
 
331
- declare class CAPIFlatClientDataProvider extends CFlatClientDataProvider implements AAPIDataProvider {
379
+ declare class CAPIFlatClientDataProvider<TRow = TDataRow> extends CFlatClientDataProvider<TRow> implements AAPIDataProvider {
332
380
  apiUrl: string;
333
381
  contextKey: string;
334
382
  requestProvider: RequestProvider;
@@ -337,25 +385,25 @@ declare class CAPIFlatClientDataProvider extends CFlatClientDataProvider impleme
337
385
  refreshOnMutation: boolean | undefined;
338
386
  constructor(options?: IDataProviderOptions);
339
387
  setContextKey(key: string): void;
340
- refresh(hardRefresh?: boolean): Promise<void>;
388
+ setCacheStrategy(strategy: ECacheStrategy): void;
389
+ setCacheLifetime(lifetime: number): void;
341
390
  refreshData(options?: {
342
391
  disableCache?: boolean;
343
392
  }): Promise<void>;
344
- private _initialFetch;
345
393
  setAPIUrl(url: string): Promise<void>;
346
394
  create(item: any): Promise<void>;
347
395
  update(item: any): Promise<void>;
348
396
  delete(items: any[]): Promise<void>;
349
397
  }
350
398
 
351
- declare class CFlatServerDataProvider extends ADataProvider {
352
- pageDataHandler: TPageDataHandler;
399
+ declare class CFlatServerDataProvider<TRow = TDataRow> extends ADataProvider<TRow> {
400
+ pageDataHandler: TPageDataHandler<TRow>;
353
401
  contextKey: string;
354
402
  private latestRequestId;
355
403
  private abortController;
356
404
  constructor(options?: IDataProviderOptions);
357
405
  setContextKey(key: string): void;
358
- setPageDataHandler(handler: TPageDataHandler): Promise<void>;
406
+ setPageDataHandler(handler: TPageDataHandler<TRow>): Promise<void>;
359
407
  loadPageData(options?: {
360
408
  disableCache?: boolean;
361
409
  signal?: AbortSignal;
@@ -363,12 +411,14 @@ declare class CFlatServerDataProvider extends ADataProvider {
363
411
  refresh(hardRefresh?: boolean): Promise<void>;
364
412
  }
365
413
 
366
- declare class CAPIFlatServerDataProvider extends CFlatServerDataProvider implements AAPIDataProvider {
414
+ declare class CAPIFlatServerDataProvider<TRow = TDataRow> extends CFlatServerDataProvider<TRow> implements AAPIDataProvider {
367
415
  apiUrl: string;
368
416
  requestProvider: RequestProvider;
369
417
  cacheStrategy: ECacheStrategy | null;
370
418
  cacheLifetime: number;
371
419
  refreshOnMutation: boolean | undefined;
420
+ /** Incremented on every new request; stale onDataReceived callbacks are discarded. */
421
+ private _requestGeneration;
372
422
  constructor(options?: IDataProviderOptions);
373
423
  refresh(hardRefresh?: boolean): Promise<void>;
374
424
  refreshData(options?: {
@@ -380,7 +430,7 @@ declare class CAPIFlatServerDataProvider extends CFlatServerDataProvider impleme
380
430
  update(item: any): Promise<void>;
381
431
  }
382
432
 
383
- declare class CTreeClientDataProvider extends CFlatClientDataProvider {
433
+ declare class CTreeClientDataProvider<TRow extends TDataRow = TDataRow> extends CFlatClientDataProvider<TRow> implements ITreeDataProvider<TRow> {
384
434
  parentKey: string;
385
435
  idKey: string;
386
436
  expandedByDefault: boolean;
@@ -394,17 +444,17 @@ declare class CTreeClientDataProvider extends CFlatClientDataProvider {
394
444
  private get _nodeMap();
395
445
  private get _sortedNodeIds();
396
446
  constructor(options?: ITreeDataProviderOptions);
397
- setData(data: TDataRow[]): void;
447
+ setData(data: TRow[]): void;
398
448
  private buildStaticNodes;
399
449
  private computeSortedIds;
400
450
  private isNodeVisible;
401
451
  private paginateNodes;
402
452
  private updatePageData;
403
453
  loadPageData(): Promise<void>;
404
- get treeNodes(): ITreeNode[];
405
- get visibleRows(): ITreeNode[];
406
- getAllNodes(): ITreeNode[];
407
- getFlatNodes(): ITreeNode[];
454
+ get treeNodes(): ITreeNode<TRow>[];
455
+ get visibleRows(): ITreeNode<TRow>[];
456
+ getAllNodes(): ITreeNode<TRow>[];
457
+ getFlatNodes(): ITreeNode<TRow>[];
408
458
  toggleNode(nodeId: string | number): void;
409
459
  expand(nodeId: string | number): void;
410
460
  collapse(nodeId: string | number): void;
@@ -412,12 +462,12 @@ declare class CTreeClientDataProvider extends CFlatClientDataProvider {
412
462
  collapseNode(nodeId: string | number): void;
413
463
  expandAll(): void;
414
464
  collapseAll(): void;
415
- getNode(nodeId: string | number): ITreeNode | undefined;
416
- getChildren(nodeId: string | number): ITreeNode[];
417
- getParent(nodeId: string | number): ITreeNode | undefined;
465
+ getNode(nodeId: string | number): ITreeNode<TRow> | undefined;
466
+ getChildren(nodeId: string | number): ITreeNode<TRow>[];
467
+ getParent(nodeId: string | number): ITreeNode<TRow> | undefined;
418
468
  }
419
469
 
420
- declare class CAPITreeClientDataProvider extends CTreeClientDataProvider implements AAPIDataProvider {
470
+ declare class CAPITreeClientDataProvider<TRow extends TDataRow = TDataRow> extends CTreeClientDataProvider<TRow> implements AAPIDataProvider {
421
471
  apiUrl: string;
422
472
  contextKey: string;
423
473
  requestProvider: RequestProvider;
@@ -446,17 +496,17 @@ declare class CAPITreeClientDataProvider extends CTreeClientDataProvider impleme
446
496
  * - Server returns already-paginated visible rows with __treeNode metadata
447
497
  * - No allData - server handles everything
448
498
  */
449
- declare class CTreeServerDataProvider extends ADataProvider {
499
+ declare class CTreeServerDataProvider<TRow = TDataRow> extends ADataProvider<TRow> implements ITreeDataProvider<TRow> {
450
500
  parentKey: string;
451
501
  idKey: string;
452
502
  expandedByDefault: boolean;
453
503
  paginateBy: TreePaginationMode;
454
504
  expandedNodes: Set<string | number>;
455
- pageDataHandler: TTreePageDataHandler | null;
505
+ pageDataHandler: TTreePageDataHandler<TRow> | null;
456
506
  contextKey: string;
457
507
  constructor(options?: ITreeDataProviderOptions);
458
508
  setContextKey(key: string): void;
459
- setPageDataHandler(handler: TTreePageDataHandler): Promise<void>;
509
+ setPageDataHandler(handler: TTreePageDataHandler<TRow>): Promise<void>;
460
510
  private latestRequestId;
461
511
  private abortController;
462
512
  /**
@@ -483,12 +533,14 @@ declare class CTreeServerDataProvider extends ADataProvider {
483
533
  * - Request management (caching, deduplication)
484
534
  * - Automatic tree parameter serialization in query
485
535
  */
486
- declare class CAPITreeServerDataProvider extends CTreeServerDataProvider implements AAPIDataProvider {
536
+ declare class CAPITreeServerDataProvider<TRow = TDataRow> extends CTreeServerDataProvider<TRow> implements AAPIDataProvider {
487
537
  apiUrl: string;
488
538
  requestProvider: RequestProvider;
489
539
  cacheStrategy: ECacheStrategy | null;
490
540
  cacheLifetime: number;
491
541
  refreshOnMutation: boolean | undefined;
542
+ /** Incremented on every new request; stale onDataReceived callbacks are discarded. */
543
+ private _requestGeneration;
492
544
  constructor(options?: ITreeDataProviderOptions);
493
545
  refresh(hardRefresh?: boolean): Promise<void>;
494
546
  refreshData(options?: {
@@ -525,6 +577,7 @@ declare class KatluxIndexedDB {
525
577
  * Safe to call multiple times — always resolves to the same instance.
526
578
  */
527
579
  static open(): Promise<IDBDatabase>;
580
+ private static upgradeToVersion;
528
581
  /**
529
582
  * Dynamically ensures that an object store exists in the database.
530
583
  * If not present, performs a database version bump and creates the store.
@@ -574,8 +627,12 @@ declare class CSessionCache extends ACacheProvider {
574
627
  static getInstance(): CSessionCache;
575
628
  static get storage(): Map<string, Map<string, ICacheEntry<any>>>;
576
629
  static getSnapshot(): Map<string, Map<string, ICacheEntry<any>>>;
577
- private static cleanupTimer;
578
- private static initCleanupTimer;
630
+ static MAX_SERVER_SESSIONS: number;
631
+ /**
632
+ * Purges expired entries across all server sessions synchronously when the storage
633
+ * exceeds MAX_SERVER_SESSIONS. Avoids persistent background setInterval timers on Node.js/SSR.
634
+ */
635
+ static purgeExpiredServerSessions(): void;
579
636
  private sessionIdCache;
580
637
  private sessionId;
581
638
  private readonly SESSION_ID_KEY;
@@ -588,12 +645,12 @@ declare class CSessionCache extends ACacheProvider {
588
645
  * Get or create sessionId
589
646
  */
590
647
  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>;
648
+ getKeyList(context?: any): Promise<Array<string>>;
649
+ get<T>(key: string, context?: any): Promise<T | null>;
650
+ set<T>(key: string, data: T, lifetime: number, context?: any): Promise<void>;
651
+ remove(key: string, context?: any): Promise<void>;
652
+ removeByPrefix(prefix: string, context?: any): Promise<void>;
653
+ getRemainingTime(key: string, context?: any): Promise<number | null>;
597
654
  cleanupExpired(): Promise<void>;
598
655
  }
599
656
 
@@ -605,12 +662,12 @@ declare class CCookieCache extends ACacheProvider {
605
662
  private getCookieKey;
606
663
  private parseKeyFromCookieName;
607
664
  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>;
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>;
614
671
  cleanupExpired(): Promise<void>;
615
672
  }
616
673
 
@@ -620,27 +677,29 @@ declare class CLocalStorageCache extends ACacheProvider {
620
677
  type: string;
621
678
  private constructor();
622
679
  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>;
680
+ getKeyList(context?: any): Promise<Array<string>>;
681
+ get<T>(key: string, context?: any): Promise<T | null>;
682
+ set<T>(key: string, data: T, lifetime: number, context?: any): Promise<void>;
683
+ remove(key: string, context?: any): Promise<void>;
684
+ removeByPrefix(prefix: string, context?: any): Promise<void>;
685
+ getRemainingTime(key: string, context?: any): Promise<number | null>;
629
686
  cleanupExpired(): Promise<void>;
630
687
  }
631
688
 
632
689
  declare class CIndexedDBCache extends ACacheProvider {
633
690
  private static instance;
634
- static getInstance(): CIndexedDBCache;
635
- private constructor();
691
+ private static instances;
692
+ readonly storeName: string;
693
+ static getInstance(storeName?: string): CIndexedDBCache;
694
+ constructor(storeName?: string);
636
695
  private _hydrateFromPayload;
637
696
  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>;
697
+ getKeyList(context?: any): Promise<Array<string>>;
698
+ get<T>(key: string, context?: any): Promise<T | null>;
699
+ set<T>(key: string, data: T, lifetime: number, context?: any): Promise<void>;
700
+ remove(key: string, context?: any): Promise<void>;
701
+ removeByPrefix(prefix: string, context?: any): Promise<void>;
702
+ getRemainingTime(key: string, context?: any): Promise<number | null>;
644
703
  cleanupExpired(): Promise<void>;
645
704
  }
646
705
 
@@ -651,12 +710,13 @@ declare class CMemoryCache extends ACacheProvider {
651
710
  static getInstance(): CMemoryCache;
652
711
  private constructor();
653
712
  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>;
713
+ getKeyList(context?: any): Promise<Array<string>>;
714
+ get<T>(key: string, context?: any): Promise<T | null>;
715
+ private isServer;
716
+ set<T>(key: string, data: T, lifetime: number, context?: any): Promise<void>;
717
+ remove(key: string, context?: any): Promise<void>;
718
+ removeByPrefix(prefix: string, context?: any): Promise<void>;
719
+ getRemainingTime(key: string, context?: any): Promise<number | null>;
660
720
  cleanupExpired(): Promise<void>;
661
721
  }
662
722
 
@@ -665,15 +725,26 @@ declare class CApplicationCache extends ACacheProvider {
665
725
  private static _storage;
666
726
  private static get storage();
667
727
  static getInstance(): CApplicationCache;
728
+ static readonly MAX_ENTRIES = 10000;
668
729
  static getSnapshot(): Map<string, ICacheEntry<any>>;
730
+ /**
731
+ * Purges expired entries when storage size reaches MAX_ENTRIES watermark.
732
+ * Avoids persistent background setInterval timers on Node.js/SSR.
733
+ */
734
+ static purgeExpiredEntries(): void;
735
+ /**
736
+ * Clears all cached entries (used for test isolation).
737
+ */
738
+ static clear(): void;
669
739
  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>;
740
+ private isServer;
741
+ getKeyList(context?: any): Promise<Array<string>>;
742
+ get<T>(key: string, context?: any): Promise<T | null>;
743
+ set<T>(key: string, data: T, lifetime: number, context?: any): Promise<void>;
744
+ remove(key: string, context?: any): Promise<void>;
745
+ removeByPrefix(prefix: string, context?: any): Promise<void>;
746
+ getRemainingTime(key: string, context?: any): Promise<number | null>;
747
+ cleanupExpired(context?: any): Promise<void>;
677
748
  }
678
749
 
679
750
  interface IRegistryEntry {
@@ -707,6 +778,8 @@ declare class RequestProviderRegistry {
707
778
  /**
708
779
  * Register a provider with one or more tags.
709
780
  * If the provider is already registered, its tags are updated.
781
+ * In SSR (Node.js), registration is skipped to prevent process-global memory leaks
782
+ * and cross-user multi-tenant invalidation.
710
783
  */
711
784
  static register(provider: RequestProvider, tags: string[]): void;
712
785
  /**
@@ -738,6 +811,7 @@ declare class RequestProviderRegistry {
738
811
  static clear(): void;
739
812
  }
740
813
 
814
+ declare const SENSITIVE_HEADER_KEYS: string[];
741
815
  /**
742
816
  * RequestQueue
743
817
  *
@@ -766,11 +840,25 @@ declare class RequestQueue {
766
840
  static queue: IQueuedOperation[];
767
841
  static deadLetterQueue: IDeadLetterItem[];
768
842
  static isFlushing: boolean;
843
+ private static MAX_PAYLOAD_SIZE_BYTES;
844
+ private static MAX_QUEUE_SIZE;
845
+ private static MAX_DEAD_LETTER_SIZE;
846
+ static setMaxPayloadSize(bytes: number): void;
847
+ static setMaxQueueSize(limit: number): void;
848
+ static setMaxDeadLetterSize(limit: number): void;
849
+ /**
850
+ * Strips sensitive headers (e.g., authorization, cookie, x-csrf-token) before persisting
851
+ * request options to persistent storage (IndexedDB / LocalStorage).
852
+ * Sensitive credentials must never be stored in plaintext in browser storage, and are
853
+ * instead regenerated dynamically at execution time.
854
+ */
855
+ private static sanitizeOptions;
769
856
  private static _subscribers;
770
857
  static subscribe(listener: () => void): () => void;
771
858
  static notify(): void;
772
859
  private static adapter;
773
860
  private static initialized;
861
+ private static initPromise;
774
862
  private static _onDeadLetter;
775
863
  private static _onFlushComplete;
776
864
  private static _onNetworkError;
@@ -820,6 +908,7 @@ declare class RequestQueue {
820
908
  * Fully permissive — causal ordering is the app's responsibility.
821
909
  */
822
910
  static reorder(ids: string[]): void;
911
+ private static regenerateHeaders;
823
912
  private static executeRequest;
824
913
  private static moveToDeadLetter;
825
914
  private static persistQueue;
@@ -895,11 +984,12 @@ declare const useSortLogic: () => {
895
984
  sortData: (sortList: IDataSort[], rows: TDataRow[]) => TDataRow[];
896
985
  };
897
986
 
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);
987
+ interface IDebouncedFunction<T extends (...args: any[]) => any> {
988
+ (...args: Parameters<T>): void;
989
+ cancel: () => void;
990
+ }
991
+ declare const useDebounce: <T extends (...args: any[]) => any>(callback: T, delay: number) => IDebouncedFunction<T>;
992
+ declare const debounce: <T extends (...args: any[]) => any>(callback: T, delay: number) => IDebouncedFunction<T>;
903
993
 
904
994
  /**
905
995
  * defaultAdapter.ts — Framework-agnostic default implementation of ISSRHydrationAdapter.
@@ -913,19 +1003,6 @@ declare class DefaultHydrationAdapter implements ISSRHydrationAdapter {
913
1003
  getSSRPayload(context?: any): Record<string, any> | null;
914
1004
  }
915
1005
 
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
1006
  /**
930
1007
  * index.ts — Framework-agnostic hydration and platform bridge.
931
1008
  * Provides unified, safe methods for SSR hydration, routing, and lifecycle hooks.
@@ -969,5 +1046,5 @@ declare function getAppRouter(): any;
969
1046
  */
970
1047
  declare function onPlatformReady(cb: () => void): void;
971
1048
 
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 };
1049
+ export { AAPIDataProvider, ADataProvider, CAPIFlatClientDataProvider, CAPIFlatServerDataProvider, CAPITreeClientDataProvider, CAPITreeServerDataProvider, CApplicationCache, CCookieCache, CFlatClientDataProvider, CFlatServerDataProvider, CIndexedDBCache, CLocalStorageCache, CMemoryCache, CSessionCache, 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 };
1050
+ 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 };