/* * vim: ts=4:sw=4:expandtab */ window.textsecure = window.textsecure || {}; /********************************* *** Type conversion utilities *** *********************************/ // Strings/arrays //TODO: Throw all this shit in favor of consistent types //TODO: Namespace var StaticByteBufferProto = new dcodeIO.ByteBuffer().__proto__; var StaticArrayBufferProto = new ArrayBuffer().__proto__; var 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 = function() { var self = {}; self.unencodeNumber = function(number) { return number.split("."); }; self.isNumberSane = function(number) { return 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) { var res = []; for (var i = 0; i < thing.length; i++) res[i] = ensureStringed(thing[i]); return res; } else if (thing === Object(thing)) { var res = {}; for (var 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 = function(thing) { return JSON.stringify(ensureStringed(thing)); } return self; }();