funda-ui
Version:
React components using pure Bootstrap 5+ which does not contain any external style and script libraries.
262 lines (212 loc) • 7.04 kB
text/typescript
/**
* base64 to ArrayBuffer
* @param {String} data
* @returns {ArrayBuffer}
*/
/*
@returns:
ArrayBuffer(522240)
byteLength: 522240
detached: false
maxByteLength: 522240
resizable: false
[[Prototype]]: ArrayBuffer
[[Int8Array]]: Int8Array(522240)
[[Uint8Array]]: Uint8Array(522240)
[[Int16Array]]: Int16Array(261120)
[[Int32Array]]: Int32Array(130560)
[[ArrayBufferByteLength]]: 522240
[[ArrayBufferData]]: 673
*/
function base64ToArrayBuffer(data: string): ArrayBufferLike {
let res: string = data;
if (data.indexOf('base64,') >= 0) {
res = data.split('base64,')[1];
}
const binaryString: string = atob(res);
const bytes: Uint8Array = new Uint8Array(binaryString.length);
for (let i: number = 0; i < binaryString.length; i++) {
bytes[i] = binaryString.charCodeAt(i);
}
return bytes.buffer;
}
/**
* ArrayBuffer to Uint8Array
* @param {ArrayBuffer} data
* @returns {Uint8Array}
*/
/*
@returns:
Uint8Array(522240) [208, 207, 17, 224, 161, 177, 26, 225, 0, 0, ......]
*/
function arrayBufferToUint8Array(data: ArrayBuffer): Uint8Array {
return new Uint8Array(data);
}
/**
* uint8array to array
* @param {Uint8Array} data
* @returns {Array}
*/
function uint8arrayToArr(data: Uint8Array): number[] {
return Array.from(data);
}
/**
* array to uint8array
* @param {Array} data
* @returns {Uint8Array}
*/
/* Example:
axios({
method: 'get',
url: 'http://xxxx',
responseType: 'arraybuffer'
})
.then(function (res) {
//res.data ==> ArrayBuffer(xxxx)
const b64string = uint8arrayToBase64Str(res.data);
const uint8ArrayData = arrayToUint8array(res.data);
// do something
});
*/
function arrayToUint8array(data: number[]): Uint8Array {
return new Uint8Array(data);
}
/**
* uint8array to base64 string
* @param {Uint8Array|Array} data
* @returns {String}
*/
function uint8arrayToBase64Str(data: Uint8Array | number[]): string {
if (typeof Buffer !== typeof undefined) {
return Buffer.from(data as never, 'binary').toString('base64'); // node.js too
} else {
let binary = '';
const bytes = new Uint8Array(data);
const len = bytes.byteLength;
for (let i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[i]);
}
return window.btoa(binary);
}
}
/**
* decode base64 string
* @param {String} data
* @returns {String}
*/
function decodeBase64Str(data: string): string {
// avoid messy code
// especially for Chinese, avoid using encodeURIComponent() and encodeURI()
const decoded: string = decodeURIComponent(escape(atob(data)));
return decoded;
}
/**
* integer to binary
* @param {Number} data
* @returns {String}
*/
function toBinary(data: number): string {
if (!Number.isSafeInteger(data)) {
throw new TypeError('value must be a safe integer');
}
return (data >>> 0).toString(2);
}
/**
* array to blob
* @param {Uint8Array} uint8ArrayData
* @returns {Blob}
*/
function arrayToBlob(uint8ArrayData: Uint8Array): Blob {
return new Blob([uint8ArrayData as never], {
type: "text/plain"
});
}
/**
* blob to uint8array
* @param {Blob} data
* @returns {Uint8Array}
*/
function blobToUint8array(data: Blob): Promise<ArrayBuffer> {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.addEventListener("loadend", () => {
resolve(reader.result as ArrayBuffer);
});
reader.readAsArrayBuffer(data);
});
}
/**
* array to stream
* @param {Array<Uint8Array>} data
* @returns {ReadableStream }
*/
/* Example:
const uint8ArrayDataArr = [
[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,30,0,0,0,30,8,6,0,0,0,59,48,174,162,0,0,0,220,73,68,65,84,72,199,237,214,81,14,194,32,12,0,80,60,128,215,219,49,28,91,118,10,55,216,53,188,132,137,39,19,71,130,75,69,42,148,194,76,116,31,253,89,40,111,233,104,153,48,198,136,111,132,216,225,255,134,143,151,166,84,28,150,152,151,24,158,207,182,130,45,106,92,12,91,193,16,93,241,218,112,8,181,113,174,9,163,232,90,234,130,223,50,134,142,47,135,11,36,216,183,57,49,81,29,67,125,120,116,11,238,12,60,9,133,240,228,45,180,120,91,11,133,112,31,72,176,184,100,162,19,150,3,75,157,139,147,209,208,225,234,136,184,202,65,177,118,146,200,102,178,20,250,169,143,49,188,43,129,198,6,136,116,101,246,55,191,33,168,162,116,65,108,114,97,56,11,77,29,153,109,4,87,57,195,38,117,86,95,75,162,20,56,84,114,205,153,233,148,219,9,226,154,123,131,81,175,69,201,41,239,27,188,255,222,254,52,252,0,234,253,186,89,222,225,73,252,0,0,0,0,73,69,78,68,174,66,96,130]
];
const readableStream = arrayToStream(uint8ArrayDataArr);
*/
function arrayToStream(data: Array<number>): ReadableStream<Uint8Array> {
// @return --> ReadableStream {locked: false}
return new ReadableStream<Uint8Array>({
start(controller) {
// push a chunk
data.forEach(function(chunk) {
controller.enqueue(new Uint8Array(chunk));
});
},
pull(controller) {
// Called `read()` when the controller's queue is empty.
//controller.enqueue(...);
controller.close();
},
cancel(reason) {
// Called when the stream is canceled.
},
});
}
/**
* read stream
* @param {ReadableStream } data
* @returns {Promise}
*/
/* Example:
readStream(readableStream).then((value) => {
console.log(value);
// iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAA3ElEQVRIx+3WUQ7CIAwAUDyA19sxHFt2CjfYNbyEiScTR4JLRSqUwkx0H/1ZKG/paJkwxohvhNjh/4aPl6ZUHJaYlxiez7aCLWpcDFvBEF3x2nAItXGuCaPoWuqC3zKGji+HCyTYtzkxUR1DfXh0C+4MPAmF8OQttHhbC4VwH0iwuGSiE5YDS52Lk9HQ4eqIuMpBsXaSyGayFPqpjzG8K4HGBoh0ZfY3vyGoonRBbHJhOAtNHZltBFc5wyZ1Vl9LohQ4VHLNmemU2wnimnuDUa9FySnvG7z/3v40/ADq/bpZ3uFJ/AAAAABJRU5ErkJggg==
// test: <img src="data:image/png;base64,iVBORw0KGgo..." >
});
*/
async function readStream(data: ReadableStream): Promise<string> {
let resReceived: string = '';
const stream: ReadableStream = data; // ReadableStream {locked: false}
const readInto = async (stream: ReadableStream): Promise<void> => {
const reader: ReadableStreamDefaultReader = stream.getReader();
async function pump(): Promise<void> {
const { done, value } = await reader.read();
if (done) {
return;
}
// value for fetch streams is a Uint8Array
const base64String: string = uint8arrayToBase64Str(value);
resReceived += base64String;
return pump();
}
return pump();
}
await readInto(stream);
return resReceived;
}
export {
base64ToArrayBuffer,
arrayBufferToUint8Array,
uint8arrayToArr,
arrayToUint8array,
uint8arrayToBase64Str,
decodeBase64Str,
toBinary,
arrayToBlob,
blobToUint8array,
arrayToStream,
readStream
}