/* global window, dcodeIO */ /* eslint-disable no-proto, no-restricted-syntax, guard-for-in */ window.textsecure = window.textsecure || {}; /** ******************************* *** Type conversion utilities *** ******************************** */ // Strings/arrays // TODO: Throw all this shit in favor of consistent types // TODO: Namespace const StaticByteBufferProto = new dcodeIO.ByteBuffer().__proto__; const StaticArrayBufferProto = new ArrayBuffer().__proto__; const StaticUint8ArrayProto = new Uint8Array().__proto__; function getString(thing) { if (thing === Object(thing)) { if (thing.__proto__ === StaticUint8ArrayProto) return String.fromCharCode.apply(null, thing); if (thing.__proto__ === StaticArrayBufferProto) return getString(new Uint8Array(thing)); if (thing.__proto__ === StaticByteBufferProto) return thing.toString('binary'); } return thing; } function getStringable(thing) { return ( typeof thing === 'string' || typeof thing === 'number' || typeof thing === 'boolean' || (thing === Object(thing) && (thing.__proto__ === StaticArrayBufferProto || thing.__proto__ === StaticUint8ArrayProto || thing.__proto__ === StaticByteBufferProto)) ); } // Number formatting utils window.textsecure.utils = (() => { const self = {}; self.unencodeNumber = number => number.split('.'); self.isNumberSane = number => number[0] === '+' && /^[0-9]+$/.test(number.substring(1)); /** ************************ *** JSON'ing Utilities *** ************************* */ function ensureStringed(thing) { if (getStringable(thing)) return getString(thing); else if (thing instanceof Array) { const res = []; for (let i = 0; i < thing.length; i += 1) res[i] = ensureStringed(thing[i]); return res; } else if (thing === Object(thing)) { const res = {}; for (const key in thing) res[key] = ensureStringed(thing[key]); return res; } else if (thing === null) { return null; } throw new Error(`unsure of how to jsonify object of type ${typeof thing}`); } self.jsonThing = thing => JSON.stringify(ensureStringed(thing)); return self; })();