@brightchain/brightchain-lib 0.24.1 → 0.25.0
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/package.json +1 -1
- package/src/lib/brightChain.d.ts +16 -2
- package/src/lib/brightChain.d.ts.map +1 -1
- package/src/lib/brightChain.js +26 -4
- package/src/lib/brightChain.js.map +1 -1
- package/src/lib/constants.d.ts +8 -0
- package/src/lib/constants.d.ts.map +1 -1
- package/src/lib/constants.js +12 -3
- package/src/lib/constants.js.map +1 -1
- package/src/lib/documents/member/memberDocument.js +1 -1
- package/src/lib/documents/member/memberDocument.js.map +1 -1
- package/src/lib/documents/member/memberProfileDocument.js +1 -1
- package/src/lib/documents/member/memberProfileDocument.js.map +1 -1
- package/src/lib/documents/member/memberProfileHydration.d.ts.map +1 -1
- package/src/lib/documents/member/memberProfileHydration.js +18 -0
- package/src/lib/documents/member/memberProfileHydration.js.map +1 -1
- package/src/lib/enumerations/brightChainStrings.d.ts.map +1 -1
- package/src/lib/enumerations/brightChainStrings.js.map +1 -1
- package/src/lib/enumerations/brightPassStrings.d.ts +24 -11
- package/src/lib/enumerations/brightPassStrings.d.ts.map +1 -1
- package/src/lib/enumerations/brightPassStrings.js +25 -11
- package/src/lib/enumerations/brightPassStrings.js.map +1 -1
- package/src/lib/enumerations/index.d.ts +2 -1
- package/src/lib/enumerations/index.d.ts.map +1 -1
- package/src/lib/enumerations/index.js +3 -1
- package/src/lib/enumerations/index.js.map +1 -1
- package/src/lib/enumerations/writeMode.d.ts +22 -0
- package/src/lib/enumerations/writeMode.d.ts.map +1 -0
- package/src/lib/enumerations/writeMode.js +26 -0
- package/src/lib/enumerations/writeMode.js.map +1 -0
- package/src/lib/errors/index.d.ts +12 -0
- package/src/lib/errors/index.d.ts.map +1 -1
- package/src/lib/errors/index.js +15 -0
- package/src/lib/errors/index.js.map +1 -1
- package/src/lib/errors/writeAclErrors.d.ts +98 -0
- package/src/lib/errors/writeAclErrors.d.ts.map +1 -0
- package/src/lib/errors/writeAclErrors.js +159 -0
- package/src/lib/errors/writeAclErrors.js.map +1 -0
- package/src/lib/factories/blockStoreFactory.d.ts +4 -4
- package/src/lib/factories/blockStoreFactory.d.ts.map +1 -1
- package/src/lib/factories/blockStoreFactory.js +10 -4
- package/src/lib/factories/blockStoreFactory.js.map +1 -1
- package/src/lib/i18n/strings/brightpass/englishUK.d.ts +2 -2
- package/src/lib/i18n/strings/brightpass/englishUK.d.ts.map +1 -1
- package/src/lib/i18n/strings/brightpass/englishUs.d.ts +2 -2
- package/src/lib/i18n/strings/brightpass/englishUs.d.ts.map +1 -1
- package/src/lib/i18n/strings/brightpass/englishUs.js +25 -11
- package/src/lib/i18n/strings/brightpass/englishUs.js.map +1 -1
- package/src/lib/i18n/strings/brightpass/french.d.ts +2 -2
- package/src/lib/i18n/strings/brightpass/french.d.ts.map +1 -1
- package/src/lib/i18n/strings/brightpass/french.js +46 -17
- package/src/lib/i18n/strings/brightpass/french.js.map +1 -1
- package/src/lib/i18n/strings/brightpass/german.d.ts +2 -2
- package/src/lib/i18n/strings/brightpass/german.d.ts.map +1 -1
- package/src/lib/i18n/strings/brightpass/german.js +46 -17
- package/src/lib/i18n/strings/brightpass/german.js.map +1 -1
- package/src/lib/i18n/strings/brightpass/japanese.d.ts +2 -2
- package/src/lib/i18n/strings/brightpass/japanese.d.ts.map +1 -1
- package/src/lib/i18n/strings/brightpass/japanese.js +46 -17
- package/src/lib/i18n/strings/brightpass/japanese.js.map +1 -1
- package/src/lib/i18n/strings/brightpass/mandarin.d.ts +2 -2
- package/src/lib/i18n/strings/brightpass/mandarin.d.ts.map +1 -1
- package/src/lib/i18n/strings/brightpass/mandarin.js +46 -17
- package/src/lib/i18n/strings/brightpass/mandarin.js.map +1 -1
- package/src/lib/i18n/strings/brightpass/spanish.d.ts +2 -2
- package/src/lib/i18n/strings/brightpass/spanish.d.ts.map +1 -1
- package/src/lib/i18n/strings/brightpass/spanish.js +46 -17
- package/src/lib/i18n/strings/brightpass/spanish.js.map +1 -1
- package/src/lib/i18n/strings/brightpass/ukrainian.d.ts +2 -2
- package/src/lib/i18n/strings/brightpass/ukrainian.d.ts.map +1 -1
- package/src/lib/i18n/strings/brightpass/ukrainian.js +46 -17
- package/src/lib/i18n/strings/brightpass/ukrainian.js.map +1 -1
- package/src/lib/i18n/strings/french.d.ts.map +1 -1
- package/src/lib/i18n/strings/french.js +5 -5
- package/src/lib/i18n/strings/french.js.map +1 -1
- package/src/lib/i18n/strings/german.d.ts.map +1 -1
- package/src/lib/i18n/strings/german.js.map +1 -1
- package/src/lib/i18n/strings/japanese.d.ts.map +1 -1
- package/src/lib/i18n/strings/japanese.js.map +1 -1
- package/src/lib/i18n/strings/mandarin.d.ts.map +1 -1
- package/src/lib/i18n/strings/mandarin.js.map +1 -1
- package/src/lib/i18n/strings/spanish.d.ts.map +1 -1
- package/src/lib/i18n/strings/spanish.js.map +1 -1
- package/src/lib/i18n/strings/ukrainian.d.ts.map +1 -1
- package/src/lib/i18n/strings/ukrainian.js +1 -1
- package/src/lib/i18n/strings/ukrainian.js.map +1 -1
- package/src/lib/interfaces/auth/aclDocument.d.ts +32 -0
- package/src/lib/interfaces/auth/aclDocument.d.ts.map +1 -0
- package/src/lib/interfaces/auth/aclDocument.js +13 -0
- package/src/lib/interfaces/auth/aclDocument.js.map +1 -0
- package/src/lib/interfaces/auth/aclDocumentSerialization.d.ts +63 -0
- package/src/lib/interfaces/auth/aclDocumentSerialization.d.ts.map +1 -0
- package/src/lib/interfaces/auth/aclDocumentSerialization.js +99 -0
- package/src/lib/interfaces/auth/aclDocumentSerialization.js.map +1 -0
- package/src/lib/interfaces/auth/capabilityToken.d.ts +35 -0
- package/src/lib/interfaces/auth/capabilityToken.d.ts.map +1 -0
- package/src/lib/interfaces/auth/capabilityToken.js +14 -0
- package/src/lib/interfaces/auth/capabilityToken.js.map +1 -0
- package/src/lib/interfaces/auth/capabilityTokenSerialization.d.ts +55 -0
- package/src/lib/interfaces/auth/capabilityTokenSerialization.d.ts.map +1 -0
- package/src/lib/interfaces/auth/capabilityTokenSerialization.js +78 -0
- package/src/lib/interfaces/auth/capabilityTokenSerialization.js.map +1 -0
- package/src/lib/interfaces/auth/index.d.ts +10 -0
- package/src/lib/interfaces/auth/index.d.ts.map +1 -1
- package/src/lib/interfaces/auth/index.js +9 -1
- package/src/lib/interfaces/auth/index.js.map +1 -1
- package/src/lib/interfaces/auth/writeAcl.d.ts +44 -0
- package/src/lib/interfaces/auth/writeAcl.d.ts.map +1 -0
- package/src/lib/interfaces/auth/writeAcl.js +12 -0
- package/src/lib/interfaces/auth/writeAcl.js.map +1 -0
- package/src/lib/interfaces/auth/writeAclAuditLogger.d.ts +83 -0
- package/src/lib/interfaces/auth/writeAclAuditLogger.d.ts.map +1 -0
- package/src/lib/interfaces/auth/writeAclAuditLogger.js +13 -0
- package/src/lib/interfaces/auth/writeAclAuditLogger.js.map +1 -0
- package/src/lib/interfaces/auth/writeProof.d.ts +35 -0
- package/src/lib/interfaces/auth/writeProof.d.ts.map +1 -0
- package/src/lib/interfaces/auth/writeProof.js +13 -0
- package/src/lib/interfaces/auth/writeProof.js.map +1 -0
- package/src/lib/interfaces/auth/writeProofUtils.d.ts +34 -0
- package/src/lib/interfaces/auth/writeProofUtils.d.ts.map +1 -0
- package/src/lib/interfaces/auth/writeProofUtils.js +42 -0
- package/src/lib/interfaces/auth/writeProofUtils.js.map +1 -0
- package/src/lib/interfaces/availability/gossipService.d.ts +22 -2
- package/src/lib/interfaces/availability/gossipService.d.ts.map +1 -1
- package/src/lib/interfaces/availability/gossipService.js.map +1 -1
- package/src/lib/interfaces/member/memberData.d.ts +5 -0
- package/src/lib/interfaces/member/memberData.d.ts.map +1 -1
- package/src/lib/interfaces/member/profileStorage.d.ts +9 -0
- package/src/lib/interfaces/member/profileStorage.d.ts.map +1 -1
- package/src/lib/interfaces/services/index.d.ts +1 -0
- package/src/lib/interfaces/services/index.d.ts.map +1 -1
- package/src/lib/interfaces/services/writeAclService.d.ts +98 -0
- package/src/lib/interfaces/services/writeAclService.d.ts.map +1 -0
- package/src/lib/interfaces/services/writeAclService.js +13 -0
- package/src/lib/interfaces/services/writeAclService.js.map +1 -0
- package/src/lib/interfaces/storage/blockStore.d.ts +12 -3
- package/src/lib/interfaces/storage/blockStore.d.ts.map +1 -1
- package/src/lib/interfaces/storage/cloudBlockStoreConfig.d.ts +2 -2
- package/src/lib/interfaces/storage/cloudBlockStoreConfig.d.ts.map +1 -1
- package/src/lib/interfaces/storage/headRegistry.d.ts +7 -3
- package/src/lib/interfaces/storage/headRegistry.d.ts.map +1 -1
- package/src/lib/interfaces/storage/index.d.ts +1 -1
- package/src/lib/interfaces/storage/index.d.ts.map +1 -1
- package/src/lib/interfaces/storage/index.js.map +1 -1
- package/src/lib/interfaces/storage/universalBlockStore.d.ts +2 -1
- package/src/lib/interfaces/storage/universalBlockStore.d.ts.map +1 -1
- package/src/lib/services/member/memberCblService.d.ts.map +1 -1
- package/src/lib/services/member/memberCblService.js +1 -1
- package/src/lib/services/member/memberCblService.js.map +1 -1
- package/src/lib/services/memberStore.d.ts.map +1 -1
- package/src/lib/services/memberStore.js +4 -0
- package/src/lib/services/memberStore.js.map +1 -1
- package/src/lib/stores/blockStoreAdapter.d.ts +2 -1
- package/src/lib/stores/blockStoreAdapter.d.ts.map +1 -1
- package/src/lib/stores/blockStoreAdapter.js +4 -2
- package/src/lib/stores/blockStoreAdapter.js.map +1 -1
- package/src/lib/stores/memoryBlockStore.d.ts +38 -12
- package/src/lib/stores/memoryBlockStore.d.ts.map +1 -1
- package/src/lib/stores/memoryBlockStore.js +170 -70
- package/src/lib/stores/memoryBlockStore.js.map +1 -1
- package/src/lib/stores/pooledMemoryBlockStore.d.ts +1 -1
- package/src/lib/stores/pooledMemoryBlockStore.d.ts.map +1 -1
- package/src/lib/stores/pooledMemoryBlockStore.js +1 -1
- package/src/lib/stores/pooledMemoryBlockStore.js.map +1 -1
|
@@ -20,8 +20,11 @@ import { MemoryBlockMetadataStore } from './memoryBlockMetadataStore';
|
|
|
20
20
|
* @see IBlockStore for the interface definition
|
|
21
21
|
*/
|
|
22
22
|
export declare class MemoryBlockStore implements IBlockStore {
|
|
23
|
+
/**
|
|
24
|
+
* Per-size block maps. Only maps for configured supportedBlockSizes are initialized.
|
|
25
|
+
*/
|
|
23
26
|
private readonly blocks;
|
|
24
|
-
private readonly
|
|
27
|
+
private readonly _supportedBlockSizes;
|
|
25
28
|
/**
|
|
26
29
|
* Optional FEC service for parity generation and recovery.
|
|
27
30
|
* If not provided, FEC operations will return errors or no-ops.
|
|
@@ -38,11 +41,16 @@ export declare class MemoryBlockStore implements IBlockStore {
|
|
|
38
41
|
private readonly parityBlocks;
|
|
39
42
|
/**
|
|
40
43
|
* Create a new MemoryBlockStore.
|
|
41
|
-
* @param
|
|
44
|
+
* @param blockSizeOrSizes - A single BlockSize (backward compat) or an array of supported BlockSize values
|
|
42
45
|
* @param fecService - Optional FEC service for parity generation and recovery
|
|
43
46
|
* @param metadataStore - Optional metadata store (creates new one if not provided)
|
|
44
47
|
*/
|
|
45
|
-
constructor(
|
|
48
|
+
constructor(blockSizeOrSizes: BlockSize | readonly BlockSize[], fecService?: IFecService | null, metadataStore?: MemoryBlockMetadataStore);
|
|
49
|
+
get supportedBlockSizes(): readonly BlockSize[];
|
|
50
|
+
/**
|
|
51
|
+
* Backward-compatible getter: returns the first supported block size.
|
|
52
|
+
* @deprecated Use supportedBlockSizes instead.
|
|
53
|
+
*/
|
|
46
54
|
get blockSize(): BlockSize;
|
|
47
55
|
/**
|
|
48
56
|
* Get the FEC service if available.
|
|
@@ -67,29 +75,47 @@ export declare class MemoryBlockStore implements IBlockStore {
|
|
|
67
75
|
*/
|
|
68
76
|
private hexToChecksum;
|
|
69
77
|
/**
|
|
70
|
-
*
|
|
78
|
+
* Find a block by key across all configured size maps.
|
|
79
|
+
* @returns The block if found, or undefined
|
|
80
|
+
*/
|
|
81
|
+
private findBlock;
|
|
82
|
+
/**
|
|
83
|
+
* Check if a block exists in any size map (synchronous, no metadata).
|
|
84
|
+
*/
|
|
85
|
+
private hasBlock;
|
|
86
|
+
/**
|
|
87
|
+
* Set a block directly in the correct size map (for internal use like recovery).
|
|
88
|
+
*/
|
|
89
|
+
private setBlock;
|
|
90
|
+
/**
|
|
91
|
+
* Check if a block exists (searches across all configured size maps)
|
|
71
92
|
*/
|
|
72
93
|
has(key: Checksum | string): Promise<boolean>;
|
|
73
94
|
/**
|
|
74
|
-
* Get a block's data
|
|
95
|
+
* Get a block's data (searches across all configured size maps)
|
|
75
96
|
*/
|
|
76
97
|
getData(key: Checksum): Promise<RawDataBlock>;
|
|
77
98
|
/**
|
|
78
99
|
* Store a block's data with optional durability settings.
|
|
100
|
+
* Validates that block.blockSize is in supportedBlockSizes before accepting.
|
|
79
101
|
* @param block - The block to store
|
|
80
102
|
* @param options - Optional storage options including durability level and expiration
|
|
81
103
|
*/
|
|
82
104
|
setData(block: RawDataBlock, options?: BlockStoreOptions): Promise<void>;
|
|
83
105
|
/**
|
|
84
|
-
* Delete a block's data (and associated parity blocks and metadata)
|
|
106
|
+
* Delete a block's data (and associated parity blocks and metadata).
|
|
107
|
+
* Searches across all configured size maps.
|
|
85
108
|
*/
|
|
86
109
|
deleteData(key: Checksum): Promise<void>;
|
|
87
110
|
/**
|
|
88
|
-
* Get random block checksums from the store
|
|
111
|
+
* Get random block checksums from the store for a specific block size.
|
|
112
|
+
* @param count - Number of random block checksums to return
|
|
113
|
+
* @param blockSize - The block size pool to draw from (must be in supportedBlockSizes)
|
|
89
114
|
*/
|
|
90
|
-
getRandomBlocks(count: number): Promise<Checksum[]>;
|
|
115
|
+
getRandomBlocks(count: number, blockSize: BlockSize): Promise<Checksum[]>;
|
|
91
116
|
/**
|
|
92
|
-
* Store a
|
|
117
|
+
* Store raw data with a key (convenience method).
|
|
118
|
+
* Uses the first supported block size for block creation.
|
|
93
119
|
*/
|
|
94
120
|
put(key: Checksum | string, data: Uint8Array, options?: BlockStoreOptions): Promise<void>;
|
|
95
121
|
/**
|
|
@@ -101,15 +127,15 @@ export declare class MemoryBlockStore implements IBlockStore {
|
|
|
101
127
|
*/
|
|
102
128
|
static randomId(): string;
|
|
103
129
|
/**
|
|
104
|
-
* Clear all blocks, metadata, and parity data
|
|
130
|
+
* Clear all blocks, metadata, and parity data across all size maps
|
|
105
131
|
*/
|
|
106
132
|
clear(): void;
|
|
107
133
|
/**
|
|
108
|
-
* Get total number of blocks
|
|
134
|
+
* Get total number of blocks across all size maps
|
|
109
135
|
*/
|
|
110
136
|
size(): number;
|
|
111
137
|
/**
|
|
112
|
-
* Get a handle to a block
|
|
138
|
+
* Get a handle to a block (searches across all configured size maps)
|
|
113
139
|
*/
|
|
114
140
|
get<T extends BaseBlock>(key: Checksum | string): BlockHandle<T>;
|
|
115
141
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memoryBlockStore.d.ts","sourceRoot":"","sources":["../../../../../brightchain-lib/src/lib/stores/memoryBlockStore.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAqB,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAatD,OAAO,EAAE,WAAW,EAAc,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EACL,iBAAiB,EACjB,cAAc,EAEd,cAAc,EACd,cAAc,EACf,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,oCAAoC,CAAC;AAG5C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAWtE;;;;;;;;;;GAUG;AACH,qBAAa,gBAAiB,YAAW,WAAW;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"memoryBlockStore.d.ts","sourceRoot":"","sources":["../../../../../brightchain-lib/src/lib/stores/memoryBlockStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,8 +39,11 @@ function toStorageKey(hex) {
|
|
|
39
39
|
* @see IBlockStore for the interface definition
|
|
40
40
|
*/
|
|
41
41
|
class MemoryBlockStore {
|
|
42
|
+
/**
|
|
43
|
+
* Per-size block maps. Only maps for configured supportedBlockSizes are initialized.
|
|
44
|
+
*/
|
|
42
45
|
blocks = new Map();
|
|
43
|
-
|
|
46
|
+
_supportedBlockSizes;
|
|
44
47
|
/**
|
|
45
48
|
* Optional FEC service for parity generation and recovery.
|
|
46
49
|
* If not provided, FEC operations will return errors or no-ops.
|
|
@@ -57,17 +60,30 @@ class MemoryBlockStore {
|
|
|
57
60
|
parityBlocks = new Map();
|
|
58
61
|
/**
|
|
59
62
|
* Create a new MemoryBlockStore.
|
|
60
|
-
* @param
|
|
63
|
+
* @param blockSizeOrSizes - A single BlockSize (backward compat) or an array of supported BlockSize values
|
|
61
64
|
* @param fecService - Optional FEC service for parity generation and recovery
|
|
62
65
|
* @param metadataStore - Optional metadata store (creates new one if not provided)
|
|
63
66
|
*/
|
|
64
|
-
constructor(
|
|
65
|
-
this.
|
|
67
|
+
constructor(blockSizeOrSizes, fecService, metadataStore) {
|
|
68
|
+
this._supportedBlockSizes = Array.isArray(blockSizeOrSizes)
|
|
69
|
+
? blockSizeOrSizes
|
|
70
|
+
: [blockSizeOrSizes];
|
|
71
|
+
// Initialize per-size maps only for configured sizes
|
|
72
|
+
for (const size of this._supportedBlockSizes) {
|
|
73
|
+
this.blocks.set(size, new Map());
|
|
74
|
+
}
|
|
66
75
|
this.fecService = fecService ?? null;
|
|
67
76
|
this.metadataStore = metadataStore ?? new memoryBlockMetadataStore_1.MemoryBlockMetadataStore();
|
|
68
77
|
}
|
|
78
|
+
get supportedBlockSizes() {
|
|
79
|
+
return this._supportedBlockSizes;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Backward-compatible getter: returns the first supported block size.
|
|
83
|
+
* @deprecated Use supportedBlockSizes instead.
|
|
84
|
+
*/
|
|
69
85
|
get blockSize() {
|
|
70
|
-
return this.
|
|
86
|
+
return this._supportedBlockSizes[0];
|
|
71
87
|
}
|
|
72
88
|
/**
|
|
73
89
|
* Get the FEC service if available.
|
|
@@ -100,37 +116,85 @@ class MemoryBlockStore {
|
|
|
100
116
|
return checksum_1.Checksum.fromHex(hex);
|
|
101
117
|
}
|
|
102
118
|
/**
|
|
103
|
-
*
|
|
119
|
+
* Find a block by key across all configured size maps.
|
|
120
|
+
* @returns The block if found, or undefined
|
|
121
|
+
*/
|
|
122
|
+
findBlock(keyHex) {
|
|
123
|
+
for (const sizeMap of this.blocks.values()) {
|
|
124
|
+
const block = sizeMap.get(keyHex);
|
|
125
|
+
if (block)
|
|
126
|
+
return block;
|
|
127
|
+
}
|
|
128
|
+
return undefined;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Check if a block exists in any size map (synchronous, no metadata).
|
|
132
|
+
*/
|
|
133
|
+
hasBlock(keyHex) {
|
|
134
|
+
for (const sizeMap of this.blocks.values()) {
|
|
135
|
+
if (sizeMap.has(keyHex))
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Set a block directly in the correct size map (for internal use like recovery).
|
|
142
|
+
*/
|
|
143
|
+
setBlock(keyHex, block) {
|
|
144
|
+
const sizeMap = this.blocks.get(block.blockSize);
|
|
145
|
+
if (sizeMap) {
|
|
146
|
+
sizeMap.set(keyHex, block);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Check if a block exists (searches across all configured size maps)
|
|
104
151
|
*/
|
|
105
152
|
async has(key) {
|
|
106
153
|
const keyHex = this.keyToHex(key);
|
|
107
|
-
|
|
154
|
+
for (const sizeMap of this.blocks.values()) {
|
|
155
|
+
if (sizeMap.has(keyHex)) {
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return false;
|
|
108
160
|
}
|
|
109
161
|
/**
|
|
110
|
-
* Get a block's data
|
|
162
|
+
* Get a block's data (searches across all configured size maps)
|
|
111
163
|
*/
|
|
112
164
|
async getData(key) {
|
|
113
165
|
const keyHex = this.keyToHex(key);
|
|
114
|
-
const
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
166
|
+
for (const sizeMap of this.blocks.values()) {
|
|
167
|
+
const block = sizeMap.get(keyHex);
|
|
168
|
+
if (block) {
|
|
169
|
+
// Record access in metadata
|
|
170
|
+
if (this.metadataStore.has(keyHex)) {
|
|
171
|
+
await this.metadataStore.recordAccess(toStorageKey(keyHex));
|
|
172
|
+
}
|
|
173
|
+
return block;
|
|
174
|
+
}
|
|
123
175
|
}
|
|
124
|
-
|
|
176
|
+
throw new storeError_1.StoreError(storeErrorType_1.StoreErrorType.KeyNotFound, undefined, {
|
|
177
|
+
KEY: keyHex,
|
|
178
|
+
});
|
|
125
179
|
}
|
|
126
180
|
/**
|
|
127
181
|
* Store a block's data with optional durability settings.
|
|
182
|
+
* Validates that block.blockSize is in supportedBlockSizes before accepting.
|
|
128
183
|
* @param block - The block to store
|
|
129
184
|
* @param options - Optional storage options including durability level and expiration
|
|
130
185
|
*/
|
|
131
186
|
async setData(block, options) {
|
|
187
|
+
// Validate block size membership
|
|
188
|
+
if (!this._supportedBlockSizes.includes(block.blockSize)) {
|
|
189
|
+
throw new storeError_1.StoreError(storeErrorType_1.StoreErrorType.BlockValidationFailed);
|
|
190
|
+
}
|
|
132
191
|
const keyHex = block.idChecksum.toHex();
|
|
133
|
-
|
|
192
|
+
// Check idempotency across all size maps
|
|
193
|
+
const sizeMap = this.blocks.get(block.blockSize);
|
|
194
|
+
if (!sizeMap) {
|
|
195
|
+
throw new storeError_1.StoreError(storeErrorType_1.StoreErrorType.BlockValidationFailed);
|
|
196
|
+
}
|
|
197
|
+
if (sizeMap.has(keyHex)) {
|
|
134
198
|
return; // Idempotent - block already exists
|
|
135
199
|
}
|
|
136
200
|
try {
|
|
@@ -139,11 +203,9 @@ class MemoryBlockStore {
|
|
|
139
203
|
catch {
|
|
140
204
|
throw new storeError_1.StoreError(storeErrorType_1.StoreErrorType.BlockValidationFailed);
|
|
141
205
|
}
|
|
142
|
-
// Store the block
|
|
143
|
-
|
|
206
|
+
// Store the block in the correct size-specific map
|
|
207
|
+
sizeMap.set(keyHex, block);
|
|
144
208
|
// Create metadata for the block
|
|
145
|
-
// keyHex is the SHA3-512 checksum hex (128 chars) used as the storage key.
|
|
146
|
-
// We cast it directly to BlockId since it serves as an opaque storage key here.
|
|
147
209
|
const metadata = (0, blockMetadata_1.createDefaultBlockMetadata)(keyHex, block.data.length, keyHex, options);
|
|
148
210
|
await this.metadataStore.create(metadata);
|
|
149
211
|
// Generate parity blocks based on durability level
|
|
@@ -160,15 +222,22 @@ class MemoryBlockStore {
|
|
|
160
222
|
}
|
|
161
223
|
}
|
|
162
224
|
/**
|
|
163
|
-
* Delete a block's data (and associated parity blocks and metadata)
|
|
225
|
+
* Delete a block's data (and associated parity blocks and metadata).
|
|
226
|
+
* Searches across all configured size maps.
|
|
164
227
|
*/
|
|
165
228
|
async deleteData(key) {
|
|
166
229
|
const keyHex = this.keyToHex(key);
|
|
167
|
-
|
|
230
|
+
let found = false;
|
|
231
|
+
for (const sizeMap of this.blocks.values()) {
|
|
232
|
+
if (sizeMap.has(keyHex)) {
|
|
233
|
+
sizeMap.delete(keyHex);
|
|
234
|
+
found = true;
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
if (!found) {
|
|
168
239
|
throw new storeError_1.StoreError(storeErrorType_1.StoreErrorType.KeyNotFound);
|
|
169
240
|
}
|
|
170
|
-
// Delete the block data
|
|
171
|
-
this.blocks.delete(keyHex);
|
|
172
241
|
// Delete parity blocks
|
|
173
242
|
this.parityBlocks.delete(keyHex);
|
|
174
243
|
// Delete metadata (if exists)
|
|
@@ -177,10 +246,19 @@ class MemoryBlockStore {
|
|
|
177
246
|
}
|
|
178
247
|
}
|
|
179
248
|
/**
|
|
180
|
-
* Get random block checksums from the store
|
|
249
|
+
* Get random block checksums from the store for a specific block size.
|
|
250
|
+
* @param count - Number of random block checksums to return
|
|
251
|
+
* @param blockSize - The block size pool to draw from (must be in supportedBlockSizes)
|
|
181
252
|
*/
|
|
182
|
-
async getRandomBlocks(count) {
|
|
183
|
-
|
|
253
|
+
async getRandomBlocks(count, blockSize) {
|
|
254
|
+
if (!this._supportedBlockSizes.includes(blockSize)) {
|
|
255
|
+
throw new storeError_1.StoreError(storeErrorType_1.StoreErrorType.BlockValidationFailed);
|
|
256
|
+
}
|
|
257
|
+
const sizeMap = this.blocks.get(blockSize);
|
|
258
|
+
if (!sizeMap) {
|
|
259
|
+
return [];
|
|
260
|
+
}
|
|
261
|
+
const allKeys = Array.from(sizeMap.keys());
|
|
184
262
|
const result = [];
|
|
185
263
|
const actualCount = Math.min(count, allKeys.length);
|
|
186
264
|
const shuffled = [...allKeys].sort(() => Math.random() - 0.5);
|
|
@@ -191,14 +269,17 @@ class MemoryBlockStore {
|
|
|
191
269
|
return result;
|
|
192
270
|
}
|
|
193
271
|
/**
|
|
194
|
-
* Store a
|
|
272
|
+
* Store raw data with a key (convenience method).
|
|
273
|
+
* Uses the first supported block size for block creation.
|
|
195
274
|
*/
|
|
196
275
|
async put(key, data, options) {
|
|
197
|
-
|
|
198
|
-
|
|
276
|
+
// Determine the appropriate block size for this data
|
|
277
|
+
const targetSize = this._supportedBlockSizes.find((size) => size === blockSize_1.BlockSize.Unknown || data.length <= size) ?? this._supportedBlockSizes[0];
|
|
278
|
+
if (targetSize !== blockSize_1.BlockSize.Unknown &&
|
|
279
|
+
data.length > targetSize) {
|
|
199
280
|
throw new storeError_1.StoreError(storeErrorType_1.StoreErrorType.BlockValidationFailed);
|
|
200
281
|
}
|
|
201
|
-
const block = new rawData_1.RawDataBlock(
|
|
282
|
+
const block = new rawData_1.RawDataBlock(targetSize, data);
|
|
202
283
|
await this.setData(block, options);
|
|
203
284
|
}
|
|
204
285
|
/**
|
|
@@ -217,32 +298,40 @@ class MemoryBlockStore {
|
|
|
217
298
|
return Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('');
|
|
218
299
|
}
|
|
219
300
|
/**
|
|
220
|
-
* Clear all blocks, metadata, and parity data
|
|
301
|
+
* Clear all blocks, metadata, and parity data across all size maps
|
|
221
302
|
*/
|
|
222
303
|
clear() {
|
|
223
|
-
this.blocks.
|
|
304
|
+
for (const sizeMap of this.blocks.values()) {
|
|
305
|
+
sizeMap.clear();
|
|
306
|
+
}
|
|
224
307
|
this.parityBlocks.clear();
|
|
225
308
|
this.metadataStore.clear();
|
|
226
309
|
}
|
|
227
310
|
/**
|
|
228
|
-
* Get total number of blocks
|
|
311
|
+
* Get total number of blocks across all size maps
|
|
229
312
|
*/
|
|
230
313
|
size() {
|
|
231
|
-
|
|
314
|
+
let total = 0;
|
|
315
|
+
for (const sizeMap of this.blocks.values()) {
|
|
316
|
+
total += sizeMap.size;
|
|
317
|
+
}
|
|
318
|
+
return total;
|
|
232
319
|
}
|
|
233
320
|
/**
|
|
234
|
-
* Get a handle to a block
|
|
321
|
+
* Get a handle to a block (searches across all configured size maps)
|
|
235
322
|
*/
|
|
236
323
|
get(key) {
|
|
237
324
|
const keyHex = this.keyToHex(key);
|
|
238
|
-
const
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
325
|
+
for (const sizeMap of this.blocks.values()) {
|
|
326
|
+
const block = sizeMap.get(keyHex);
|
|
327
|
+
if (block) {
|
|
328
|
+
const checksum = typeof key === 'string' ? this.hexToChecksum(key) : key;
|
|
329
|
+
return (0, handle_1.createBlockHandle)(rawData_1.RawDataBlock, block.blockSize, block.data, checksum, block.canRead, block.canPersist);
|
|
330
|
+
}
|
|
243
331
|
}
|
|
244
|
-
|
|
245
|
-
|
|
332
|
+
throw new storeError_1.StoreError(storeErrorType_1.StoreErrorType.KeyNotFound, undefined, {
|
|
333
|
+
KEY: keyHex,
|
|
334
|
+
});
|
|
246
335
|
}
|
|
247
336
|
// === Metadata Operations ===
|
|
248
337
|
/**
|
|
@@ -285,7 +374,7 @@ class MemoryBlockStore {
|
|
|
285
374
|
});
|
|
286
375
|
}
|
|
287
376
|
// Check if block exists
|
|
288
|
-
const block = this.
|
|
377
|
+
const block = this.findBlock(keyHex);
|
|
289
378
|
if (!block) {
|
|
290
379
|
throw new storeError_1.StoreError(storeErrorType_1.StoreErrorType.KeyNotFound, undefined, {
|
|
291
380
|
KEY: keyHex,
|
|
@@ -366,15 +455,19 @@ class MemoryBlockStore {
|
|
|
366
455
|
}
|
|
367
456
|
try {
|
|
368
457
|
// Get corrupted data if block still exists
|
|
369
|
-
const existingBlock = this.
|
|
458
|
+
const existingBlock = this.findBlock(keyHex);
|
|
370
459
|
const corruptedData = existingBlock ? existingBlock.data : null;
|
|
371
460
|
// Attempt recovery
|
|
372
461
|
const result = await this.fecService.recoverFileData(corruptedData, parityData, metadata.size);
|
|
373
462
|
if (result.recovered) {
|
|
463
|
+
// Determine the block size from existing block or first supported size
|
|
464
|
+
const recoveryBlockSize = existingBlock
|
|
465
|
+
? existingBlock.blockSize
|
|
466
|
+
: this._supportedBlockSizes[0];
|
|
374
467
|
// Create a new block with recovered data
|
|
375
|
-
const recoveredBlock = new rawData_1.RawDataBlock(
|
|
376
|
-
// Update the stored block
|
|
377
|
-
this.
|
|
468
|
+
const recoveredBlock = new rawData_1.RawDataBlock(recoveryBlockSize, new Uint8Array(result.data));
|
|
469
|
+
// Update the stored block in the correct size map
|
|
470
|
+
this.setBlock(keyHex, recoveredBlock);
|
|
378
471
|
return {
|
|
379
472
|
success: true,
|
|
380
473
|
recoveredBlock,
|
|
@@ -404,16 +497,16 @@ class MemoryBlockStore {
|
|
|
404
497
|
// Check if FEC service is available
|
|
405
498
|
if (!this.fecService) {
|
|
406
499
|
// Without FEC service, we can only verify the block exists
|
|
407
|
-
return this.
|
|
500
|
+
return this.hasBlock(keyHex);
|
|
408
501
|
}
|
|
409
502
|
// Check if FEC service is available in the environment
|
|
410
503
|
const isAvailable = await this.fecService.isAvailable();
|
|
411
504
|
if (!isAvailable) {
|
|
412
505
|
// Without FEC service, we can only verify the block exists
|
|
413
|
-
return this.
|
|
506
|
+
return this.hasBlock(keyHex);
|
|
414
507
|
}
|
|
415
508
|
// Get block data
|
|
416
|
-
const block = this.
|
|
509
|
+
const block = this.findBlock(keyHex);
|
|
417
510
|
if (!block) {
|
|
418
511
|
return false;
|
|
419
512
|
}
|
|
@@ -527,14 +620,14 @@ class MemoryBlockStore {
|
|
|
527
620
|
async brightenBlock(key, randomBlockCount) {
|
|
528
621
|
const keyHex = this.keyToHex(key);
|
|
529
622
|
// Verify source block exists
|
|
530
|
-
const sourceBlock = this.
|
|
623
|
+
const sourceBlock = this.findBlock(keyHex);
|
|
531
624
|
if (!sourceBlock) {
|
|
532
625
|
throw new storeError_1.StoreError(storeErrorType_1.StoreErrorType.KeyNotFound, undefined, {
|
|
533
626
|
KEY: keyHex,
|
|
534
627
|
});
|
|
535
628
|
}
|
|
536
|
-
// Get random blocks for XOR operation
|
|
537
|
-
const randomBlockChecksums = await this.getRandomBlocks(randomBlockCount);
|
|
629
|
+
// Get random blocks for XOR operation (same size as source block)
|
|
630
|
+
const randomBlockChecksums = await this.getRandomBlocks(randomBlockCount, sourceBlock.blockSize);
|
|
538
631
|
// Check if we have enough random blocks
|
|
539
632
|
if (randomBlockChecksums.length < randomBlockCount) {
|
|
540
633
|
throw new storeError_1.StoreError(storeErrorType_1.StoreErrorType.InsufficientRandomBlocks, undefined, {
|
|
@@ -555,11 +648,11 @@ class MemoryBlockStore {
|
|
|
555
648
|
];
|
|
556
649
|
// Perform XOR operation using XorService: source XOR random1 XOR random2 XOR ...
|
|
557
650
|
const brightenedData = xor_1.XorService.xorMultiple(allBlockData);
|
|
558
|
-
// Create the brightened block
|
|
559
|
-
const brightenedBlock = new rawData_1.RawDataBlock(
|
|
651
|
+
// Create the brightened block (same size as source)
|
|
652
|
+
const brightenedBlock = new rawData_1.RawDataBlock(sourceBlock.blockSize, brightenedData);
|
|
560
653
|
const brightenedBlockId = brightenedBlock.idChecksum.toHex();
|
|
561
654
|
// Store the brightened block if it doesn't already exist
|
|
562
|
-
if (!this.
|
|
655
|
+
if (!this.hasBlock(brightenedBlockId)) {
|
|
563
656
|
await this.setData(brightenedBlock);
|
|
564
657
|
}
|
|
565
658
|
// Get the random block IDs as hex strings
|
|
@@ -595,13 +688,15 @@ class MemoryBlockStore {
|
|
|
595
688
|
});
|
|
596
689
|
}
|
|
597
690
|
// 1. Pad CBL to block size (includes length prefix)
|
|
598
|
-
|
|
691
|
+
// Use the first supported block size for CBL operations
|
|
692
|
+
const cblBlockSize = this._supportedBlockSizes[0];
|
|
693
|
+
const paddedCbl = (0, xorUtils_1.padToBlockSize)(cblData, cblBlockSize);
|
|
599
694
|
// Validate that padded CBL fits within block size
|
|
600
|
-
if (paddedCbl.length >
|
|
695
|
+
if (paddedCbl.length > cblBlockSize) {
|
|
601
696
|
throw new storeError_1.StoreError(storeErrorType_1.StoreErrorType.BlockValidationFailed, undefined, {
|
|
602
697
|
ERROR: (0, i18n_1.translate)(enumerations_1.BrightChainStrings.MemoryBlockStore_CBLDataTooLargeTemplate, {
|
|
603
698
|
LENGTH: paddedCbl.length,
|
|
604
|
-
BLOCK_SIZE:
|
|
699
|
+
BLOCK_SIZE: cblBlockSize,
|
|
605
700
|
}),
|
|
606
701
|
});
|
|
607
702
|
}
|
|
@@ -618,7 +713,7 @@ class MemoryBlockStore {
|
|
|
618
713
|
// 4. Store first block (R - the randomizer block)
|
|
619
714
|
// Note: If this was selected from existing blocks, it's already stored
|
|
620
715
|
// We still create a block handle for it to get the ID
|
|
621
|
-
const block1 = new rawData_1.RawDataBlock(
|
|
716
|
+
const block1 = new rawData_1.RawDataBlock(cblBlockSize, randomBlock);
|
|
622
717
|
const block1Checksum = block1.idChecksum;
|
|
623
718
|
// Only store if not already in the store
|
|
624
719
|
if (!(await this.has(block1Checksum))) {
|
|
@@ -627,7 +722,7 @@ class MemoryBlockStore {
|
|
|
627
722
|
}
|
|
628
723
|
block1Id = toStorageKey(block1Checksum.toHex());
|
|
629
724
|
// 5. Store second block (CBL XOR R)
|
|
630
|
-
const block2 = new rawData_1.RawDataBlock(
|
|
725
|
+
const block2 = new rawData_1.RawDataBlock(cblBlockSize, xorResult);
|
|
631
726
|
await this.setData(block2, options);
|
|
632
727
|
const block2Id = toStorageKey(block2.idChecksum.toHex());
|
|
633
728
|
// 6. Get parity block IDs if FEC redundancy was applied
|
|
@@ -642,11 +737,11 @@ class MemoryBlockStore {
|
|
|
642
737
|
block2ParityIds = block2Meta.parityBlockIds;
|
|
643
738
|
}
|
|
644
739
|
// 7. Generate magnet URL
|
|
645
|
-
const magnetUrl = this.generateCBLMagnetUrl(block1Id, block2Id,
|
|
740
|
+
const magnetUrl = this.generateCBLMagnetUrl(block1Id, block2Id, cblBlockSize, block1ParityIds, block2ParityIds, options?.isEncrypted);
|
|
646
741
|
return {
|
|
647
742
|
blockId1: block1Id,
|
|
648
743
|
blockId2: block2Id,
|
|
649
|
-
blockSize:
|
|
744
|
+
blockSize: cblBlockSize,
|
|
650
745
|
magnetUrl,
|
|
651
746
|
block1ParityIds,
|
|
652
747
|
block2ParityIds,
|
|
@@ -678,15 +773,20 @@ class MemoryBlockStore {
|
|
|
678
773
|
* @returns A Uint8Array containing the randomizer data
|
|
679
774
|
*/
|
|
680
775
|
async selectOrGenerateRandomizer(size) {
|
|
681
|
-
//
|
|
682
|
-
const blockIds =
|
|
776
|
+
// Collect all block keys across all size maps
|
|
777
|
+
const blockIds = [];
|
|
778
|
+
for (const sizeMap of this.blocks.values()) {
|
|
779
|
+
for (const key of sizeMap.keys()) {
|
|
780
|
+
blockIds.push(key);
|
|
781
|
+
}
|
|
782
|
+
}
|
|
683
783
|
// If we have existing blocks, try to use one as a randomizer
|
|
684
784
|
if (blockIds.length > 0) {
|
|
685
785
|
// Select a random block from the existing blocks
|
|
686
786
|
const randomIndex = Math.floor(Math.random() * blockIds.length);
|
|
687
787
|
const selectedBlockId = blockIds[randomIndex];
|
|
688
788
|
try {
|
|
689
|
-
const block = this.
|
|
789
|
+
const block = this.findBlock(selectedBlockId);
|
|
690
790
|
if (block && block.data.length >= size) {
|
|
691
791
|
// Use the first 'size' bytes of the existing block as the randomizer
|
|
692
792
|
return block.data.slice(0, size);
|