react-native-quick-base64
Version:
A native implementation of base64 in C++ for React Native
116 lines (104 loc) • 3.03 kB
JavaScript
import { NativeModules } from 'react-native';
const Base64Module = NativeModules.QuickBase64;
if (Base64Module && typeof global.base64FromArrayBuffer !== 'function') {
Base64Module.install();
}
/**
* Calculates valid length and placeholder length for base64 string
*/
function getLens(b64) {
const len = b64.length;
if (len % 4 > 0) {
throw new Error('Invalid string. Length must be a multiple of 4');
}
let validLen = b64.indexOf('=');
if (validLen === -1) validLen = len;
const placeHoldersLen = validLen === len ? 0 : 4 - validLen % 4;
return [validLen, placeHoldersLen];
}
/**
* Converts Uint8Array to string
*/
function uint8ArrayToString(array) {
let out = '';
for (let i = 0; i < array.length; i++) {
const charCode = array[i];
if (charCode !== undefined) {
out += String.fromCharCode(charCode);
}
}
return out;
}
/**
* Converts string to ArrayBuffer
*/
function stringToArrayBuffer(str) {
const buf = new ArrayBuffer(str.length);
const bufView = new Uint8Array(buf);
for (let i = 0; i < str.length; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
}
/**
* Calculates the byte length of a base64 string
*/
export function byteLength(b64) {
const [validLen, placeHoldersLen] = getLens(b64);
return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen;
}
/**
* Converts base64 string to Uint8Array
*/
export function toByteArray(b64, removeLinebreaks = false) {
return new Uint8Array(global.base64ToArrayBuffer(b64, removeLinebreaks));
}
/**
* Converts Uint8Array to base64 string
*/
export function fromByteArray(uint8, urlSafe = false) {
if (uint8.buffer.byteLength > uint8.byteLength || uint8.byteOffset > 0) {
const buffer = uint8.buffer instanceof ArrayBuffer ? uint8.buffer.slice(uint8.byteOffset, uint8.byteOffset + uint8.byteLength) : new ArrayBuffer(uint8.byteLength);
if (buffer instanceof ArrayBuffer) {
return global.base64FromArrayBuffer(buffer, urlSafe);
}
}
const buffer = uint8.buffer instanceof ArrayBuffer ? uint8.buffer : new ArrayBuffer(uint8.byteLength);
return global.base64FromArrayBuffer(buffer, urlSafe);
}
/**
* Base64 encode a string
* @deprecated Use native btoa() instead - now supported in Hermes
*/
export function btoa(data) {
return global.base64FromArrayBuffer(stringToArrayBuffer(data));
}
/**
* Base64 decode a string
* @deprecated Use native atob() instead - now supported in Hermes
*/
export function atob(b64) {
return uint8ArrayToString(toByteArray(b64));
}
/**
* Adds btoa and atob to global scope
*/
export function shim() {
global.btoa = btoa;
global.atob = atob;
}
/**
* Returns native base64 functions
*/
export const getNative = () => ({
base64FromArrayBuffer: global.base64FromArrayBuffer,
base64ToArrayBuffer: global.base64ToArrayBuffer
});
/**
* Removes padding characters from base64 string
*/
export const trimBase64Padding = str => {
return str.replace(/[.=]{1,2}$/, '');
};
//# sourceMappingURL=index.js.map
;