@katlux/providers 0.1.1-alpha.103 → 0.1.1-alpha.105
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +4220 -301
- package/dist/index.d.cts +740 -19
- package/dist/index.d.mts +740 -19
- package/dist/index.d.ts +740 -19
- package/dist/index.mjs +4193 -302
- package/package.json +1 -1
package/dist/index.d.cts
CHANGED
|
@@ -1,3 +1,130 @@
|
|
|
1
|
+
interface IEncryptedPayload {
|
|
2
|
+
__encrypted: true;
|
|
3
|
+
ciphertext: string;
|
|
4
|
+
alg: string;
|
|
5
|
+
iv?: string;
|
|
6
|
+
salt?: string;
|
|
7
|
+
kdf?: string;
|
|
8
|
+
iter?: number;
|
|
9
|
+
tag?: string;
|
|
10
|
+
wrappedKey?: string;
|
|
11
|
+
sharedKey?: boolean;
|
|
12
|
+
epk?: JsonWebKey;
|
|
13
|
+
}
|
|
14
|
+
type TRawKey = string | CryptoKey | Uint8Array | ArrayBuffer;
|
|
15
|
+
type TKeyProvider = TRawKey | (() => TRawKey | Promise<TRawKey>);
|
|
16
|
+
interface IEncryptionContext {
|
|
17
|
+
url?: string;
|
|
18
|
+
method?: string;
|
|
19
|
+
isServer?: boolean;
|
|
20
|
+
/** Whitelist of specific field names to encrypt/decrypt (e.g. ['name', 'surname']). Any unlisted field remains plaintext. */
|
|
21
|
+
fields?: string[];
|
|
22
|
+
key?: TKeyProvider | IKeyPair;
|
|
23
|
+
/** Whether to encrypt/decrypt individual values while preserving JSON keys (default: true) */
|
|
24
|
+
valueEncryption?: boolean;
|
|
25
|
+
publicKey?: CryptoKey;
|
|
26
|
+
privateKey?: CryptoKey;
|
|
27
|
+
recipientPublicKey?: CryptoKey;
|
|
28
|
+
recipientPrivateKey?: CryptoKey;
|
|
29
|
+
curve?: 'P-256' | 'P-384' | 'P-521';
|
|
30
|
+
kdf?: 'none' | 'pbkdf2' | 'hkdf';
|
|
31
|
+
kdfSalt?: string | Uint8Array | ArrayBuffer;
|
|
32
|
+
kdfIterations?: number;
|
|
33
|
+
kdfHash?: 'SHA-256' | 'SHA-512';
|
|
34
|
+
info?: string | Uint8Array | ArrayBuffer;
|
|
35
|
+
}
|
|
36
|
+
interface IEncryptionProvider {
|
|
37
|
+
encrypt(data: any, options?: IEncryptionContext): Promise<IEncryptedPayload | any>;
|
|
38
|
+
decrypt(payload: IEncryptedPayload | any, options?: IEncryptionContext): Promise<any>;
|
|
39
|
+
warmupKey?(options?: IEncryptionContext): Promise<void>;
|
|
40
|
+
isEncrypted?(payload: any): boolean;
|
|
41
|
+
setDefaultKey?(key: TKeyProvider | IKeyPair): void;
|
|
42
|
+
clearKeys?(): void;
|
|
43
|
+
dispose?(): void;
|
|
44
|
+
[Symbol.dispose]?(): void;
|
|
45
|
+
[Symbol.asyncDispose]?(): Promise<void>;
|
|
46
|
+
}
|
|
47
|
+
interface IProviderEncryptionOptions {
|
|
48
|
+
/** Enable or disable encryption */
|
|
49
|
+
enabled?: boolean;
|
|
50
|
+
/** Secret key, passphrase, CryptoKey, key pair, or async key provider function */
|
|
51
|
+
key?: TKeyProvider | IKeyPair;
|
|
52
|
+
/**
|
|
53
|
+
* Whether decryption is permitted during Server-Side Rendering (SSR).
|
|
54
|
+
* In an End-to-End (E2E) zero-trust model, defaults to false to prevent
|
|
55
|
+
* plaintext data in server memory or SSR payloads.
|
|
56
|
+
*/
|
|
57
|
+
decryptOnSSR?: boolean;
|
|
58
|
+
/** Whether to encrypt/decrypt individual values while preserving JSON object keys (default: true) */
|
|
59
|
+
valueEncryption?: boolean;
|
|
60
|
+
/** Whether to defer row/item decryption to active page rendering in DataProviders */
|
|
61
|
+
lazy?: boolean;
|
|
62
|
+
/** Whitelist of specific field names to encrypt/decrypt (e.g. ['name', 'surname']). Any unlisted field remains plaintext. */
|
|
63
|
+
fields?: string[];
|
|
64
|
+
/** Cryptographic algorithm identifier (defaults to 'AES-GCM') */
|
|
65
|
+
algorithm?: 'AES-GCM' | string;
|
|
66
|
+
/** Whether to use synchronous Node.js crypto provider (CNodeCryptoEncryptionProvider) */
|
|
67
|
+
sync?: boolean;
|
|
68
|
+
/** Custom encryption provider instance implementing IEncryptionProvider */
|
|
69
|
+
customProvider?: IEncryptionProvider;
|
|
70
|
+
/** Key Derivation Function strategy ('none' | 'pbkdf2' | 'hkdf'). Defaults to 'pbkdf2'. */
|
|
71
|
+
kdf?: 'none' | 'pbkdf2' | 'hkdf';
|
|
72
|
+
/** Number of PBKDF2 iterations (default: 310,000 per OWASP recommendation) */
|
|
73
|
+
kdfIterations?: number;
|
|
74
|
+
/** Hash algorithm for PBKDF2 or HKDF ('SHA-256' | 'SHA-512', default: 'SHA-256') */
|
|
75
|
+
kdfHash?: 'SHA-256' | 'SHA-512';
|
|
76
|
+
/** Optional static salt for KDF. If omitted, a cryptographically secure random salt is generated and included in the envelope. */
|
|
77
|
+
kdfSalt?: string | Uint8Array | ArrayBuffer;
|
|
78
|
+
/** Optional public key for asymmetric providers */
|
|
79
|
+
publicKey?: CryptoKey;
|
|
80
|
+
/** Optional private key for asymmetric providers */
|
|
81
|
+
privateKey?: CryptoKey;
|
|
82
|
+
/** Optional recipient public key for asymmetric/hybrid encryption */
|
|
83
|
+
recipientPublicKey?: CryptoKey;
|
|
84
|
+
/** Optional recipient private key for asymmetric/hybrid decryption */
|
|
85
|
+
recipientPrivateKey?: CryptoKey;
|
|
86
|
+
/** Elliptic curve name for ECDH ('P-256' | 'P-384' | 'P-521') */
|
|
87
|
+
curve?: 'P-256' | 'P-384' | 'P-521';
|
|
88
|
+
/** Optional context/info string or buffer for HKDF key derivation */
|
|
89
|
+
info?: string | Uint8Array | ArrayBuffer;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Public and private key pair container for asymmetric / hybrid encryption providers (RSA, ECDH).
|
|
93
|
+
*/
|
|
94
|
+
interface IKeyPair {
|
|
95
|
+
publicKey: CryptoKey;
|
|
96
|
+
privateKey: CryptoKey;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Represents a key wrapped by a key-encrypting key (KEK) using AES-KW or asymmetric wrapping.
|
|
100
|
+
*/
|
|
101
|
+
interface IWrappedKey {
|
|
102
|
+
wrappedKey: string;
|
|
103
|
+
alg: string;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Options for Key Derivation Functions (PBKDF2 / HKDF) in CKeyManager and encryption providers.
|
|
107
|
+
*/
|
|
108
|
+
interface IKDFOptions {
|
|
109
|
+
kdf: 'pbkdf2' | 'hkdf';
|
|
110
|
+
salt?: Uint8Array | ArrayBuffer | string;
|
|
111
|
+
iterations?: number;
|
|
112
|
+
hash?: 'SHA-256' | 'SHA-512';
|
|
113
|
+
info?: string | Uint8Array | ArrayBuffer;
|
|
114
|
+
keyLength?: 128 | 256;
|
|
115
|
+
extractable?: boolean;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Options for deriving a key from an existing CryptoKey secret via HKDF.
|
|
119
|
+
*/
|
|
120
|
+
interface IHKDFFromSecretOptions {
|
|
121
|
+
salt?: Uint8Array | ArrayBuffer | string;
|
|
122
|
+
hash?: 'SHA-256' | 'SHA-512';
|
|
123
|
+
info?: string | Uint8Array | ArrayBuffer;
|
|
124
|
+
keyLength?: 128 | 256;
|
|
125
|
+
extractable?: boolean;
|
|
126
|
+
}
|
|
127
|
+
|
|
1
128
|
/**
|
|
2
129
|
* types.ts — Framework-agnostic hydration and platform abstraction contracts.
|
|
3
130
|
*/
|
|
@@ -58,6 +185,14 @@ interface ICacheEntry<T> {
|
|
|
58
185
|
data: T;
|
|
59
186
|
timestamp: number;
|
|
60
187
|
lifetime: number;
|
|
188
|
+
lastAccessed?: number;
|
|
189
|
+
accessCount?: number;
|
|
190
|
+
}
|
|
191
|
+
interface ICacheQuotaOptions {
|
|
192
|
+
maxEntries?: number;
|
|
193
|
+
maxSizeBytes?: number;
|
|
194
|
+
quotaThresholdRatio?: number;
|
|
195
|
+
fallbackToMemory?: boolean;
|
|
61
196
|
}
|
|
62
197
|
interface IRequestOptions {
|
|
63
198
|
method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
|
|
@@ -77,6 +212,9 @@ interface IRequestOptions {
|
|
|
77
212
|
tags?: string[];
|
|
78
213
|
signal?: AbortSignal;
|
|
79
214
|
_generation?: number;
|
|
215
|
+
encryption?: IProviderEncryptionOptions;
|
|
216
|
+
/** If true, returns raw response without decrypting, useful for DataProvider lazy page-level decryption */
|
|
217
|
+
skipDecryption?: boolean;
|
|
80
218
|
}
|
|
81
219
|
/** Queue persistence backend with automatic fallback: IndexedDB → LocalStorage → Memory */
|
|
82
220
|
declare enum EQueueStorage {
|
|
@@ -153,6 +291,32 @@ interface IDataProviderOptions {
|
|
|
153
291
|
refreshOnMutation?: boolean;
|
|
154
292
|
filterDebounce?: number;
|
|
155
293
|
sortDebounce?: number;
|
|
294
|
+
encryption?: IProviderEncryptionOptions;
|
|
295
|
+
}
|
|
296
|
+
interface IDataProviderState<TRow = TDataRow> {
|
|
297
|
+
currentPage: number;
|
|
298
|
+
pageSize: number;
|
|
299
|
+
filter: IDataFilter | null;
|
|
300
|
+
sortList: IDataSort[];
|
|
301
|
+
selectedRows: TRow[];
|
|
302
|
+
selectAll: boolean;
|
|
303
|
+
rowCount?: number;
|
|
304
|
+
loading?: boolean;
|
|
305
|
+
initialLoad?: boolean;
|
|
306
|
+
error?: any;
|
|
307
|
+
pageData?: TRow[];
|
|
308
|
+
}
|
|
309
|
+
interface IDataProviderSetStateOptions {
|
|
310
|
+
immediate?: boolean;
|
|
311
|
+
silent?: boolean;
|
|
312
|
+
}
|
|
313
|
+
type TDataProviderStateChangeListener<TRow = TDataRow> = (state: IDataProviderState<TRow>, changedKeys: Array<keyof IDataProviderState<TRow>>) => void;
|
|
314
|
+
interface IVirtualScrollState {
|
|
315
|
+
startIndex: number;
|
|
316
|
+
endIndex: number;
|
|
317
|
+
scrollTop: number;
|
|
318
|
+
totalItems: number;
|
|
319
|
+
itemHeight: number;
|
|
156
320
|
}
|
|
157
321
|
|
|
158
322
|
interface ITreeNode<TRow = TDataRow> {
|
|
@@ -197,6 +361,8 @@ interface ITreeDataProvider<TRow = TDataRow> {
|
|
|
197
361
|
collapseAll?(): void;
|
|
198
362
|
expandAll?(): void;
|
|
199
363
|
isExpanded?(id: string | number): boolean;
|
|
364
|
+
allVisibleNodes?: ITreeNode<TRow>[];
|
|
365
|
+
allVisibleRows?: (TRow & ITreeNode<TRow>)[];
|
|
200
366
|
}
|
|
201
367
|
interface ITreeDataProviderOptions extends IDataProviderOptions {
|
|
202
368
|
parentKey?: string;
|
|
@@ -216,6 +382,7 @@ type TTreePageDataHandler<TRow = TDataRow> = (currentPage: number, pageSize: num
|
|
|
216
382
|
expandedByDefault: boolean;
|
|
217
383
|
}, options?: {
|
|
218
384
|
disableCache?: boolean;
|
|
385
|
+
signal?: AbortSignal;
|
|
219
386
|
}) => IDataResult<TRow> | Promise<IDataResult<TRow>>;
|
|
220
387
|
interface KProductItemData {
|
|
221
388
|
id: string | number;
|
|
@@ -235,7 +402,9 @@ interface KProductRowAction {
|
|
|
235
402
|
|
|
236
403
|
declare abstract class ADataProvider<TRow = TDataRow> {
|
|
237
404
|
idKey: string;
|
|
238
|
-
|
|
405
|
+
protected _pageData: TRow[];
|
|
406
|
+
get pageData(): TRow[];
|
|
407
|
+
set pageData(val: TRow[]);
|
|
239
408
|
protected _rowCount: number;
|
|
240
409
|
get rowCount(): number;
|
|
241
410
|
set rowCount(val: number);
|
|
@@ -271,6 +440,8 @@ declare abstract class ADataProvider<TRow = TDataRow> {
|
|
|
271
440
|
get sortList(): IDataSort[];
|
|
272
441
|
set sortList(s: IDataSort[]);
|
|
273
442
|
private _listeners;
|
|
443
|
+
private _stateListeners;
|
|
444
|
+
private _pendingChangedKeys;
|
|
274
445
|
private _debouncedFilterLoad;
|
|
275
446
|
private _debouncedSortLoad;
|
|
276
447
|
constructor(options?: IDataProviderOptions);
|
|
@@ -283,19 +454,13 @@ declare abstract class ADataProvider<TRow = TDataRow> {
|
|
|
283
454
|
batchUpdates<R>(fn: () => R): R;
|
|
284
455
|
subscribe(listener: TDataProviderListener<this>): TUnsubscribe;
|
|
285
456
|
notify(): void;
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
error: any;
|
|
294
|
-
filter: IDataFilter | null;
|
|
295
|
-
sortList: IDataSort[];
|
|
296
|
-
selectedRows: TRow[];
|
|
297
|
-
selectAll: boolean;
|
|
298
|
-
};
|
|
457
|
+
onStateChange(listener: TDataProviderStateChangeListener<TRow>): TUnsubscribe;
|
|
458
|
+
getState(): IDataProviderState<TRow>;
|
|
459
|
+
protected onFilterUpdated(): void;
|
|
460
|
+
protected onSortUpdated(): void;
|
|
461
|
+
setState(partial: Partial<IDataProviderState<TRow>>, options?: IDataProviderSetStateOptions): void;
|
|
462
|
+
serializeState(): string;
|
|
463
|
+
deserializeState(serialized: string | Partial<IDataProviderState<TRow>>, options?: IDataProviderSetStateOptions): void;
|
|
299
464
|
setFilter(filter: IDataFilter | null, immediate?: boolean): void;
|
|
300
465
|
setSortList(sortList: IDataSort[], immediate?: boolean): void;
|
|
301
466
|
setCurrentPage(currentPage: number): void;
|
|
@@ -321,6 +486,8 @@ declare class CFlatClientDataProvider<TRow = TDataRow> extends ADataProvider<TRo
|
|
|
321
486
|
set allData(data: TRow[]);
|
|
322
487
|
get rowMap(): readonly TRow[];
|
|
323
488
|
setData(data: TRow[]): void;
|
|
489
|
+
protected onFilterUpdated(): void;
|
|
490
|
+
protected onSortUpdated(): void;
|
|
324
491
|
setFilter(filter: IDataFilter | null, immediate?: boolean): void;
|
|
325
492
|
setSortList(sortList: IDataSort[], immediate?: boolean): void;
|
|
326
493
|
/**
|
|
@@ -365,6 +532,11 @@ declare class RequestProvider {
|
|
|
365
532
|
setCacheProvider(provider?: ACacheProvider | ECacheStrategy): void;
|
|
366
533
|
setCacheLifetime(lifetime: number): void;
|
|
367
534
|
setDeduplicate(deduplicate: boolean): void;
|
|
535
|
+
encryption?: IProviderEncryptionOptions;
|
|
536
|
+
private _cachedCipherProvider?;
|
|
537
|
+
private _lastEncryptionConfig?;
|
|
538
|
+
setEncryption(encryption?: IProviderEncryptionOptions): void;
|
|
539
|
+
clearEncryption(): void;
|
|
368
540
|
onDataReceived(callback: (data: any, generation?: number) => void): void;
|
|
369
541
|
private invokeDataReceivedCallback;
|
|
370
542
|
hasLastUrl(): boolean;
|
|
@@ -375,16 +547,31 @@ declare class RequestProvider {
|
|
|
375
547
|
registerRequest<T>(url: string, options?: IRequestOptions): Promise<T>;
|
|
376
548
|
static executeAll(): void;
|
|
377
549
|
private isSameOriginUrl;
|
|
550
|
+
private getCipherProvider;
|
|
551
|
+
private isDataEncrypted;
|
|
552
|
+
private buildEncryptionContext;
|
|
553
|
+
private decryptPayloadIfNeeded;
|
|
378
554
|
request<T>(url: string, options?: IRequestOptions): Promise<T>;
|
|
379
555
|
}
|
|
380
556
|
|
|
557
|
+
declare function getCipherProvider(encryption?: IProviderEncryptionOptions): IEncryptionProvider | undefined;
|
|
558
|
+
declare function clearCachedCipherProvider(encryption?: IProviderEncryptionOptions): void;
|
|
559
|
+
declare function isDataEncrypted(provider?: IEncryptionProvider, data?: any, visited?: WeakSet<object>): boolean;
|
|
560
|
+
declare function buildEncryptionContext(encryption?: IProviderEncryptionOptions, url?: string, _defaultIdKey?: string): IEncryptionContext;
|
|
561
|
+
declare function decryptPageRows<T = any>(rows: T[], encryption?: IProviderEncryptionOptions, apiUrl?: string, idKey?: string): Promise<{
|
|
562
|
+
rows: T[];
|
|
563
|
+
decrypted: boolean;
|
|
564
|
+
}>;
|
|
381
565
|
declare abstract class AAPIDataProvider {
|
|
382
566
|
apiUrl: string;
|
|
383
567
|
cacheStrategy: ECacheStrategy | null;
|
|
384
568
|
cacheLifetime: number;
|
|
385
569
|
requestProvider: RequestProvider;
|
|
386
570
|
refreshOnMutation: boolean | undefined;
|
|
571
|
+
encryption?: IProviderEncryptionOptions;
|
|
387
572
|
constructor(options?: IDataProviderOptions);
|
|
573
|
+
setEncryption(encryption?: IProviderEncryptionOptions): void;
|
|
574
|
+
clearEncryption(): void;
|
|
388
575
|
abstract setAPIUrl(url: string): void;
|
|
389
576
|
abstract create(item: any): Promise<void>;
|
|
390
577
|
abstract update(item: any): Promise<void>;
|
|
@@ -398,7 +585,10 @@ declare class CAPIFlatClientDataProvider<TRow = TDataRow> extends CFlatClientDat
|
|
|
398
585
|
cacheStrategy: ECacheStrategy | null;
|
|
399
586
|
cacheLifetime: number;
|
|
400
587
|
refreshOnMutation: boolean | undefined;
|
|
588
|
+
encryption?: IProviderEncryptionOptions;
|
|
401
589
|
constructor(options?: IDataProviderOptions);
|
|
590
|
+
setEncryption(encryption?: IProviderEncryptionOptions): void;
|
|
591
|
+
clearEncryption(): void;
|
|
402
592
|
setContextKey(key: string): void;
|
|
403
593
|
setCacheStrategy(strategy: ECacheStrategy): void;
|
|
404
594
|
setCacheLifetime(lifetime: number): void;
|
|
@@ -409,6 +599,7 @@ declare class CAPIFlatClientDataProvider<TRow = TDataRow> extends CFlatClientDat
|
|
|
409
599
|
create(item: any): Promise<void>;
|
|
410
600
|
update(item: any): Promise<void>;
|
|
411
601
|
delete(items: any[]): Promise<void>;
|
|
602
|
+
loadPageData(): Promise<void>;
|
|
412
603
|
}
|
|
413
604
|
|
|
414
605
|
declare class CFlatServerDataProvider<TRow = TDataRow> extends ADataProvider<TRow> {
|
|
@@ -424,6 +615,7 @@ declare class CFlatServerDataProvider<TRow = TDataRow> extends ADataProvider<TRo
|
|
|
424
615
|
signal?: AbortSignal;
|
|
425
616
|
}): Promise<void>;
|
|
426
617
|
refresh(hardRefresh?: boolean): Promise<void>;
|
|
618
|
+
cancelPending(): void;
|
|
427
619
|
}
|
|
428
620
|
|
|
429
621
|
declare class CAPIFlatServerDataProvider<TRow = TDataRow> extends CFlatServerDataProvider<TRow> implements AAPIDataProvider {
|
|
@@ -432,9 +624,12 @@ declare class CAPIFlatServerDataProvider<TRow = TDataRow> extends CFlatServerDat
|
|
|
432
624
|
cacheStrategy: ECacheStrategy | null;
|
|
433
625
|
cacheLifetime: number;
|
|
434
626
|
refreshOnMutation: boolean | undefined;
|
|
627
|
+
encryption?: IProviderEncryptionOptions;
|
|
435
628
|
/** Incremented on every new request; stale onDataReceived callbacks are discarded. */
|
|
436
629
|
private _requestGeneration;
|
|
437
630
|
constructor(options?: IDataProviderOptions);
|
|
631
|
+
setEncryption(encryption?: IProviderEncryptionOptions): void;
|
|
632
|
+
clearEncryption(): void;
|
|
438
633
|
refresh(hardRefresh?: boolean): Promise<void>;
|
|
439
634
|
refreshData(options?: {
|
|
440
635
|
disableCache?: boolean;
|
|
@@ -457,18 +652,25 @@ declare class CTreeClientDataProvider<TRow extends TDataRow = TDataRow> extends
|
|
|
457
652
|
private _filteredNodesCache;
|
|
458
653
|
invalidateStaticCache(): void;
|
|
459
654
|
setFilter(filter: IDataFilter | null, immediate?: boolean): void;
|
|
655
|
+
protected onFilterUpdated(): void;
|
|
460
656
|
private get _staticNodes();
|
|
461
657
|
private get _nodeMap();
|
|
462
658
|
private get _sortedNodeIds();
|
|
463
659
|
constructor(options?: ITreeDataProviderOptions);
|
|
464
660
|
setData(data: TRow[]): void;
|
|
465
661
|
private buildStaticNodes;
|
|
662
|
+
protected onSortUpdated(): void;
|
|
663
|
+
setSortList(sortList: IDataSort[], immediate?: boolean): void;
|
|
466
664
|
private computeSortedIds;
|
|
467
665
|
private isNodeVisible;
|
|
468
666
|
private paginateNodes;
|
|
469
667
|
private updatePageData;
|
|
470
668
|
loadPageData(): Promise<void>;
|
|
471
669
|
get treeNodes(): ITreeNode<TRow>[];
|
|
670
|
+
get allVisibleNodes(): ITreeNode<TRow>[];
|
|
671
|
+
get allVisibleRows(): (TRow & ITreeNode<TRow> & {
|
|
672
|
+
__treeNode: ITreeNode<TRow>;
|
|
673
|
+
})[];
|
|
472
674
|
get visibleRows(): ITreeNode<TRow>[];
|
|
473
675
|
getAllNodes(): ITreeNode<TRow>[];
|
|
474
676
|
getFlatNodes(): ITreeNode<TRow>[];
|
|
@@ -491,7 +693,10 @@ declare class CAPITreeClientDataProvider<TRow extends TDataRow = TDataRow> exten
|
|
|
491
693
|
cacheStrategy: ECacheStrategy | null;
|
|
492
694
|
cacheLifetime: number;
|
|
493
695
|
refreshOnMutation: boolean | undefined;
|
|
696
|
+
encryption?: IProviderEncryptionOptions;
|
|
494
697
|
constructor(options?: ITreeDataProviderOptions);
|
|
698
|
+
setEncryption(encryption?: IProviderEncryptionOptions): void;
|
|
699
|
+
clearEncryption(): void;
|
|
495
700
|
setContextKey(key: string): void;
|
|
496
701
|
refresh(hardRefresh?: boolean): Promise<void>;
|
|
497
702
|
refreshData(options?: {
|
|
@@ -502,6 +707,7 @@ declare class CAPITreeClientDataProvider<TRow extends TDataRow = TDataRow> exten
|
|
|
502
707
|
create(item: any): Promise<void>;
|
|
503
708
|
update(item: any): Promise<void>;
|
|
504
709
|
delete(items: any[]): Promise<void>;
|
|
710
|
+
loadPageData(): Promise<void>;
|
|
505
711
|
}
|
|
506
712
|
|
|
507
713
|
/**
|
|
@@ -535,6 +741,7 @@ declare class CTreeServerDataProvider<TRow = TDataRow> extends ADataProvider<TRo
|
|
|
535
741
|
signal?: AbortSignal;
|
|
536
742
|
}): Promise<void>;
|
|
537
743
|
refresh(hardRefresh?: boolean): Promise<void>;
|
|
744
|
+
cancelPending(): void;
|
|
538
745
|
toggleNode(nodeId: string | number): void;
|
|
539
746
|
expand(nodeId: string | number): void;
|
|
540
747
|
collapse(nodeId: string | number): void;
|
|
@@ -556,9 +763,12 @@ declare class CAPITreeServerDataProvider<TRow = TDataRow> extends CTreeServerDat
|
|
|
556
763
|
cacheStrategy: ECacheStrategy | null;
|
|
557
764
|
cacheLifetime: number;
|
|
558
765
|
refreshOnMutation: boolean | undefined;
|
|
766
|
+
encryption?: IProviderEncryptionOptions;
|
|
559
767
|
/** Incremented on every new request; stale onDataReceived callbacks are discarded. */
|
|
560
768
|
private _requestGeneration;
|
|
561
769
|
constructor(options?: ITreeDataProviderOptions);
|
|
770
|
+
setEncryption(encryption?: IProviderEncryptionOptions): void;
|
|
771
|
+
clearEncryption(): void;
|
|
562
772
|
refresh(hardRefresh?: boolean): Promise<void>;
|
|
563
773
|
refreshData(options?: {
|
|
564
774
|
disableCache?: boolean;
|
|
@@ -645,11 +855,14 @@ declare class CServerSessionCache extends ACacheProvider {
|
|
|
645
855
|
static get storage(): Map<string, Map<string, ICacheEntry<any>>>;
|
|
646
856
|
static getSnapshot(): Map<string, Map<string, ICacheEntry<any>>>;
|
|
647
857
|
static MAX_SERVER_SESSIONS: number;
|
|
858
|
+
static MAX_ENTRIES_PER_SESSION: number;
|
|
859
|
+
static CLEANUP_INTERVAL_OPS: number;
|
|
860
|
+
private static _opCounter;
|
|
648
861
|
/**
|
|
649
|
-
* Purges expired entries across
|
|
650
|
-
*
|
|
862
|
+
* Purges expired entries across server sessions.
|
|
863
|
+
* Can be run in bounded batches (maxSessionsToCheck) to prevent blocking the event loop.
|
|
651
864
|
*/
|
|
652
|
-
static purgeExpiredServerSessions(): void;
|
|
865
|
+
static purgeExpiredServerSessions(maxSessionsToCheck?: number): void;
|
|
653
866
|
private sessionIdCache;
|
|
654
867
|
private readonly SESSION_ID_KEY;
|
|
655
868
|
constructor();
|
|
@@ -716,8 +929,29 @@ declare class CLocalStorageCache extends ACacheProvider {
|
|
|
716
929
|
private static instance;
|
|
717
930
|
static getInstance(): CLocalStorageCache;
|
|
718
931
|
type: string;
|
|
932
|
+
private quotaOptions;
|
|
933
|
+
configureQuota(options: Partial<ICacheQuotaOptions>): void;
|
|
934
|
+
getQuotaOptions(): Required<ICacheQuotaOptions>;
|
|
719
935
|
private constructor();
|
|
720
936
|
private _hydrateFromPayload;
|
|
937
|
+
/**
|
|
938
|
+
* Estimates current cache storage consumption in bytes and item counts without full JSON.parse overhead.
|
|
939
|
+
*/
|
|
940
|
+
estimateStorageUsage(): {
|
|
941
|
+
totalBytes: number;
|
|
942
|
+
entryCount: number;
|
|
943
|
+
thresholdBytes: number;
|
|
944
|
+
isNearQuota: boolean;
|
|
945
|
+
};
|
|
946
|
+
/**
|
|
947
|
+
* Inspects all cache:* items in LocalStorage and returns metadata sorted for LRU analysis.
|
|
948
|
+
*/
|
|
949
|
+
private _getCacheEntriesMetadata;
|
|
950
|
+
/**
|
|
951
|
+
* Evicts least recently used or oldest entries until storage usage drops by targetRatio.
|
|
952
|
+
* Returns number of evicted items.
|
|
953
|
+
*/
|
|
954
|
+
evictLRU(targetRatio?: number): number;
|
|
721
955
|
getKeyList(context?: any): Promise<Array<string>>;
|
|
722
956
|
get<T>(key: string, context?: any): Promise<T | null>;
|
|
723
957
|
set<T>(key: string, data: T, lifetime: number, context?: any): Promise<void>;
|
|
@@ -731,10 +965,26 @@ declare class CIndexedDBCache extends ACacheProvider {
|
|
|
731
965
|
private static instance;
|
|
732
966
|
private static instances;
|
|
733
967
|
readonly storeName: string;
|
|
968
|
+
private quotaOptions;
|
|
969
|
+
configureQuota(options: Partial<ICacheQuotaOptions>): void;
|
|
970
|
+
getQuotaOptions(): Required<ICacheQuotaOptions>;
|
|
734
971
|
static getInstance(storeName?: string): CIndexedDBCache;
|
|
735
972
|
constructor(storeName?: string);
|
|
736
973
|
private _hydrateFromPayload;
|
|
737
974
|
private getStore;
|
|
975
|
+
/**
|
|
976
|
+
* Checks browser navigator.storage estimate to see if storage usage is near quota.
|
|
977
|
+
*/
|
|
978
|
+
estimateStorageUsage(): Promise<{
|
|
979
|
+
quota: number;
|
|
980
|
+
usage: number;
|
|
981
|
+
ratio: number;
|
|
982
|
+
isNearQuota: boolean;
|
|
983
|
+
}>;
|
|
984
|
+
/**
|
|
985
|
+
* Evicts least recently used entries from IndexedDB.
|
|
986
|
+
*/
|
|
987
|
+
evictLRU(targetRatio?: number): Promise<number>;
|
|
738
988
|
getKeyList(context?: any): Promise<Array<string>>;
|
|
739
989
|
get<T>(key: string, context?: any): Promise<T | null>;
|
|
740
990
|
set<T>(key: string, data: T, lifetime: number, context?: any): Promise<void>;
|
|
@@ -903,6 +1153,8 @@ declare class RequestQueue {
|
|
|
903
1153
|
private static _onDeadLetter;
|
|
904
1154
|
private static _onFlushComplete;
|
|
905
1155
|
private static _onNetworkError;
|
|
1156
|
+
private static _headerProvider;
|
|
1157
|
+
static setHeaderProvider(provider: (() => Record<string, string> | Promise<Record<string, string>>) | null): void;
|
|
906
1158
|
/**
|
|
907
1159
|
* Load persisted queue from storage into state.
|
|
908
1160
|
* Call once at app startup, before any flush or enqueue operations.
|
|
@@ -1087,5 +1339,474 @@ declare function getAppRouter(): any;
|
|
|
1087
1339
|
*/
|
|
1088
1340
|
declare function onPlatformReady(cb: () => void): void;
|
|
1089
1341
|
|
|
1090
|
-
|
|
1091
|
-
|
|
1342
|
+
/**
|
|
1343
|
+
* Foundational abstract base class for all Katlux encryption provider implementations.
|
|
1344
|
+
* Provides key storage, lifecycle management, reusable value-level traversal,
|
|
1345
|
+
* and enforces the isomorphic IEncryptionProvider contract.
|
|
1346
|
+
*/
|
|
1347
|
+
declare abstract class AEncryptionProvider implements IEncryptionProvider {
|
|
1348
|
+
protected defaultKey?: TKeyProvider | IKeyPair;
|
|
1349
|
+
constructor(key?: TKeyProvider | IKeyPair);
|
|
1350
|
+
/**
|
|
1351
|
+
* Sets or updates the default secret key, CryptoKey, or async key provider function.
|
|
1352
|
+
*/
|
|
1353
|
+
setDefaultKey(key: TKeyProvider | IKeyPair): void;
|
|
1354
|
+
/**
|
|
1355
|
+
* Retrieves the currently configured default key or key provider callback.
|
|
1356
|
+
*/
|
|
1357
|
+
getDefaultKey(): TKeyProvider | IKeyPair | undefined;
|
|
1358
|
+
/**
|
|
1359
|
+
* Pre-derives and caches the native CryptoKey for subsequent cryptographic operations.
|
|
1360
|
+
* Subclasses should override this with a dedicated, non-side-effecting implementation.
|
|
1361
|
+
*/
|
|
1362
|
+
warmupKey(_options?: IEncryptionContext): Promise<void>;
|
|
1363
|
+
/**
|
|
1364
|
+
* Resolves raw key from keyProvider callback or defaultKey.
|
|
1365
|
+
*/
|
|
1366
|
+
protected resolveRawKey(keyProvider?: TKeyProvider | IKeyPair | any): Promise<TRawKey>;
|
|
1367
|
+
/**
|
|
1368
|
+
* Checks whether the given payload is an encrypted envelope.
|
|
1369
|
+
*/
|
|
1370
|
+
static isEncrypted(payload: any): boolean;
|
|
1371
|
+
/**
|
|
1372
|
+
* Checks whether the given payload is an encrypted envelope.
|
|
1373
|
+
*/
|
|
1374
|
+
isEncrypted(payload: any): boolean;
|
|
1375
|
+
/**
|
|
1376
|
+
* Clears configured keys and cached cryptographic material from memory.
|
|
1377
|
+
*/
|
|
1378
|
+
clearKeys(): void;
|
|
1379
|
+
/**
|
|
1380
|
+
* Alias for clearKeys() to conform with standard disposal patterns.
|
|
1381
|
+
*/
|
|
1382
|
+
dispose(): void;
|
|
1383
|
+
/**
|
|
1384
|
+
* ECMAScript Explicit Resource Management protocol (using / await using declarations).
|
|
1385
|
+
*/
|
|
1386
|
+
[Symbol.dispose](): void;
|
|
1387
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
1388
|
+
/**
|
|
1389
|
+
* Encrypts a single value (string, object, primitive) into an IEncryptedPayload envelope.
|
|
1390
|
+
* Implemented by concrete cryptographic providers.
|
|
1391
|
+
*/
|
|
1392
|
+
abstract encryptValue(value: any, options?: IEncryptionContext): Promise<IEncryptedPayload>;
|
|
1393
|
+
/**
|
|
1394
|
+
* Decrypts a single IEncryptedPayload envelope back into its original plaintext.
|
|
1395
|
+
* Implemented by concrete cryptographic providers.
|
|
1396
|
+
*/
|
|
1397
|
+
abstract decryptValue(payload: IEncryptedPayload, options?: IEncryptionContext): Promise<any>;
|
|
1398
|
+
/**
|
|
1399
|
+
* Top-level polymorphic encryption method.
|
|
1400
|
+
* Automatically performs value-level encryption:
|
|
1401
|
+
* - If data is an array of objects: recursively encrypts each row.
|
|
1402
|
+
* - If data is an object: encrypts specified fields (or all values if valueEncryption is true),
|
|
1403
|
+
* preserving JSON object keys so backend APIs and ORMs can parse keys and perform upserts.
|
|
1404
|
+
* - If data is a primitive or whole-payload envelope: encrypts as a single value.
|
|
1405
|
+
*/
|
|
1406
|
+
encrypt(data: any, options?: IEncryptionContext): Promise<any>;
|
|
1407
|
+
/**
|
|
1408
|
+
* Top-level polymorphic decryption method.
|
|
1409
|
+
* Automatically performs value-level decryption:
|
|
1410
|
+
* - If payload is an encrypted envelope: decrypts directly via decryptValue.
|
|
1411
|
+
* - If payload is an array of objects: decrypts each row.
|
|
1412
|
+
* - If payload is an object: decrypts any encrypted value cells across fields.
|
|
1413
|
+
*/
|
|
1414
|
+
decrypt(payload: any, options?: IEncryptionContext): Promise<any>;
|
|
1415
|
+
}
|
|
1416
|
+
|
|
1417
|
+
/**
|
|
1418
|
+
* Static cryptographic key lifecycle management utility.
|
|
1419
|
+
* Provides key generation, JWK import/export, key wrapping (AES-KW / RSA-OAEP),
|
|
1420
|
+
* and standard Key Derivation Functions (PBKDF2 / HKDF).
|
|
1421
|
+
*/
|
|
1422
|
+
declare class CKeyManager {
|
|
1423
|
+
/**
|
|
1424
|
+
* Generates a cryptographically secure random byte buffer of the specified length.
|
|
1425
|
+
*/
|
|
1426
|
+
static randomBytes(length: number): Uint8Array;
|
|
1427
|
+
/**
|
|
1428
|
+
* Converts an ArrayBuffer or Uint8Array into a Base64-encoded string.
|
|
1429
|
+
*/
|
|
1430
|
+
static toBase64(buffer: ArrayBuffer | Uint8Array): string;
|
|
1431
|
+
/**
|
|
1432
|
+
* Converts a Base64 or Base64URL-encoded string back into a Uint8Array.
|
|
1433
|
+
* Normalizes URL-safe characters and padding, strictly validating against the Base64 alphabet.
|
|
1434
|
+
*/
|
|
1435
|
+
static fromBase64(base64: string): Uint8Array;
|
|
1436
|
+
/**
|
|
1437
|
+
* Deterministically resolves a salt from Uint8Array, ArrayBuffer, Base64/Base64URL string, or raw text string.
|
|
1438
|
+
* Guarantees 100% identical salt byte resolution between Node.js and Browser environments.
|
|
1439
|
+
*/
|
|
1440
|
+
static resolveSalt(salt?: Uint8Array | ArrayBuffer | string): Uint8Array;
|
|
1441
|
+
/**
|
|
1442
|
+
* Generates a random AES CryptoKey suitable for AES-GCM or AES-CBC.
|
|
1443
|
+
*/
|
|
1444
|
+
static generateAESKey(length?: 128 | 256, algorithm?: 'AES-GCM' | 'AES-CBC' | 'AES-KW', extractable?: boolean): Promise<CryptoKey>;
|
|
1445
|
+
/**
|
|
1446
|
+
* Exports an AES CryptoKey as a raw base64 string.
|
|
1447
|
+
*/
|
|
1448
|
+
static exportAESKey(key: CryptoKey): Promise<string>;
|
|
1449
|
+
/**
|
|
1450
|
+
* Imports an AES CryptoKey from a raw base64 string.
|
|
1451
|
+
*/
|
|
1452
|
+
static importAESKey(base64: string, algorithm?: 'AES-GCM' | 'AES-CBC' | 'AES-KW', extractable?: boolean): Promise<CryptoKey>;
|
|
1453
|
+
/**
|
|
1454
|
+
* Generates an RSA-OAEP public/private key pair (2048 or 4096 bits).
|
|
1455
|
+
*/
|
|
1456
|
+
static generateRSAKeyPair(bits?: 2048 | 4096, hash?: 'SHA-256' | 'SHA-512', extractable?: boolean): Promise<IKeyPair>;
|
|
1457
|
+
/**
|
|
1458
|
+
* Generates an ECDH public/private key pair for elliptic curve Diffie-Hellman.
|
|
1459
|
+
*/
|
|
1460
|
+
static generateECDHKeyPair(curve?: 'P-256' | 'P-384' | 'P-521', extractable?: boolean): Promise<IKeyPair>;
|
|
1461
|
+
/**
|
|
1462
|
+
* Exports a public CryptoKey to a portable JsonWebKey (JWK).
|
|
1463
|
+
*/
|
|
1464
|
+
static exportPublicKey(key: CryptoKey): Promise<JsonWebKey>;
|
|
1465
|
+
/**
|
|
1466
|
+
* Exports a private CryptoKey to a portable JsonWebKey (JWK).
|
|
1467
|
+
*/
|
|
1468
|
+
static exportPrivateKey(key: CryptoKey): Promise<JsonWebKey>;
|
|
1469
|
+
/**
|
|
1470
|
+
* Imports a public key from a JsonWebKey (JWK).
|
|
1471
|
+
*/
|
|
1472
|
+
static importPublicKey(jwk: JsonWebKey, algorithm?: string | RsaHashedImportParams | EcKeyImportParams): Promise<CryptoKey>;
|
|
1473
|
+
/**
|
|
1474
|
+
* Imports a private key from a JsonWebKey (JWK).
|
|
1475
|
+
*/
|
|
1476
|
+
static importPrivateKey(jwk: JsonWebKey, algorithm?: string | RsaHashedImportParams | EcKeyImportParams): Promise<CryptoKey>;
|
|
1477
|
+
/**
|
|
1478
|
+
* Imports a public key from a PEM (SPKI) or base64 SPKI string.
|
|
1479
|
+
*/
|
|
1480
|
+
static importPublicKeyFromPEM(pem: string, algorithm?: 'RSA-OAEP' | 'ECDH', curve?: 'P-256' | 'P-384' | 'P-521', hash?: 'SHA-256' | 'SHA-512'): Promise<CryptoKey>;
|
|
1481
|
+
/**
|
|
1482
|
+
* Imports a private key from a PEM (PKCS#8) or base64 PKCS#8 string.
|
|
1483
|
+
*/
|
|
1484
|
+
static importPrivateKeyFromPEM(pem: string, algorithm?: 'RSA-OAEP' | 'ECDH', curve?: 'P-256' | 'P-384' | 'P-521', hash?: 'SHA-256' | 'SHA-512'): Promise<CryptoKey>;
|
|
1485
|
+
/**
|
|
1486
|
+
* Exports a public CryptoKey to a standard PEM (SPKI) string.
|
|
1487
|
+
*/
|
|
1488
|
+
static exportPublicKeyToPEM(key: CryptoKey): Promise<string>;
|
|
1489
|
+
/**
|
|
1490
|
+
* Exports a private CryptoKey to a standard PEM (PKCS#8) string.
|
|
1491
|
+
*/
|
|
1492
|
+
static exportPrivateKeyToPEM(key: CryptoKey): Promise<string>;
|
|
1493
|
+
/**
|
|
1494
|
+
* Wraps a target CryptoKey (e.g. an Account Symmetric Key) using a wrapping key
|
|
1495
|
+
* (AES-KW or RSA-OAEP).
|
|
1496
|
+
*/
|
|
1497
|
+
static wrapKey(keyToWrap: CryptoKey, wrappingKey: CryptoKey, format?: KeyFormat): Promise<string>;
|
|
1498
|
+
/**
|
|
1499
|
+
* Unwraps a base64-encoded wrapped key using an unwrapping key (AES-KW or RSA-OAEP).
|
|
1500
|
+
*/
|
|
1501
|
+
static unwrapKey(wrappedBase64: string, unwrappingKey: CryptoKey, unwrappedKeyAlgorithm?: any, extractable?: boolean, keyUsages?: KeyUsage[], format?: KeyFormat): Promise<CryptoKey>;
|
|
1502
|
+
/**
|
|
1503
|
+
* Generates a high-entropy symmetric AES-GCM Account Data Encryption Key (ADEK).
|
|
1504
|
+
* Designed for multi-user table and field-level encryption.
|
|
1505
|
+
*/
|
|
1506
|
+
static generateAccountDataKey(length?: 128 | 192 | 256): Promise<CryptoKey>;
|
|
1507
|
+
/**
|
|
1508
|
+
* Wraps an Account Data Encryption Key (ADEK) for a specific user using the user's public key (RSA-OAEP).
|
|
1509
|
+
* Returns a Base64-encoded wrapped key string suitable for storage in role-map / access tables.
|
|
1510
|
+
*/
|
|
1511
|
+
static wrapAccountKeyForUser(adek: CryptoKey, userPublicKey: CryptoKey): Promise<string>;
|
|
1512
|
+
/**
|
|
1513
|
+
* Unwraps a Base64-encoded Account Data Encryption Key (ADEK) using the user's private key (RSA-OAEP).
|
|
1514
|
+
* Returns the restored AES-GCM CryptoKey ready for use in CWebCryptoEncryptionProvider.
|
|
1515
|
+
*/
|
|
1516
|
+
static unwrapAccountKeyForUser(wrappedKeyBase64: string, userPrivateKey: CryptoKey, unwrappedKeyAlgorithm?: any): Promise<CryptoKey>;
|
|
1517
|
+
/**
|
|
1518
|
+
* Derives a symmetric AES-GCM CryptoKey from a passphrase using PBKDF2 or HKDF.
|
|
1519
|
+
* Returns the derived CryptoKey and the base64-encoded salt.
|
|
1520
|
+
*/
|
|
1521
|
+
static deriveKey(passphrase: string | Uint8Array | ArrayBuffer, options: IKDFOptions): Promise<{
|
|
1522
|
+
key: CryptoKey;
|
|
1523
|
+
salt: string;
|
|
1524
|
+
}>;
|
|
1525
|
+
/**
|
|
1526
|
+
* Derives an AES-GCM CryptoKey from a high-entropy secret (e.g. an ECDH shared secret key)
|
|
1527
|
+
* using HKDF.
|
|
1528
|
+
*/
|
|
1529
|
+
static deriveKeyFromSecret(secretKey: CryptoKey, options?: IHKDFFromSecretOptions): Promise<CryptoKey>;
|
|
1530
|
+
}
|
|
1531
|
+
|
|
1532
|
+
interface ICWebCryptoOptions {
|
|
1533
|
+
kdf?: 'none' | 'pbkdf2' | 'hkdf';
|
|
1534
|
+
kdfIterations?: number;
|
|
1535
|
+
kdfHash?: 'SHA-256' | 'SHA-512';
|
|
1536
|
+
kdfSalt?: string | Uint8Array | ArrayBuffer;
|
|
1537
|
+
info?: string | Uint8Array | ArrayBuffer;
|
|
1538
|
+
}
|
|
1539
|
+
declare class CWebCryptoEncryptionProvider extends AEncryptionProvider {
|
|
1540
|
+
private _defaultKdf;
|
|
1541
|
+
private _cachedKey?;
|
|
1542
|
+
private _kdfOptions?;
|
|
1543
|
+
private _cachedSalt?;
|
|
1544
|
+
private _cachedKdf?;
|
|
1545
|
+
private _cachedIter?;
|
|
1546
|
+
private _cachedHash?;
|
|
1547
|
+
private _decryptSaltCache;
|
|
1548
|
+
setDefaultKey(key: TKeyProvider): void;
|
|
1549
|
+
clearKeys(): void;
|
|
1550
|
+
constructor(key?: TKeyProvider | IKeyPair, options?: ICWebCryptoOptions);
|
|
1551
|
+
/**
|
|
1552
|
+
* Derives or returns a CryptoKey for encryption/decryption based on KDF settings.
|
|
1553
|
+
*/
|
|
1554
|
+
private resolveCryptoKey;
|
|
1555
|
+
private _resolveCryptoKeyInternal;
|
|
1556
|
+
static isEncrypted(payload: any): boolean;
|
|
1557
|
+
isEncrypted(payload: any): boolean;
|
|
1558
|
+
warmupKey(options?: IEncryptionContext): Promise<void>;
|
|
1559
|
+
/**
|
|
1560
|
+
* Encrypts a single value into an AES-GCM envelope.
|
|
1561
|
+
*/
|
|
1562
|
+
encryptValue(data: any, options?: IEncryptionContext): Promise<IEncryptedPayload>;
|
|
1563
|
+
/**
|
|
1564
|
+
* Decrypts a single AES-GCM envelope back into its plaintext.
|
|
1565
|
+
*/
|
|
1566
|
+
decryptValue(payload: IEncryptedPayload, options?: IEncryptionContext): Promise<any>;
|
|
1567
|
+
}
|
|
1568
|
+
|
|
1569
|
+
interface ICWebCryptoAESCBCOptions {
|
|
1570
|
+
kdf?: 'none' | 'pbkdf2' | 'hkdf';
|
|
1571
|
+
kdfIterations?: number;
|
|
1572
|
+
kdfHash?: 'SHA-256' | 'SHA-512';
|
|
1573
|
+
kdfSalt?: string | Uint8Array | ArrayBuffer;
|
|
1574
|
+
info?: string | Uint8Array | ArrayBuffer;
|
|
1575
|
+
}
|
|
1576
|
+
/**
|
|
1577
|
+
* Authenticated AES-CBC-256 provider with Encrypt-then-MAC (HMAC-SHA-256).
|
|
1578
|
+
*
|
|
1579
|
+
* AES-CBC provides confidentiality but no integrity protection by itself.
|
|
1580
|
+
* This provider implements Encrypt-then-MAC: an HMAC-SHA-256 tag is computed
|
|
1581
|
+
* over the (IV || ciphertext) and stored in the envelope's `tag` field.
|
|
1582
|
+
* Upon decryption, the HMAC is strictly verified before CBC decryption to mitigate
|
|
1583
|
+
* padding oracle and bit-flipping attacks.
|
|
1584
|
+
*/
|
|
1585
|
+
declare class CWebCryptoAESCBCProvider extends AEncryptionProvider {
|
|
1586
|
+
private _defaultKdf;
|
|
1587
|
+
private _cachedEncKey?;
|
|
1588
|
+
private _cachedMacKey?;
|
|
1589
|
+
private _cachedSalt?;
|
|
1590
|
+
private _cachedKdf?;
|
|
1591
|
+
private _cachedIter?;
|
|
1592
|
+
private _cachedHash?;
|
|
1593
|
+
private _kdfOptions?;
|
|
1594
|
+
private _decryptSaltCache;
|
|
1595
|
+
constructor(key?: TKeyProvider | IKeyPair, options?: ICWebCryptoAESCBCOptions);
|
|
1596
|
+
setDefaultKey(key: TKeyProvider | IKeyPair): void;
|
|
1597
|
+
clearKeys(): void;
|
|
1598
|
+
warmupKey(options?: IEncryptionContext): Promise<void>;
|
|
1599
|
+
/**
|
|
1600
|
+
* Derives 64 bytes (512 bits) of key material:
|
|
1601
|
+
* - Bytes 0..31 (256 bits) for AES-CBC encryption key
|
|
1602
|
+
* - Bytes 32..63 (256 bits) for HMAC-SHA-256 authentication key
|
|
1603
|
+
*/
|
|
1604
|
+
private resolveCBCKeys;
|
|
1605
|
+
private _deriveCBCKeysInternal;
|
|
1606
|
+
static isEncrypted(payload: any): boolean;
|
|
1607
|
+
isEncrypted(payload: any): boolean;
|
|
1608
|
+
/**
|
|
1609
|
+
* Encrypts a single value into an authenticated AES-CBC-256+HMAC-SHA-256 envelope.
|
|
1610
|
+
*/
|
|
1611
|
+
encryptValue(data: any, options?: IEncryptionContext): Promise<IEncryptedPayload>;
|
|
1612
|
+
/**
|
|
1613
|
+
* Decrypts a single AES-CBC-256+HMAC-SHA-256 envelope back into its plaintext.
|
|
1614
|
+
*/
|
|
1615
|
+
decryptValue(payload: IEncryptedPayload, options?: IEncryptionContext): Promise<any>;
|
|
1616
|
+
}
|
|
1617
|
+
|
|
1618
|
+
/**
|
|
1619
|
+
* Asymmetric / Hybrid encryption provider combining RSA-OAEP (2048/4096-bit) with AES-GCM-256.
|
|
1620
|
+
*
|
|
1621
|
+
* Direct RSA encryption is bounded by key size (RSA-4096 max ~446 bytes).
|
|
1622
|
+
* This provider implements the industry-standard Hybrid Encryption scheme:
|
|
1623
|
+
* 1. A random 256-bit AES-GCM data key is generated per encryption.
|
|
1624
|
+
* 2. Payload is encrypted with the AES-GCM data key (unlimited payload size, authenticated).
|
|
1625
|
+
* 3. The AES-GCM data key is wrapped with the recipient's RSA-OAEP public key.
|
|
1626
|
+
* 4. The envelope packages ciphertext, IV, and wrappedKey.
|
|
1627
|
+
* 5. Only the holder of the matching RSA private key can unwrap the data key and decrypt.
|
|
1628
|
+
*/
|
|
1629
|
+
declare class CRSAEncryptionProvider extends AEncryptionProvider {
|
|
1630
|
+
private publicKey?;
|
|
1631
|
+
private privateKey?;
|
|
1632
|
+
setDefaultKey(key: TKeyProvider | IKeyPair | Record<string, any>): void;
|
|
1633
|
+
constructor(publicKeyOrPair?: CryptoKey | IKeyPair | {
|
|
1634
|
+
publicKey?: CryptoKey;
|
|
1635
|
+
privateKey?: CryptoKey;
|
|
1636
|
+
recipientPublicKey?: CryptoKey;
|
|
1637
|
+
recipientPrivateKey?: CryptoKey;
|
|
1638
|
+
}, privateKey?: CryptoKey);
|
|
1639
|
+
setPublicKey(key: CryptoKey): void;
|
|
1640
|
+
getPublicKey(): CryptoKey | undefined;
|
|
1641
|
+
setPrivateKey(key: CryptoKey): void;
|
|
1642
|
+
getPrivateKey(): CryptoKey | undefined;
|
|
1643
|
+
clearKeys(): void;
|
|
1644
|
+
static generateKeyPair(bits?: 2048 | 4096): Promise<IKeyPair>;
|
|
1645
|
+
static exportPublicKey(key: CryptoKey): Promise<JsonWebKey>;
|
|
1646
|
+
static exportPrivateKey(key: CryptoKey): Promise<JsonWebKey>;
|
|
1647
|
+
static importPublicKey(jwk: JsonWebKey): Promise<CryptoKey>;
|
|
1648
|
+
static importPrivateKey(jwk: JsonWebKey): Promise<CryptoKey>;
|
|
1649
|
+
static importPublicKeyFromPEM(pem: string, hash?: 'SHA-256' | 'SHA-512'): Promise<CryptoKey>;
|
|
1650
|
+
static importPrivateKeyFromPEM(pem: string, hash?: 'SHA-256' | 'SHA-512'): Promise<CryptoKey>;
|
|
1651
|
+
static exportPublicKeyToPEM(key: CryptoKey): Promise<string>;
|
|
1652
|
+
static exportPrivateKeyToPEM(key: CryptoKey): Promise<string>;
|
|
1653
|
+
static isEncrypted(payload: any): boolean;
|
|
1654
|
+
isEncrypted(payload: any): boolean;
|
|
1655
|
+
/**
|
|
1656
|
+
* Encrypts a single value into a hybrid RSA-OAEP + AES-GCM envelope.
|
|
1657
|
+
*/
|
|
1658
|
+
encryptValue(data: any, options?: IEncryptionContext): Promise<IEncryptedPayload>;
|
|
1659
|
+
/**
|
|
1660
|
+
* Decrypts a single hybrid RSA-OAEP + AES-GCM envelope back into its plaintext.
|
|
1661
|
+
*/
|
|
1662
|
+
decryptValue(payload: IEncryptedPayload, options?: IEncryptionContext): Promise<any>;
|
|
1663
|
+
encrypt(data: any, options?: IEncryptionContext): Promise<any>;
|
|
1664
|
+
decrypt(payload: any, options?: IEncryptionContext): Promise<any>;
|
|
1665
|
+
}
|
|
1666
|
+
|
|
1667
|
+
type TECDHCurve = 'P-256' | 'P-384' | 'P-521';
|
|
1668
|
+
/**
|
|
1669
|
+
* Modern Asymmetric / Hybrid encryption provider using ECDH (Elliptic Curve Diffie-Hellman)
|
|
1670
|
+
* with HKDF key derivation and AES-GCM-256 authenticated encryption.
|
|
1671
|
+
*
|
|
1672
|
+
* Implements forward-secure hybrid encryption:
|
|
1673
|
+
* 1. An ephemeral ECDH keypair is generated per encryption operation.
|
|
1674
|
+
* 2. Key agreement with recipient's ECDH public key produces a high-entropy shared secret.
|
|
1675
|
+
* 3. HKDF derives a 256-bit AES-GCM data key from the shared secret.
|
|
1676
|
+
* 4. Payload is encrypted with AES-GCM.
|
|
1677
|
+
* 5. Ephemeral public key (JWK) is attached to the envelope (`epk`).
|
|
1678
|
+
* 6. Only the recipient with the matching private key can agree with `epk` and decrypt.
|
|
1679
|
+
*/
|
|
1680
|
+
declare class CECDHEncryptionProvider extends AEncryptionProvider {
|
|
1681
|
+
private recipientPublicKey?;
|
|
1682
|
+
private recipientPrivateKey?;
|
|
1683
|
+
private curve;
|
|
1684
|
+
setDefaultKey(key: TKeyProvider | IKeyPair | Record<string, any>): void;
|
|
1685
|
+
constructor(recipientPublicKeyOrPair?: CryptoKey | IKeyPair | {
|
|
1686
|
+
recipientPublicKey?: CryptoKey;
|
|
1687
|
+
publicKey?: CryptoKey;
|
|
1688
|
+
recipientPrivateKey?: CryptoKey;
|
|
1689
|
+
privateKey?: CryptoKey;
|
|
1690
|
+
curve?: TECDHCurve;
|
|
1691
|
+
}, recipientPrivateKey?: CryptoKey, curve?: TECDHCurve);
|
|
1692
|
+
setRecipientPublicKey(key: CryptoKey): void;
|
|
1693
|
+
getRecipientPublicKey(): CryptoKey | undefined;
|
|
1694
|
+
setRecipientPrivateKey(key: CryptoKey): void;
|
|
1695
|
+
getRecipientPrivateKey(): CryptoKey | undefined;
|
|
1696
|
+
getCurve(): TECDHCurve;
|
|
1697
|
+
clearKeys(): void;
|
|
1698
|
+
static generateKeyPair(curve?: TECDHCurve): Promise<IKeyPair>;
|
|
1699
|
+
static exportPublicKey(key: CryptoKey): Promise<JsonWebKey>;
|
|
1700
|
+
static exportPrivateKey(key: CryptoKey): Promise<JsonWebKey>;
|
|
1701
|
+
static importPublicKey(jwk: JsonWebKey, curve?: TECDHCurve): Promise<CryptoKey>;
|
|
1702
|
+
static importPrivateKey(jwk: JsonWebKey, curve?: TECDHCurve): Promise<CryptoKey>;
|
|
1703
|
+
static importPublicKeyFromPEM(pem: string, curve?: TECDHCurve): Promise<CryptoKey>;
|
|
1704
|
+
static importPrivateKeyFromPEM(pem: string, curve?: TECDHCurve): Promise<CryptoKey>;
|
|
1705
|
+
static exportPublicKeyToPEM(key: CryptoKey): Promise<string>;
|
|
1706
|
+
static exportPrivateKeyToPEM(key: CryptoKey): Promise<string>;
|
|
1707
|
+
static isEncrypted(payload: any): boolean;
|
|
1708
|
+
isEncrypted(payload: any): boolean;
|
|
1709
|
+
/**
|
|
1710
|
+
* Encrypts a single value into an ECDH+HKDF+AES-GCM envelope.
|
|
1711
|
+
*/
|
|
1712
|
+
encryptValue(data: any, options?: IEncryptionContext): Promise<IEncryptedPayload>;
|
|
1713
|
+
/**
|
|
1714
|
+
* Encrypts multiple designated fields of a record using a single ephemeral ECDH keypair and shared DEK.
|
|
1715
|
+
*/
|
|
1716
|
+
private encryptFieldsWithSharedDEK;
|
|
1717
|
+
/**
|
|
1718
|
+
* Derives the AES-GCM data key for a given ECDH envelope.
|
|
1719
|
+
*/
|
|
1720
|
+
private deriveDecryptionKey;
|
|
1721
|
+
/**
|
|
1722
|
+
* Decrypts ciphertext buffer using a derived data key.
|
|
1723
|
+
*/
|
|
1724
|
+
private decryptCiphertextWithKey;
|
|
1725
|
+
/**
|
|
1726
|
+
* Decrypts a single ECDH+HKDF+AES-GCM envelope back into its plaintext.
|
|
1727
|
+
*/
|
|
1728
|
+
decryptValue(payload: IEncryptedPayload, options?: IEncryptionContext): Promise<any>;
|
|
1729
|
+
encrypt(data: any, options?: IEncryptionContext): Promise<any>;
|
|
1730
|
+
decrypt(payload: any, options?: IEncryptionContext): Promise<any>;
|
|
1731
|
+
}
|
|
1732
|
+
|
|
1733
|
+
interface ICNodeCryptoOptions {
|
|
1734
|
+
kdf?: 'none' | 'pbkdf2' | 'hkdf';
|
|
1735
|
+
kdfIterations?: number;
|
|
1736
|
+
kdfHash?: 'SHA-256' | 'SHA-512';
|
|
1737
|
+
kdfSalt?: string | Uint8Array | ArrayBuffer;
|
|
1738
|
+
info?: string | Uint8Array | ArrayBuffer;
|
|
1739
|
+
}
|
|
1740
|
+
/**
|
|
1741
|
+
* Server-side synchronous AES-GCM-256 encryption provider using Node.js native `node:crypto`.
|
|
1742
|
+
*
|
|
1743
|
+
* Fully interoperable with `CWebCryptoEncryptionProvider`:
|
|
1744
|
+
* - Data encrypted by `CNodeCryptoEncryptionProvider` can be decrypted by `CWebCryptoEncryptionProvider`.
|
|
1745
|
+
* - Data encrypted by `CWebCryptoEncryptionProvider` can be decrypted by `CNodeCryptoEncryptionProvider`.
|
|
1746
|
+
*
|
|
1747
|
+
* Provides both synchronous (`encryptSync`, `decryptSync`) and standard Promise-based
|
|
1748
|
+
* (`encrypt`, `decrypt`) methods for Nitro routes, worker threads, and CLI tools.
|
|
1749
|
+
*/
|
|
1750
|
+
declare class CNodeCryptoEncryptionProvider extends AEncryptionProvider {
|
|
1751
|
+
private _defaultKdf;
|
|
1752
|
+
private _kdfOptions?;
|
|
1753
|
+
private _cachedKey?;
|
|
1754
|
+
private _cachedSalt?;
|
|
1755
|
+
private _cachedKdf?;
|
|
1756
|
+
private _cachedIter?;
|
|
1757
|
+
private _cachedHash?;
|
|
1758
|
+
setDefaultKey(key: TKeyProvider): void;
|
|
1759
|
+
clearKeys(): void;
|
|
1760
|
+
warmupKey(options?: IEncryptionContext): Promise<void>;
|
|
1761
|
+
/**
|
|
1762
|
+
* Synchronously pre-derives and caches the encryption key for subsequent synchronous operations.
|
|
1763
|
+
*/
|
|
1764
|
+
warmupKeySync(options?: IEncryptionContext): void;
|
|
1765
|
+
private resolveInfoBuffer;
|
|
1766
|
+
constructor(key?: TKeyProvider | IKeyPair, options?: ICNodeCryptoOptions);
|
|
1767
|
+
private resolveRawKeySync;
|
|
1768
|
+
private resolveRawKeyAsync;
|
|
1769
|
+
private deriveKeySync;
|
|
1770
|
+
private deriveKeyAsync;
|
|
1771
|
+
static isEncrypted(payload: any): boolean;
|
|
1772
|
+
isEncrypted(payload: any): boolean;
|
|
1773
|
+
/**
|
|
1774
|
+
* Synchronously encrypts a single value into an AES-GCM envelope using Node.js crypto.
|
|
1775
|
+
*/
|
|
1776
|
+
encryptValueSync(data: any, options?: IEncryptionContext): IEncryptedPayload;
|
|
1777
|
+
private decryptCiphertextWithKey;
|
|
1778
|
+
/**
|
|
1779
|
+
* Synchronously decrypts a single AES-GCM envelope back into its plaintext.
|
|
1780
|
+
*/
|
|
1781
|
+
decryptValueSync(payload: IEncryptedPayload, options?: IEncryptionContext): any;
|
|
1782
|
+
encryptSync(data: any, options?: IEncryptionContext): any;
|
|
1783
|
+
decryptSync(payload: any, options?: IEncryptionContext): any;
|
|
1784
|
+
encryptFieldsSync(data: any, fields: string[]): any;
|
|
1785
|
+
decryptFieldsSync(data: any, fields: string[]): any;
|
|
1786
|
+
encryptFields(data: any, fields: string[]): Promise<any>;
|
|
1787
|
+
decryptFields(data: any, fields: string[]): Promise<any>;
|
|
1788
|
+
encryptValue(data: any, options?: IEncryptionContext): Promise<IEncryptedPayload>;
|
|
1789
|
+
decryptValue(payload: IEncryptedPayload, options?: IEncryptionContext): Promise<any>;
|
|
1790
|
+
decrypt(payload: any, options?: IEncryptionContext): Promise<any>;
|
|
1791
|
+
}
|
|
1792
|
+
|
|
1793
|
+
/**
|
|
1794
|
+
* Universal factory function that creates and returns the appropriate IEncryptionProvider
|
|
1795
|
+
* instance according to the configured algorithm and cryptographic options.
|
|
1796
|
+
*
|
|
1797
|
+
* Algorithm dispatch:
|
|
1798
|
+
* - 'AES-GCM' (default): CWebCryptoEncryptionProvider
|
|
1799
|
+
* - 'AES-CBC' | 'AES-CBC-256+HMAC-SHA-256': CWebCryptoAESCBCProvider
|
|
1800
|
+
* - 'RSA-OAEP' | 'RSA-*': CRSAEncryptionProvider
|
|
1801
|
+
* - 'ECDH' | 'ECDH-*': CECDHEncryptionProvider
|
|
1802
|
+
* - 'NODE-CRYPTO' | sync: true: CNodeCryptoEncryptionProvider
|
|
1803
|
+
*/
|
|
1804
|
+
declare function createEncryptionProvider(options?: IProviderEncryptionOptions): IEncryptionProvider;
|
|
1805
|
+
|
|
1806
|
+
/**
|
|
1807
|
+
* Universal helper that verifies whether an arbitrary object is a Katlux encrypted payload envelope.
|
|
1808
|
+
*/
|
|
1809
|
+
declare function isEncrypted(payload: any): boolean;
|
|
1810
|
+
|
|
1811
|
+
export { AAPIDataProvider, ADataProvider, AEncryptionProvider, CAPIFlatClientDataProvider, CAPIFlatServerDataProvider, CAPITreeClientDataProvider, CAPITreeServerDataProvider, CApplicationCache, CBrowserSessionCache, CCookieCache, CECDHEncryptionProvider, CFlatClientDataProvider, CFlatServerDataProvider, CIndexedDBCache, CKeyManager, CLocalStorageCache, CMemoryCache, CNodeCryptoEncryptionProvider, CRSAEncryptionProvider, CServerSessionCache, CTreeClientDataProvider, CTreeServerDataProvider, CWebCryptoAESCBCProvider, CWebCryptoEncryptionProvider, CacheProviderFactory, DefaultHydrationAdapter, ECacheStrategy, EDataFilterOperator, EQueueStorage, KatluxIndexedDB, QueueStorageFactory, RequestProvider, RequestProviderRegistry, RequestQueue, SENSITIVE_HEADER_KEYS, applyOperator, buildEncryptionContext, clearCachedCipherProvider, clearSSRData, compareAnd, compareEqual, compareIn, compareOr, compareValues, createEncryptionProvider, debounce, decryptPageRows, evaluateFilter, fetchWithSSR, filterData, filterTreeData, getAppRoute, getAppRouter, getCipherProvider, getHydrationAdapter, getPlatformApp, getSSRData, getSSRPayload, isDataEncrypted, isEncrypted, onPlatformReady, setHydrationAdapter, sortData, useDebounce, useFilterLogic, useSortLogic };
|
|
1812
|
+
export type { CacheDriverLoader, ICNodeCryptoOptions, ICWebCryptoAESCBCOptions, ICWebCryptoOptions, ICacheEntry, ICacheQuotaOptions, IDataFilter, IDataProviderOptions, IDataProviderSetStateOptions, IDataProviderState, IDataResult, IDataSort, IDeadLetterItem, IDebouncedFunction, IEncryptedPayload, IEncryptionContext, IEncryptionProvider, IFlushOptions, IHKDFFromSecretOptions, IKDFOptions, IKDatatableAction, IKeyPair, IPlatformRouter, IProviderEncryptionOptions, IQueueStorageAdapter, IQueuedOperation, IRequestOptions, ISSRHydrationAdapter, ITreeDataProvider, ITreeDataProviderOptions, ITreeNode, ITreeNodeStatic, IVirtualScrollState, IWrappedKey, KProductItemData, KProductRowAction, TDataProviderListener, TDataProviderStateChangeListener, TDataRow, TECDHCurve, TKatluxStore, TKeyProvider, TPageDataHandler, TQueueItemStatus, TRawKey, TTreePageDataHandler, TTreeRow, TUnsubscribe, TreePaginationMode };
|