Files
AutoJs6/app/src/main/assets/modules/__base64__.js

80 lines
2.8 KiB
JavaScript

/**
* @param {ScriptRuntime} scriptRuntime
* @param {org.mozilla.javascript.Scriptable | global} scope
* @return {Internal.Base64}
*/
module.exports = function (scriptRuntime, scope) {
const Base64 = android.util.Base64;
let _ = {
Base64Ctor: (/* @IIFE */ () => {
/**
* @implements Internal.Base64
*/
const Base64Ctor = function () {
/* Empty body. */
};
Base64Ctor.prototype = {
constructor: Base64Ctor,
encode(o, encoding) {
let niceEncoding = _.parseEncoding(encoding);
return Base64.encodeToString(_.toBytes(o, niceEncoding), Base64.NO_WRAP);
},
decode(o, encoding) {
let niceEncoding = _.parseEncoding(encoding);
let decoded = Base64.decode(_.toBytes(o, niceEncoding), Base64.NO_WRAP);
// noinspection JSValidateTypes
return typeof niceEncoding !== 'undefined'
? String(new java.lang.String(decoded, niceEncoding))
: String(new java.lang.String(decoded));
},
};
return Base64Ctor;
})(),
/**
* Ignored (but not fuzzy) regex matching for non-word characters.
*/
parseEncoding: (encoding) => {
return [
StandardCharsets.ISO_8859_1,
StandardCharsets.US_ASCII,
StandardCharsets.UTF_8,
StandardCharsets.UTF_16,
StandardCharsets.UTF_16BE,
StandardCharsets.UTF_16LE,
].find((cs) => cs.name().toLowerCase().replace(/\W+/g, '')
=== String(encoding).trim().toLowerCase().replace(/\W+/g, ''));
},
toBytes(o, encoding) {
if (typeof o === 'string') {
// noinspection JSValidateTypes
/** @type { java.lang.String } */
let string = new java.lang.String(o);
return typeof encoding !== 'undefined'
? string.getBytes(encoding)
: string.getBytes();
}
if (util.getClassName(o) === '[B') {
return o;
}
if (Array.isArray(o)) {
return ArrayUtils.jsBytesToByteArray(o);
}
if (!isNullish(o)) {
if (typeof o.toString === 'function') {
return this.toBytes(o.toString());
}
}
throw Error(`Can't convert o (${o}) to bytes`);
},
};
// noinspection UnnecessaryLocalVariableJS
/**
* @type {Internal.Base64}
*/
const base64 = new _.Base64Ctor();
return base64;
};