@aws-sdk/sha256-tree-hash 3.29.0 → 3.36.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/CHANGELOG.md +38 -0
- package/dist-cjs/index.js +77 -0
- package/dist-es/index.js +94 -0
- package/{dist/types → dist-types}/index.d.ts +0 -0
- package/{dist/types → dist-types}/ts3.4/index.d.ts +0 -0
- package/package.json +16 -12
- package/dist/cjs/index.js +0 -109
- package/dist/es/index.js +0 -125
- package/src/index.ts +0 -119
- package/tsconfig.cjs.json +0 -10
- package/tsconfig.es.json +0 -11
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,44 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [3.36.0](https://github.com/aws/aws-sdk-js-v3/compare/v3.35.0...v3.36.0) (2021-10-08)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* publish files in dist-* only ([#2873](https://github.com/aws/aws-sdk-js-v3/issues/2873)) ([53b4243](https://github.com/aws/aws-sdk-js-v3/commit/53b4243b066f25ff2412d5f0dea1036054b2df32))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# [3.35.0](https://github.com/aws/aws-sdk-js-v3/compare/v3.34.0...v3.35.0) (2021-10-04)
|
|
18
|
+
|
|
19
|
+
**Note:** Version bump only for package @aws-sdk/sha256-tree-hash
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# [3.34.0](https://github.com/aws/aws-sdk-js-v3/compare/v3.33.0...v3.34.0) (2021-09-24)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
### Features
|
|
29
|
+
|
|
30
|
+
* **non-clients:** remove comments from transpiled JS files ([#2813](https://github.com/aws/aws-sdk-js-v3/issues/2813)) ([e6fc7f3](https://github.com/aws/aws-sdk-js-v3/commit/e6fc7f3e0fa74785590ac19e7ed143c916bb9b6e))
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
# [3.32.0](https://github.com/aws/aws-sdk-js-v3/compare/v3.31.0...v3.32.0) (2021-09-17)
|
|
37
|
+
|
|
38
|
+
**Note:** Version bump only for package @aws-sdk/sha256-tree-hash
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
6
44
|
# [3.29.0](https://github.com/aws/aws-sdk-js-v3/compare/v3.28.0...v3.29.0) (2021-09-02)
|
|
7
45
|
|
|
8
46
|
**Note:** Version bump only for package @aws-sdk/sha256-tree-hash
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TreeHash = void 0;
|
|
4
|
+
const MiB = 1048576;
|
|
5
|
+
class TreeHash {
|
|
6
|
+
constructor(Sha256, fromUtf8) {
|
|
7
|
+
this.Sha256 = Sha256;
|
|
8
|
+
this.fromUtf8 = fromUtf8;
|
|
9
|
+
this.collectedHashDigests = [];
|
|
10
|
+
}
|
|
11
|
+
hashBuffer() {
|
|
12
|
+
if (!this.buffer) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
let remainingSize = this.buffer.byteLength;
|
|
16
|
+
while (remainingSize >= MiB) {
|
|
17
|
+
const hash = new this.Sha256();
|
|
18
|
+
hash.update(this.buffer.subarray(0, MiB));
|
|
19
|
+
this.collectedHashDigests.push(hash.digest());
|
|
20
|
+
this.buffer = this.buffer.subarray(MiB);
|
|
21
|
+
remainingSize = this.buffer.byteLength;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
update(data) {
|
|
25
|
+
const chunk = this.convertToBuffer(data);
|
|
26
|
+
if (!this.buffer) {
|
|
27
|
+
this.buffer = chunk;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
const totalSize = this.buffer.byteLength + chunk.byteLength;
|
|
31
|
+
const tempBuffer = new Uint8Array(totalSize);
|
|
32
|
+
tempBuffer.set(this.buffer);
|
|
33
|
+
tempBuffer.set(chunk, this.buffer.byteLength);
|
|
34
|
+
this.buffer = tempBuffer;
|
|
35
|
+
}
|
|
36
|
+
this.hashBuffer();
|
|
37
|
+
}
|
|
38
|
+
async digest() {
|
|
39
|
+
let collectedHashDigests = this.collectedHashDigests;
|
|
40
|
+
this.collectedHashDigests = [];
|
|
41
|
+
if (this.buffer && this.buffer.byteLength > 0) {
|
|
42
|
+
const smallHash = new this.Sha256();
|
|
43
|
+
smallHash.update(this.buffer);
|
|
44
|
+
collectedHashDigests.push(smallHash.digest());
|
|
45
|
+
this.buffer = void 0;
|
|
46
|
+
}
|
|
47
|
+
while (collectedHashDigests.length > 1) {
|
|
48
|
+
const higherLevelHashDigests = [];
|
|
49
|
+
for (let i = 0; i < collectedHashDigests.length; i += 2) {
|
|
50
|
+
if (i + 1 < collectedHashDigests.length) {
|
|
51
|
+
const [digest1, digest2] = await Promise.all([collectedHashDigests[i], collectedHashDigests[i + 1]]);
|
|
52
|
+
const chunk = new Uint8Array(digest1.byteLength + digest2.byteLength);
|
|
53
|
+
chunk.set(digest1);
|
|
54
|
+
chunk.set(digest2, digest1.byteLength);
|
|
55
|
+
const hash = new this.Sha256();
|
|
56
|
+
hash.update(chunk);
|
|
57
|
+
higherLevelHashDigests.push(hash.digest());
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
higherLevelHashDigests.push(collectedHashDigests[i]);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
collectedHashDigests = higherLevelHashDigests;
|
|
64
|
+
}
|
|
65
|
+
return collectedHashDigests[0];
|
|
66
|
+
}
|
|
67
|
+
convertToBuffer(data) {
|
|
68
|
+
if (typeof data === "string") {
|
|
69
|
+
return this.fromUtf8(data);
|
|
70
|
+
}
|
|
71
|
+
if (ArrayBuffer.isView(data)) {
|
|
72
|
+
return new Uint8Array(data.buffer, data.byteOffset, data.byteLength / Uint8Array.BYTES_PER_ELEMENT);
|
|
73
|
+
}
|
|
74
|
+
return new Uint8Array(data);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.TreeHash = TreeHash;
|
package/dist-es/index.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { __awaiter, __generator, __read } from "tslib";
|
|
2
|
+
var MiB = 1048576;
|
|
3
|
+
var TreeHash = (function () {
|
|
4
|
+
function TreeHash(Sha256, fromUtf8) {
|
|
5
|
+
this.Sha256 = Sha256;
|
|
6
|
+
this.fromUtf8 = fromUtf8;
|
|
7
|
+
this.collectedHashDigests = [];
|
|
8
|
+
}
|
|
9
|
+
TreeHash.prototype.hashBuffer = function () {
|
|
10
|
+
if (!this.buffer) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
var remainingSize = this.buffer.byteLength;
|
|
14
|
+
while (remainingSize >= MiB) {
|
|
15
|
+
var hash = new this.Sha256();
|
|
16
|
+
hash.update(this.buffer.subarray(0, MiB));
|
|
17
|
+
this.collectedHashDigests.push(hash.digest());
|
|
18
|
+
this.buffer = this.buffer.subarray(MiB);
|
|
19
|
+
remainingSize = this.buffer.byteLength;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
TreeHash.prototype.update = function (data) {
|
|
23
|
+
var chunk = this.convertToBuffer(data);
|
|
24
|
+
if (!this.buffer) {
|
|
25
|
+
this.buffer = chunk;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
var totalSize = this.buffer.byteLength + chunk.byteLength;
|
|
29
|
+
var tempBuffer = new Uint8Array(totalSize);
|
|
30
|
+
tempBuffer.set(this.buffer);
|
|
31
|
+
tempBuffer.set(chunk, this.buffer.byteLength);
|
|
32
|
+
this.buffer = tempBuffer;
|
|
33
|
+
}
|
|
34
|
+
this.hashBuffer();
|
|
35
|
+
};
|
|
36
|
+
TreeHash.prototype.digest = function () {
|
|
37
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
38
|
+
var collectedHashDigests, smallHash, higherLevelHashDigests, i, _a, digest1, digest2, chunk, hash;
|
|
39
|
+
return __generator(this, function (_b) {
|
|
40
|
+
switch (_b.label) {
|
|
41
|
+
case 0:
|
|
42
|
+
collectedHashDigests = this.collectedHashDigests;
|
|
43
|
+
this.collectedHashDigests = [];
|
|
44
|
+
if (this.buffer && this.buffer.byteLength > 0) {
|
|
45
|
+
smallHash = new this.Sha256();
|
|
46
|
+
smallHash.update(this.buffer);
|
|
47
|
+
collectedHashDigests.push(smallHash.digest());
|
|
48
|
+
this.buffer = void 0;
|
|
49
|
+
}
|
|
50
|
+
_b.label = 1;
|
|
51
|
+
case 1:
|
|
52
|
+
if (!(collectedHashDigests.length > 1)) return [3, 7];
|
|
53
|
+
higherLevelHashDigests = [];
|
|
54
|
+
i = 0;
|
|
55
|
+
_b.label = 2;
|
|
56
|
+
case 2:
|
|
57
|
+
if (!(i < collectedHashDigests.length)) return [3, 6];
|
|
58
|
+
if (!(i + 1 < collectedHashDigests.length)) return [3, 4];
|
|
59
|
+
return [4, Promise.all([collectedHashDigests[i], collectedHashDigests[i + 1]])];
|
|
60
|
+
case 3:
|
|
61
|
+
_a = __read.apply(void 0, [_b.sent(), 2]), digest1 = _a[0], digest2 = _a[1];
|
|
62
|
+
chunk = new Uint8Array(digest1.byteLength + digest2.byteLength);
|
|
63
|
+
chunk.set(digest1);
|
|
64
|
+
chunk.set(digest2, digest1.byteLength);
|
|
65
|
+
hash = new this.Sha256();
|
|
66
|
+
hash.update(chunk);
|
|
67
|
+
higherLevelHashDigests.push(hash.digest());
|
|
68
|
+
return [3, 5];
|
|
69
|
+
case 4:
|
|
70
|
+
higherLevelHashDigests.push(collectedHashDigests[i]);
|
|
71
|
+
_b.label = 5;
|
|
72
|
+
case 5:
|
|
73
|
+
i += 2;
|
|
74
|
+
return [3, 2];
|
|
75
|
+
case 6:
|
|
76
|
+
collectedHashDigests = higherLevelHashDigests;
|
|
77
|
+
return [3, 1];
|
|
78
|
+
case 7: return [2, collectedHashDigests[0]];
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
};
|
|
83
|
+
TreeHash.prototype.convertToBuffer = function (data) {
|
|
84
|
+
if (typeof data === "string") {
|
|
85
|
+
return this.fromUtf8(data);
|
|
86
|
+
}
|
|
87
|
+
if (ArrayBuffer.isView(data)) {
|
|
88
|
+
return new Uint8Array(data.buffer, data.byteOffset, data.byteLength / Uint8Array.BYTES_PER_ELEMENT);
|
|
89
|
+
}
|
|
90
|
+
return new Uint8Array(data);
|
|
91
|
+
};
|
|
92
|
+
return TreeHash;
|
|
93
|
+
}());
|
|
94
|
+
export { TreeHash };
|
|
File without changes
|
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,43 +1,47 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aws-sdk/sha256-tree-hash",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.36.0",
|
|
4
4
|
"scripts": {
|
|
5
|
+
"build": "yarn build:cjs && yarn build:es && yarn build:types",
|
|
5
6
|
"build:cjs": "tsc -p tsconfig.cjs.json",
|
|
6
7
|
"build:es": "tsc -p tsconfig.es.json",
|
|
7
|
-
"build": "
|
|
8
|
-
"downlevel-dts": "downlevel-dts dist
|
|
8
|
+
"build:types": "tsc -p tsconfig.types.json",
|
|
9
|
+
"downlevel-dts": "downlevel-dts dist-types dist-types/ts3.4",
|
|
9
10
|
"test": "jest"
|
|
10
11
|
},
|
|
11
|
-
"main": "./dist
|
|
12
|
-
"module": "./dist
|
|
13
|
-
"types": "./dist
|
|
12
|
+
"main": "./dist-cjs/index.js",
|
|
13
|
+
"module": "./dist-es/index.js",
|
|
14
|
+
"types": "./dist-types/index.d.ts",
|
|
14
15
|
"author": {
|
|
15
16
|
"name": "AWS SDK for JavaScript Team",
|
|
16
17
|
"url": "https://aws.amazon.com/javascript/"
|
|
17
18
|
},
|
|
18
19
|
"license": "Apache-2.0",
|
|
19
20
|
"dependencies": {
|
|
20
|
-
"@aws-sdk/types": "3.
|
|
21
|
+
"@aws-sdk/types": "3.36.0",
|
|
21
22
|
"tslib": "^2.3.0"
|
|
22
23
|
},
|
|
23
24
|
"devDependencies": {
|
|
24
25
|
"@aws-crypto/sha256-js": "^1.0.0",
|
|
25
|
-
"@aws-sdk/util-hex-encoding": "3.
|
|
26
|
-
"@aws-sdk/util-utf8-node": "3.
|
|
26
|
+
"@aws-sdk/util-hex-encoding": "3.36.0",
|
|
27
|
+
"@aws-sdk/util-utf8-node": "3.36.0",
|
|
27
28
|
"@types/jest": "^26.0.4",
|
|
28
29
|
"jest": "^26.1.0",
|
|
29
|
-
"typescript": "~4.
|
|
30
|
+
"typescript": "~4.3.5"
|
|
30
31
|
},
|
|
31
32
|
"engines": {
|
|
32
33
|
"node": ">= 10.0.0"
|
|
33
34
|
},
|
|
34
35
|
"typesVersions": {
|
|
35
36
|
"<4.0": {
|
|
36
|
-
"dist
|
|
37
|
-
"dist
|
|
37
|
+
"dist-types/*": [
|
|
38
|
+
"dist-types/ts3.4/*"
|
|
38
39
|
]
|
|
39
40
|
}
|
|
40
41
|
},
|
|
42
|
+
"files": [
|
|
43
|
+
"dist-*"
|
|
44
|
+
],
|
|
41
45
|
"homepage": "https://github.com/aws/aws-sdk-js-v3/tree/main/packages/sha256-tree-hash",
|
|
42
46
|
"repository": {
|
|
43
47
|
"type": "git",
|
package/dist/cjs/index.js
DELETED
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.TreeHash = void 0;
|
|
4
|
-
const MiB = 1048576;
|
|
5
|
-
/**
|
|
6
|
-
* A Hash that will calculate a Sha256 tree hash.
|
|
7
|
-
*/
|
|
8
|
-
class TreeHash {
|
|
9
|
-
/**
|
|
10
|
-
* Initializes a TreeHash.
|
|
11
|
-
* @param Sha256 A Sha256 hash constructor.
|
|
12
|
-
*/
|
|
13
|
-
constructor(Sha256, fromUtf8) {
|
|
14
|
-
this.Sha256 = Sha256;
|
|
15
|
-
this.fromUtf8 = fromUtf8;
|
|
16
|
-
this.collectedHashDigests = [];
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Generates Sha256 hashes from 1 MiB chunks of the
|
|
20
|
-
* internal buffer.
|
|
21
|
-
* Will set the internal buffer to any bytes remaining
|
|
22
|
-
* that is less than 1 MiB.
|
|
23
|
-
*/
|
|
24
|
-
hashBuffer() {
|
|
25
|
-
if (!this.buffer) {
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
let remainingSize = this.buffer.byteLength;
|
|
29
|
-
while (remainingSize >= MiB) {
|
|
30
|
-
const hash = new this.Sha256();
|
|
31
|
-
hash.update(this.buffer.subarray(0, MiB));
|
|
32
|
-
this.collectedHashDigests.push(hash.digest());
|
|
33
|
-
this.buffer = this.buffer.subarray(MiB);
|
|
34
|
-
remainingSize = this.buffer.byteLength;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Updates the tree hash with byte data.
|
|
39
|
-
* @param chunk Byte data to apply to the tree hash.
|
|
40
|
-
*/
|
|
41
|
-
update(data) {
|
|
42
|
-
const chunk = this.convertToBuffer(data);
|
|
43
|
-
if (!this.buffer) {
|
|
44
|
-
this.buffer = chunk;
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
// determine size of both pieces
|
|
48
|
-
const totalSize = this.buffer.byteLength + chunk.byteLength;
|
|
49
|
-
const tempBuffer = new Uint8Array(totalSize);
|
|
50
|
-
tempBuffer.set(this.buffer);
|
|
51
|
-
tempBuffer.set(chunk, this.buffer.byteLength);
|
|
52
|
-
this.buffer = tempBuffer;
|
|
53
|
-
}
|
|
54
|
-
// hasBuffer will set this.buffer with remaining data
|
|
55
|
-
this.hashBuffer();
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Calculates the digest for the tree hash.
|
|
59
|
-
*/
|
|
60
|
-
async digest() {
|
|
61
|
-
let collectedHashDigests = this.collectedHashDigests;
|
|
62
|
-
// remove the reference to collected hashes to free up space
|
|
63
|
-
this.collectedHashDigests = [];
|
|
64
|
-
// loop through collected hashes
|
|
65
|
-
if (this.buffer && this.buffer.byteLength > 0) {
|
|
66
|
-
const smallHash = new this.Sha256();
|
|
67
|
-
smallHash.update(this.buffer);
|
|
68
|
-
collectedHashDigests.push(smallHash.digest());
|
|
69
|
-
// remove the remaining buffer
|
|
70
|
-
this.buffer = void 0;
|
|
71
|
-
}
|
|
72
|
-
while (collectedHashDigests.length > 1) {
|
|
73
|
-
const higherLevelHashDigests = [];
|
|
74
|
-
for (let i = 0; i < collectedHashDigests.length; i += 2) {
|
|
75
|
-
if (i + 1 < collectedHashDigests.length) {
|
|
76
|
-
// concatenate the pair of hashes
|
|
77
|
-
const [digest1, digest2] = await Promise.all([collectedHashDigests[i], collectedHashDigests[i + 1]]);
|
|
78
|
-
const chunk = new Uint8Array(digest1.byteLength + digest2.byteLength);
|
|
79
|
-
chunk.set(digest1);
|
|
80
|
-
chunk.set(digest2, digest1.byteLength);
|
|
81
|
-
const hash = new this.Sha256();
|
|
82
|
-
hash.update(chunk);
|
|
83
|
-
higherLevelHashDigests.push(hash.digest());
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
// move a lone hash up a level
|
|
87
|
-
higherLevelHashDigests.push(collectedHashDigests[i]);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
collectedHashDigests = higherLevelHashDigests;
|
|
91
|
-
}
|
|
92
|
-
return collectedHashDigests[0];
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Converts source data into a Uint8Array.
|
|
96
|
-
* @param data Data to convert to a Uint8Array.
|
|
97
|
-
*/
|
|
98
|
-
convertToBuffer(data) {
|
|
99
|
-
if (typeof data === "string") {
|
|
100
|
-
return this.fromUtf8(data);
|
|
101
|
-
}
|
|
102
|
-
if (ArrayBuffer.isView(data)) {
|
|
103
|
-
return new Uint8Array(data.buffer, data.byteOffset, data.byteLength / Uint8Array.BYTES_PER_ELEMENT);
|
|
104
|
-
}
|
|
105
|
-
return new Uint8Array(data);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
exports.TreeHash = TreeHash;
|
|
109
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDO0FBRXBCOztHQUVHO0FBQ0gsTUFBYSxRQUFRO0lBSW5COzs7T0FHRztJQUNILFlBQTZCLE1BQXVCLEVBQW1CLFFBQWlCO1FBQTNELFdBQU0sR0FBTixNQUFNLENBQWlCO1FBQW1CLGFBQVEsR0FBUixRQUFRLENBQVM7UUFOaEYseUJBQW9CLEdBQTBCLEVBQUUsQ0FBQztJQU1rQyxDQUFDO0lBRTVGOzs7OztPQUtHO0lBQ0ssVUFBVTtRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNoQixPQUFPO1NBQ1I7UUFFRCxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUMzQyxPQUFPLGFBQWEsSUFBSSxHQUFHLEVBQUU7WUFDM0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBRTlDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEMsYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1NBQ3hDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxJQUFnQjtRQUM1QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxJ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SSxLQUFLLFFBQVEsRUFBRTtZQUM1QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDNUI7UUFFRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDNUIsT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUNyRztRQUVELE9BQU8sSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsQ0FBQztDQUNGO0FBL0dELDRCQStHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlY29kZXIsIEhhc2gsIEhhc2hDb25zdHJ1Y3RvciwgU291cmNlRGF0YSB9IGZyb20gXCJAYXdzLXNkay90eXBlc1wiO1xuXG5jb25zdCBNaUIgPSAxMDQ4NTc2O1xuXG4vKipcbiAqIEEgSGFzaCB0aGF0IHdpbGwgY2FsY3VsYXRlIGEgU2hhMjU2IHRyZWUgaGFzaC5cbiAqL1xuZXhwb3J0IGNsYXNzIFRyZWVIYXNoIGltcGxlbWVudHMgSGFzaCB7XG4gIHByaXZhdGUgYnVmZmVyPzogVWludDhBcnJheTtcbiAgcHJpdmF0ZSBjb2xsZWN0ZWRIYXNoRGlnZXN0czogUHJvbWlzZTxVaW50OEFycmF5PltdID0gW107XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGEgVHJlZUhhc2guXG4gICAqIEBwYXJhbSBTaGEyNTYgQSBTaGEyNTYgaGFzaCBjb25zdHJ1Y3Rvci5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgU2hhMjU2OiBIYXNoQ29uc3RydWN0b3IsIHByaXZhdGUgcmVhZG9ubHkgZnJvbVV0Zjg6IERlY29kZXIpIHt9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBTaGEyNTYgaGFzaGVzIGZyb20gMSBNaUIgY2h1bmtzIG9mIHRoZVxuICAgKiBpbnRlcm5hbCBidWZmZXIuXG4gICAqIFdpbGwgc2V0IHRoZSBpbnRlcm5hbCBidWZmZXIgdG8gYW55IGJ5dGVzIHJlbWFpbmluZ1xuICAgKiB0aGF0IGlzIGxlc3MgdGhhbiAxIE1pQi5cbiAgICovXG4gIHByaXZhdGUgaGFzaEJ1ZmZlcigpIHtcbiAgICBpZiAoIXRoaXMuYnVmZmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHJlbWFpbmluZ1NpemUgPSB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoO1xuICAgIHdoaWxlIChyZW1haW5pbmdTaXplID49IE1pQikge1xuICAgICAgY29uc3QgaGFzaCA9IG5ldyB0aGlzLlNoYTI1NigpO1xuICAgICAgaGFzaC51cGRhdGUodGhpcy5idWZmZXIuc3ViYXJyYXkoMCwgTWlCKSk7XG4gICAgICB0aGlzLmNvbGxlY3RlZEhhc2hEaWdlc3RzLnB1c2goaGFzaC5kaWdlc3QoKSk7XG5cbiAgICAgIHRoaXMuYnVmZmVyID0gdGhpcy5idWZmZXIuc3ViYXJyYXkoTWlCKTtcbiAgICAgIHJlbWFpbmluZ1NpemUgPSB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSB0cmVlIGhhc2ggd2l0aCBieXRlIGRhdGEuXG4gICAqIEBwYXJhbSBjaHVuayBCeXRlIGRhdGEgdG8gYXBwbHkgdG8gdGhlIHRyZWUgaGFzaC5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGUoZGF0YTogU291cmNlRGF0YSkge1xuICAgIGNvbnN0IGNodW5rID0gdGhpcy5jb252ZXJ0VG9CdWZmZXIoZGF0YSk7XG4gICAgaWYgKCF0aGlzLmJ1ZmZlcikge1xuICAgICAgdGhpcy5idWZmZXIgPSBjaHVuaztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZGV0ZXJtaW5lIHNpemUgb2YgYm90aCBwaWVjZXNcbiAgICAgIGNvbnN0IHRvdGFsU2l6ZSA9IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGggKyBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgY29uc3QgdGVtcEJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHRvdGFsU2l6ZSk7XG5cbiAgICAgIHRlbXBCdWZmZXIuc2V0KHRoaXMuYnVmZmVyKTtcbiAgICAgIHRlbXBCdWZmZXIuc2V0KGNodW5rLCB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgIHRoaXMuYnVmZmVyID0gdGVtcEJ1ZmZlcjtcbiAgICB9XG5cbiAgICAvLyBoYXNCdWZmZXIgd2lsbCBzZXQgdGhpcy5idWZmZXIgd2l0aCByZW1haW5pbmcgZGF0YVxuICAgIHRoaXMuaGFzaEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIGRpZ2VzdCBmb3IgdGhlIHRyZWUgaGFzaC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkaWdlc3QoKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgbGV0IGNvbGxlY3RlZEhhc2hEaWdlc3RzID0gdGhpcy5jb2xsZWN0ZWRIYXNoRGlnZXN0cztcbiAgICAvLyByZW1vdmUgdGhlIHJlZmVyZW5jZSB0byBjb2xsZWN0ZWQgaGFzaGVzIHRvIGZyZWUgdXAgc3BhY2VcbiAgICB0aGlzLmNvbGxlY3RlZEhhc2hEaWdlc3RzID0gW107XG5cbiAgICAvLyBsb29wIHRocm91Z2ggY29sbGVjdGVkIGhhc2hlc1xuICAgIGlmICh0aGlzLmJ1ZmZlciAmJiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc21hbGxIYXNoID0gbmV3IHRoaXMuU2hhMjU2KCk7XG4gICAgICBzbWFsbEhhc2gudXBkYXRlKHRoaXMuYnVmZmVyKTtcbiAgICAgIGNvbGxlY3RlZEhhc2hEaWdlc3RzLnB1c2goc21hbGxIYXNoLmRpZ2VzdCgpKTtcbiAgICAgIC8vIHJlbW92ZSB0aGUgcmVtYWluaW5nIGJ1ZmZlclxuICAgICAgdGhpcy5idWZmZXIgPSB2b2lkIDA7XG4gICAgfVxuXG4gICAgd2hpbGUgKGNvbGxlY3RlZEhhc2hEaWdlc3RzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IGhpZ2hlckxldmVsSGFzaERpZ2VzdHM6IFByb21pc2U8VWludDhBcnJheT5bXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xsZWN0ZWRIYXNoRGlnZXN0cy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICBpZiAoaSArIDEgPCBjb2xsZWN0ZWRIYXNoRGlnZXN0cy5sZW5ndGgpIHtcbiAgICAgICAgICAvLyBjb25jYXRlbmF0ZSB0aGUgcGFpciBvZiBoYXNoZXNcbiAgICAgICAgICBjb25zdCBbZGlnZXN0MSwgZGlnZXN0Ml0gPSBhd2FpdCBQcm9taXNlLmFsbChbY29sbGVjdGVkSGFzaERpZ2VzdHNbaV0sIGNvbGxlY3RlZEhhc2hEaWdlc3RzW2kgKyAxXV0pO1xuXG4gICAgICAgICAgY29uc3QgY2h1bmsgPSBuZXcgVWludDhBcnJheShkaWdlc3QxLmJ5dGVMZW5ndGggKyBkaWdlc3QyLmJ5dGVMZW5ndGgpO1xuICAgICAgICAgIGNodW5rLnNldChkaWdlc3QxKTtcbiAgICAgICAgICBjaHVuay5zZXQoZGlnZXN0MiwgZGlnZXN0MS5ieXRlTGVuZ3RoKTtcblxuICAgICAgICAgIGNvbnN0IGhhc2ggPSBuZXcgdGhpcy5TaGEyNTYoKTtcbiAgICAgICAgICBoYXNoLnVwZGF0ZShjaHVuayk7XG4gICAgICAgICAgaGlnaGVyTGV2ZWxIYXNoRGlnZXN0cy5wdXNoKGhhc2guZGlnZXN0KCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG1vdmUgYSBsb25lIGhhc2ggdXAgYSBsZXZlbFxuICAgICAgICAgIGhpZ2hlckxldmVsSGFzaERpZ2VzdHMucHVzaChjb2xsZWN0ZWRIYXNoRGlnZXN0c1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbGxlY3RlZEhhc2hEaWdlc3RzID0gaGlnaGVyTGV2ZWxIYXNoRGlnZXN0cztcbiAgICB9XG5cbiAgICByZXR1cm4gY29sbGVjdGVkSGFzaERpZ2VzdHNbMF07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgc291cmNlIGRhdGEgaW50byBhIFVpbnQ4QXJyYXkuXG4gICAqIEBwYXJhbSBkYXRhIERhdGEgdG8gY29udmVydCB0byBhIFVpbnQ4QXJyYXkuXG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRUb0J1ZmZlcihkYXRhOiBTb3VyY2VEYXRhKTogVWludDhBcnJheSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gdGhpcy5mcm9tVXRmOChkYXRhKTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGRhdGEpKSB7XG4gICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGF0YS5idWZmZXIsIGRhdGEuYnl0ZU9mZnNldCwgZGF0YS5ieXRlTGVuZ3RoIC8gVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGRhdGEpO1xuICB9XG59XG4iXX0=
|
package/dist/es/index.js
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import { __awaiter, __generator, __read } from "tslib";
|
|
2
|
-
var MiB = 1048576;
|
|
3
|
-
/**
|
|
4
|
-
* A Hash that will calculate a Sha256 tree hash.
|
|
5
|
-
*/
|
|
6
|
-
var TreeHash = /** @class */ (function () {
|
|
7
|
-
/**
|
|
8
|
-
* Initializes a TreeHash.
|
|
9
|
-
* @param Sha256 A Sha256 hash constructor.
|
|
10
|
-
*/
|
|
11
|
-
function TreeHash(Sha256, fromUtf8) {
|
|
12
|
-
this.Sha256 = Sha256;
|
|
13
|
-
this.fromUtf8 = fromUtf8;
|
|
14
|
-
this.collectedHashDigests = [];
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Generates Sha256 hashes from 1 MiB chunks of the
|
|
18
|
-
* internal buffer.
|
|
19
|
-
* Will set the internal buffer to any bytes remaining
|
|
20
|
-
* that is less than 1 MiB.
|
|
21
|
-
*/
|
|
22
|
-
TreeHash.prototype.hashBuffer = function () {
|
|
23
|
-
if (!this.buffer) {
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
var remainingSize = this.buffer.byteLength;
|
|
27
|
-
while (remainingSize >= MiB) {
|
|
28
|
-
var hash = new this.Sha256();
|
|
29
|
-
hash.update(this.buffer.subarray(0, MiB));
|
|
30
|
-
this.collectedHashDigests.push(hash.digest());
|
|
31
|
-
this.buffer = this.buffer.subarray(MiB);
|
|
32
|
-
remainingSize = this.buffer.byteLength;
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
/**
|
|
36
|
-
* Updates the tree hash with byte data.
|
|
37
|
-
* @param chunk Byte data to apply to the tree hash.
|
|
38
|
-
*/
|
|
39
|
-
TreeHash.prototype.update = function (data) {
|
|
40
|
-
var chunk = this.convertToBuffer(data);
|
|
41
|
-
if (!this.buffer) {
|
|
42
|
-
this.buffer = chunk;
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
// determine size of both pieces
|
|
46
|
-
var totalSize = this.buffer.byteLength + chunk.byteLength;
|
|
47
|
-
var tempBuffer = new Uint8Array(totalSize);
|
|
48
|
-
tempBuffer.set(this.buffer);
|
|
49
|
-
tempBuffer.set(chunk, this.buffer.byteLength);
|
|
50
|
-
this.buffer = tempBuffer;
|
|
51
|
-
}
|
|
52
|
-
// hasBuffer will set this.buffer with remaining data
|
|
53
|
-
this.hashBuffer();
|
|
54
|
-
};
|
|
55
|
-
/**
|
|
56
|
-
* Calculates the digest for the tree hash.
|
|
57
|
-
*/
|
|
58
|
-
TreeHash.prototype.digest = function () {
|
|
59
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
60
|
-
var collectedHashDigests, smallHash, higherLevelHashDigests, i, _a, digest1, digest2, chunk, hash;
|
|
61
|
-
return __generator(this, function (_b) {
|
|
62
|
-
switch (_b.label) {
|
|
63
|
-
case 0:
|
|
64
|
-
collectedHashDigests = this.collectedHashDigests;
|
|
65
|
-
// remove the reference to collected hashes to free up space
|
|
66
|
-
this.collectedHashDigests = [];
|
|
67
|
-
// loop through collected hashes
|
|
68
|
-
if (this.buffer && this.buffer.byteLength > 0) {
|
|
69
|
-
smallHash = new this.Sha256();
|
|
70
|
-
smallHash.update(this.buffer);
|
|
71
|
-
collectedHashDigests.push(smallHash.digest());
|
|
72
|
-
// remove the remaining buffer
|
|
73
|
-
this.buffer = void 0;
|
|
74
|
-
}
|
|
75
|
-
_b.label = 1;
|
|
76
|
-
case 1:
|
|
77
|
-
if (!(collectedHashDigests.length > 1)) return [3 /*break*/, 7];
|
|
78
|
-
higherLevelHashDigests = [];
|
|
79
|
-
i = 0;
|
|
80
|
-
_b.label = 2;
|
|
81
|
-
case 2:
|
|
82
|
-
if (!(i < collectedHashDigests.length)) return [3 /*break*/, 6];
|
|
83
|
-
if (!(i + 1 < collectedHashDigests.length)) return [3 /*break*/, 4];
|
|
84
|
-
return [4 /*yield*/, Promise.all([collectedHashDigests[i], collectedHashDigests[i + 1]])];
|
|
85
|
-
case 3:
|
|
86
|
-
_a = __read.apply(void 0, [_b.sent(), 2]), digest1 = _a[0], digest2 = _a[1];
|
|
87
|
-
chunk = new Uint8Array(digest1.byteLength + digest2.byteLength);
|
|
88
|
-
chunk.set(digest1);
|
|
89
|
-
chunk.set(digest2, digest1.byteLength);
|
|
90
|
-
hash = new this.Sha256();
|
|
91
|
-
hash.update(chunk);
|
|
92
|
-
higherLevelHashDigests.push(hash.digest());
|
|
93
|
-
return [3 /*break*/, 5];
|
|
94
|
-
case 4:
|
|
95
|
-
// move a lone hash up a level
|
|
96
|
-
higherLevelHashDigests.push(collectedHashDigests[i]);
|
|
97
|
-
_b.label = 5;
|
|
98
|
-
case 5:
|
|
99
|
-
i += 2;
|
|
100
|
-
return [3 /*break*/, 2];
|
|
101
|
-
case 6:
|
|
102
|
-
collectedHashDigests = higherLevelHashDigests;
|
|
103
|
-
return [3 /*break*/, 1];
|
|
104
|
-
case 7: return [2 /*return*/, collectedHashDigests[0]];
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
});
|
|
108
|
-
};
|
|
109
|
-
/**
|
|
110
|
-
* Converts source data into a Uint8Array.
|
|
111
|
-
* @param data Data to convert to a Uint8Array.
|
|
112
|
-
*/
|
|
113
|
-
TreeHash.prototype.convertToBuffer = function (data) {
|
|
114
|
-
if (typeof data === "string") {
|
|
115
|
-
return this.fromUtf8(data);
|
|
116
|
-
}
|
|
117
|
-
if (ArrayBuffer.isView(data)) {
|
|
118
|
-
return new Uint8Array(data.buffer, data.byteOffset, data.byteLength / Uint8Array.BYTES_PER_ELEMENT);
|
|
119
|
-
}
|
|
120
|
-
return new Uint8Array(data);
|
|
121
|
-
};
|
|
122
|
-
return TreeHash;
|
|
123
|
-
}());
|
|
124
|
-
export { TreeHash };
|
|
125
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLElBQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQztBQUVwQjs7R0FFRztBQUNIO0lBSUU7OztPQUdHO0lBQ0gsa0JBQTZCLE1BQXVCLEVBQW1CLFFBQWlCO1FBQTNELFdBQU0sR0FBTixNQUFNLENBQWlCO1FBQW1CLGFBQVEsR0FBUixRQUFRLENBQVM7UUFOaEYseUJBQW9CLEdBQTBCLEVBQUUsQ0FBQztJQU1rQyxDQUFDO0lBRTVGOzs7OztPQUtHO0lBQ0ssNkJBQVUsR0FBbEI7UUFDRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNoQixPQUFPO1NBQ1I7UUFFRCxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUMzQyxPQUFPLGFBQWEsSUFBSSxHQUFHLEVBQUU7WUFDM0IsSUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBRTlDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEMsYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1NBQ3hDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNJLHlCQUFNLEdBQWIsVUFBYyxJQUFnQjtRQUM1QixJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxJ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QUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQzVCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM1QjtRQUVELElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM1QixPQUFPLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1NBQ3JHO1FBRUQsT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBQ0gsZUFBQztBQUFELENBQUMsQUEvR0QsSUErR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZWNvZGVyLCBIYXNoLCBIYXNoQ29uc3RydWN0b3IsIFNvdXJjZURhdGEgfSBmcm9tIFwiQGF3cy1zZGsvdHlwZXNcIjtcblxuY29uc3QgTWlCID0gMTA0ODU3NjtcblxuLyoqXG4gKiBBIEhhc2ggdGhhdCB3aWxsIGNhbGN1bGF0ZSBhIFNoYTI1NiB0cmVlIGhhc2guXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmVlSGFzaCBpbXBsZW1lbnRzIEhhc2gge1xuICBwcml2YXRlIGJ1ZmZlcj86IFVpbnQ4QXJyYXk7XG4gIHByaXZhdGUgY29sbGVjdGVkSGFzaERpZ2VzdHM6IFByb21pc2U8VWludDhBcnJheT5bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBhIFRyZWVIYXNoLlxuICAgKiBAcGFyYW0gU2hhMjU2IEEgU2hhMjU2IGhhc2ggY29uc3RydWN0b3IuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IFNoYTI1NjogSGFzaENvbnN0cnVjdG9yLCBwcml2YXRlIHJlYWRvbmx5IGZyb21VdGY4OiBEZWNvZGVyKSB7fVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgU2hhMjU2IGhhc2hlcyBmcm9tIDEgTWlCIGNodW5rcyBvZiB0aGVcbiAgICogaW50ZXJuYWwgYnVmZmVyLlxuICAgKiBXaWxsIHNldCB0aGUgaW50ZXJuYWwgYnVmZmVyIHRvIGFueSBieXRlcyByZW1haW5pbmdcbiAgICogdGhhdCBpcyBsZXNzIHRoYW4gMSBNaUIuXG4gICAqL1xuICBwcml2YXRlIGhhc2hCdWZmZXIoKSB7XG4gICAgaWYgKCF0aGlzLmJ1ZmZlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCByZW1haW5pbmdTaXplID0gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aDtcbiAgICB3aGlsZSAocmVtYWluaW5nU2l6ZSA+PSBNaUIpIHtcbiAgICAgIGNvbnN0IGhhc2ggPSBuZXcgdGhpcy5TaGEyNTYoKTtcbiAgICAgIGhhc2gudXBkYXRlKHRoaXMuYnVmZmVyLnN1YmFycmF5KDAsIE1pQikpO1xuICAgICAgdGhpcy5jb2xsZWN0ZWRIYXNoRGlnZXN0cy5wdXNoKGhhc2guZGlnZXN0KCkpO1xuXG4gICAgICB0aGlzLmJ1ZmZlciA9IHRoaXMuYnVmZmVyLnN1YmFycmF5KE1pQik7XG4gICAgICByZW1haW5pbmdTaXplID0gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgdHJlZSBoYXNoIHdpdGggYnl0ZSBkYXRhLlxuICAgKiBAcGFyYW0gY2h1bmsgQnl0ZSBkYXRhIHRvIGFwcGx5IHRvIHRoZSB0cmVlIGhhc2guXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlKGRhdGE6IFNvdXJjZURhdGEpIHtcbiAgICBjb25zdCBjaHVuayA9IHRoaXMuY29udmVydFRvQnVmZmVyKGRhdGEpO1xuICAgIGlmICghdGhpcy5idWZmZXIpIHtcbiAgICAgIHRoaXMuYnVmZmVyID0gY2h1bms7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGRldGVybWluZSBzaXplIG9mIGJvdGggcGllY2VzXG4gICAgICBjb25zdCB0b3RhbFNpemUgPSB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoICsgY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgIGNvbnN0IHRlbXBCdWZmZXIgPSBuZXcgVWludDhBcnJheSh0b3RhbFNpemUpO1xuXG4gICAgICB0ZW1wQnVmZmVyLnNldCh0aGlzLmJ1ZmZlcik7XG4gICAgICB0ZW1wQnVmZmVyLnNldChjaHVuaywgdGhpcy5idWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICB0aGlzLmJ1ZmZlciA9IHRlbXBCdWZmZXI7XG4gICAgfVxuXG4gICAgLy8gaGFzQnVmZmVyIHdpbGwgc2V0IHRoaXMuYnVmZmVyIHdpdGggcmVtYWluaW5nIGRhdGFcbiAgICB0aGlzLmhhc2hCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBkaWdlc3QgZm9yIHRoZSB0cmVlIGhhc2guXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGlnZXN0KCk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGxldCBjb2xsZWN0ZWRIYXNoRGlnZXN0cyA9IHRoaXMuY29sbGVjdGVkSGFzaERpZ2VzdHM7XG4gICAgLy8gcmVtb3ZlIHRoZSByZWZlcmVuY2UgdG8gY29sbGVjdGVkIGhhc2hlcyB0byBmcmVlIHVwIHNwYWNlXG4gICAgdGhpcy5jb2xsZWN0ZWRIYXNoRGlnZXN0cyA9IFtdO1xuXG4gICAgLy8gbG9vcCB0aHJvdWdoIGNvbGxlY3RlZCBoYXNoZXNcbiAgICBpZiAodGhpcy5idWZmZXIgJiYgdGhpcy5idWZmZXIuYnl0ZUxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHNtYWxsSGFzaCA9IG5ldyB0aGlzLlNoYTI1NigpO1xuICAgICAgc21hbGxIYXNoLnVwZGF0ZSh0aGlzLmJ1ZmZlcik7XG4gICAgICBjb2xsZWN0ZWRIYXNoRGlnZXN0cy5wdXNoKHNtYWxsSGFzaC5kaWdlc3QoKSk7XG4gICAgICAvLyByZW1vdmUgdGhlIHJlbWFpbmluZyBidWZmZXJcbiAgICAgIHRoaXMuYnVmZmVyID0gdm9pZCAwO1xuICAgIH1cblxuICAgIHdoaWxlIChjb2xsZWN0ZWRIYXNoRGlnZXN0cy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBoaWdoZXJMZXZlbEhhc2hEaWdlc3RzOiBQcm9taXNlPFVpbnQ4QXJyYXk+W10gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sbGVjdGVkSGFzaERpZ2VzdHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgaWYgKGkgKyAxIDwgY29sbGVjdGVkSGFzaERpZ2VzdHMubGVuZ3RoKSB7XG4gICAgICAgICAgLy8gY29uY2F0ZW5hdGUgdGhlIHBhaXIgb2YgaGFzaGVzXG4gICAgICAgICAgY29uc3QgW2RpZ2VzdDEsIGRpZ2VzdDJdID0gYXdhaXQgUHJvbWlzZS5hbGwoW2NvbGxlY3RlZEhhc2hEaWdlc3RzW2ldLCBjb2xsZWN0ZWRIYXNoRGlnZXN0c1tpICsgMV1dKTtcblxuICAgICAgICAgIGNvbnN0IGNodW5rID0gbmV3IFVpbnQ4QXJyYXkoZGlnZXN0MS5ieXRlTGVuZ3RoICsgZGlnZXN0Mi5ieXRlTGVuZ3RoKTtcbiAgICAgICAgICBjaHVuay5zZXQoZGlnZXN0MSk7XG4gICAgICAgICAgY2h1bmsuc2V0KGRpZ2VzdDIsIGRpZ2VzdDEuYnl0ZUxlbmd0aCk7XG5cbiAgICAgICAgICBjb25zdCBoYXNoID0gbmV3IHRoaXMuU2hhMjU2KCk7XG4gICAgICAgICAgaGFzaC51cGRhdGUoY2h1bmspO1xuICAgICAgICAgIGhpZ2hlckxldmVsSGFzaERpZ2VzdHMucHVzaChoYXNoLmRpZ2VzdCgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBtb3ZlIGEgbG9uZSBoYXNoIHVwIGEgbGV2ZWxcbiAgICAgICAgICBoaWdoZXJMZXZlbEhhc2hEaWdlc3RzLnB1c2goY29sbGVjdGVkSGFzaERpZ2VzdHNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb2xsZWN0ZWRIYXNoRGlnZXN0cyA9IGhpZ2hlckxldmVsSGFzaERpZ2VzdHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbGxlY3RlZEhhc2hEaWdlc3RzWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHNvdXJjZSBkYXRhIGludG8gYSBVaW50OEFycmF5LlxuICAgKiBAcGFyYW0gZGF0YSBEYXRhIHRvIGNvbnZlcnQgdG8gYSBVaW50OEFycmF5LlxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0VG9CdWZmZXIoZGF0YTogU291cmNlRGF0YSk6IFVpbnQ4QXJyYXkge1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHRoaXMuZnJvbVV0ZjgoZGF0YSk7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhkYXRhKSkge1xuICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGRhdGEuYnVmZmVyLCBkYXRhLmJ5dGVPZmZzZXQsIGRhdGEuYnl0ZUxlbmd0aCAvIFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgfVxufVxuIl19
|
package/src/index.ts
DELETED
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import { Decoder, Hash, HashConstructor, SourceData } from "@aws-sdk/types";
|
|
2
|
-
|
|
3
|
-
const MiB = 1048576;
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* A Hash that will calculate a Sha256 tree hash.
|
|
7
|
-
*/
|
|
8
|
-
export class TreeHash implements Hash {
|
|
9
|
-
private buffer?: Uint8Array;
|
|
10
|
-
private collectedHashDigests: Promise<Uint8Array>[] = [];
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Initializes a TreeHash.
|
|
14
|
-
* @param Sha256 A Sha256 hash constructor.
|
|
15
|
-
*/
|
|
16
|
-
constructor(private readonly Sha256: HashConstructor, private readonly fromUtf8: Decoder) {}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Generates Sha256 hashes from 1 MiB chunks of the
|
|
20
|
-
* internal buffer.
|
|
21
|
-
* Will set the internal buffer to any bytes remaining
|
|
22
|
-
* that is less than 1 MiB.
|
|
23
|
-
*/
|
|
24
|
-
private hashBuffer() {
|
|
25
|
-
if (!this.buffer) {
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
let remainingSize = this.buffer.byteLength;
|
|
30
|
-
while (remainingSize >= MiB) {
|
|
31
|
-
const hash = new this.Sha256();
|
|
32
|
-
hash.update(this.buffer.subarray(0, MiB));
|
|
33
|
-
this.collectedHashDigests.push(hash.digest());
|
|
34
|
-
|
|
35
|
-
this.buffer = this.buffer.subarray(MiB);
|
|
36
|
-
remainingSize = this.buffer.byteLength;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Updates the tree hash with byte data.
|
|
42
|
-
* @param chunk Byte data to apply to the tree hash.
|
|
43
|
-
*/
|
|
44
|
-
public update(data: SourceData) {
|
|
45
|
-
const chunk = this.convertToBuffer(data);
|
|
46
|
-
if (!this.buffer) {
|
|
47
|
-
this.buffer = chunk;
|
|
48
|
-
} else {
|
|
49
|
-
// determine size of both pieces
|
|
50
|
-
const totalSize = this.buffer.byteLength + chunk.byteLength;
|
|
51
|
-
const tempBuffer = new Uint8Array(totalSize);
|
|
52
|
-
|
|
53
|
-
tempBuffer.set(this.buffer);
|
|
54
|
-
tempBuffer.set(chunk, this.buffer.byteLength);
|
|
55
|
-
this.buffer = tempBuffer;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// hasBuffer will set this.buffer with remaining data
|
|
59
|
-
this.hashBuffer();
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Calculates the digest for the tree hash.
|
|
64
|
-
*/
|
|
65
|
-
public async digest(): Promise<Uint8Array> {
|
|
66
|
-
let collectedHashDigests = this.collectedHashDigests;
|
|
67
|
-
// remove the reference to collected hashes to free up space
|
|
68
|
-
this.collectedHashDigests = [];
|
|
69
|
-
|
|
70
|
-
// loop through collected hashes
|
|
71
|
-
if (this.buffer && this.buffer.byteLength > 0) {
|
|
72
|
-
const smallHash = new this.Sha256();
|
|
73
|
-
smallHash.update(this.buffer);
|
|
74
|
-
collectedHashDigests.push(smallHash.digest());
|
|
75
|
-
// remove the remaining buffer
|
|
76
|
-
this.buffer = void 0;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
while (collectedHashDigests.length > 1) {
|
|
80
|
-
const higherLevelHashDigests: Promise<Uint8Array>[] = [];
|
|
81
|
-
for (let i = 0; i < collectedHashDigests.length; i += 2) {
|
|
82
|
-
if (i + 1 < collectedHashDigests.length) {
|
|
83
|
-
// concatenate the pair of hashes
|
|
84
|
-
const [digest1, digest2] = await Promise.all([collectedHashDigests[i], collectedHashDigests[i + 1]]);
|
|
85
|
-
|
|
86
|
-
const chunk = new Uint8Array(digest1.byteLength + digest2.byteLength);
|
|
87
|
-
chunk.set(digest1);
|
|
88
|
-
chunk.set(digest2, digest1.byteLength);
|
|
89
|
-
|
|
90
|
-
const hash = new this.Sha256();
|
|
91
|
-
hash.update(chunk);
|
|
92
|
-
higherLevelHashDigests.push(hash.digest());
|
|
93
|
-
} else {
|
|
94
|
-
// move a lone hash up a level
|
|
95
|
-
higherLevelHashDigests.push(collectedHashDigests[i]);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
collectedHashDigests = higherLevelHashDigests;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
return collectedHashDigests[0];
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Converts source data into a Uint8Array.
|
|
106
|
-
* @param data Data to convert to a Uint8Array.
|
|
107
|
-
*/
|
|
108
|
-
private convertToBuffer(data: SourceData): Uint8Array {
|
|
109
|
-
if (typeof data === "string") {
|
|
110
|
-
return this.fromUtf8(data);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
if (ArrayBuffer.isView(data)) {
|
|
114
|
-
return new Uint8Array(data.buffer, data.byteOffset, data.byteLength / Uint8Array.BYTES_PER_ELEMENT);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
return new Uint8Array(data);
|
|
118
|
-
}
|
|
119
|
-
}
|
package/tsconfig.cjs.json
DELETED
package/tsconfig.es.json
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"lib": ["dom", "es5", "es2015.promise", "es2015.collection", "es2015.iterable", "es2015.symbol.wellknown"],
|
|
4
|
-
"declarationDir": "./dist/types",
|
|
5
|
-
"rootDir": "./src",
|
|
6
|
-
"outDir": "./dist/es",
|
|
7
|
-
"baseUrl": "."
|
|
8
|
-
},
|
|
9
|
-
"extends": "../../tsconfig.es.json",
|
|
10
|
-
"include": ["src/"]
|
|
11
|
-
}
|