Skip to content

Commit 8064c67

Browse files
committed
feat(Base64): fromArrayBuffer impl
- Updates XMLWriter to use Base64 module
1 parent bd00075 commit 8064c67

File tree

5 files changed

+60
-7
lines changed

5 files changed

+60
-7
lines changed

Sources/Common/Core/Base64/index.d.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,19 @@
44

55
/**
66
* Convert a Base64 string to an ArrayBuffer.
7-
* @param {string} b64Str
7+
* @param {string} b64Str
88
* @return An ArrayBuffer object.
99
*/
10-
export default function toArrayBuffer(b64Str: string): ArrayBuffer;
10+
export function toArrayBuffer(b64Str: string): ArrayBuffer;
11+
12+
/**
13+
* Convert a Base64 string to an ArrayBuffer.
14+
* @param {string} b64Str
15+
* @return An ArrayBuffer object.
16+
*/
17+
export function fromArrayBuffer(ab: ArrayBuffer): string;
18+
19+
export default {
20+
toArrayBuffer,
21+
fromArrayBuffer,
22+
};

Sources/Common/Core/Base64/index.js

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ function writeChunk(b64Str, chunk, dstOffset, uint8) {
119119
return offset;
120120
}
121121

122-
function toArrayBuffer(b64Str) {
122+
export function toArrayBuffer(b64Str) {
123123
const chunks = extractChunks(b64Str);
124124
const totalEncodedLength = chunks[chunks.length - 1].end + 1;
125125
const padding = (4 - (totalEncodedLength % 4)) % 4; // -length mod 4
@@ -138,6 +138,45 @@ function toArrayBuffer(b64Str) {
138138
return arrayBuffer;
139139
}
140140

141+
function encodeTriplet(v1, v2, v3) {
142+
const triplet = (v1 << 16) + (v2 << 8) + v3;
143+
return (
144+
BASE64_CODE[triplet >> 18] +
145+
BASE64_CODE[(triplet >> 12) & 0x3f] +
146+
BASE64_CODE[(triplet >> 6) & 0x3f] +
147+
BASE64_CODE[triplet & 0x3f]
148+
);
149+
}
150+
151+
export function fromArrayBuffer(ab) {
152+
const uint8 = new Uint8Array(ab);
153+
const leftoverLength = ab.byteLength % 3;
154+
const maxTripletIndex = ab.byteLength - leftoverLength;
155+
const segments = Array(maxTripletIndex / 3);
156+
for (let i = 0; i < segments.length; i++) {
157+
const bufOffset = i * 3;
158+
segments[i] = encodeTriplet(
159+
uint8[bufOffset],
160+
uint8[bufOffset + 1],
161+
uint8[bufOffset + 2]
162+
);
163+
}
164+
if (leftoverLength > 0) {
165+
const segment = encodeTriplet(
166+
uint8[maxTripletIndex],
167+
uint8[maxTripletIndex + 1] || 0,
168+
uint8[maxTripletIndex + 2] || 0
169+
);
170+
if (leftoverLength === 1) {
171+
segments.push(`${segment.substr(0, 2)}==`);
172+
} else if (leftoverLength === 2) {
173+
segments.push(`${segment.substr(0, 3)}=`);
174+
}
175+
}
176+
return segments.join('');
177+
}
178+
141179
export default {
142180
toArrayBuffer,
181+
fromArrayBuffer,
143182
};

Sources/IO/XML/XMLWriter/index.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { create } from 'xmlbuilder2';
2-
import { fromByteArray } from 'base64-js';
32
import pako from 'pako';
43

54
import macro from 'vtk.js/Sources/macros';
5+
import { fromArrayBuffer } from 'vtk.js/Sources/Common/Core/Base64';
66
import {
77
FormatTypes,
88
TYPED_ARRAY,
@@ -75,7 +75,9 @@ function processDataArray(
7575
uint8.set(blocks[blockId], uint8Offset);
7676
uint8Offset += header[3 + blockId];
7777
}
78-
return fromByteArray(headerUint8) + fromByteArray(uint8);
78+
return (
79+
fromArrayBuffer(headerUint8.buffer) + fromArrayBuffer(uint8.buffer)
80+
);
7981
}
8082
throw new Error('Only vtkZLibDataCompressor is supported');
8183
}

package-lock.json

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
"module": "./dist/esm/index.js",
3232
"dependencies": {
3333
"@babel/runtime": "7.15.4",
34-
"base64-js": "1.5.1",
3534
"blueimp-md5": "2.18.0",
3635
"commander": "8.2.0",
3736
"d3-scale": "4.0.0",

0 commit comments

Comments
 (0)