laravel-crypton
Version:
Helper for laravel crypton for request response encryption
175 lines (158 loc) • 5.38 kB
JavaScript
let unserialize = function (data) {
var $global = (typeof window !== 'undefined' ? window : global)
var utf8Overhead = function (str) {
var s = str.length
for (var i = str.length - 1; i >= 0; i--) {
var code = str.charCodeAt(i)
if (code > 0x7f && code <= 0x7ff) {
s++
} else if (code > 0x7ff && code <= 0xffff) {
s += 2
}
// trail surrogate
if (code >= 0xDC00 && code <= 0xDFFF) {
i--
}
}
return s - 1
}
var error = function (type,
msg, filename, line) {
throw new $global[type](msg, filename, line)
}
var readUntil = function (data, offset, stopchr) {
var i = 2
var buf = []
var chr = data.slice(offset, offset + 1)
while (chr !== stopchr) {
if ((i + offset) > data.length) {
error('Error', 'Invalid')
}
buf.push(chr)
chr = data.slice(offset + (i - 1), offset + i)
i += 1
}
return [buf.length, buf.join('')]
}
var readChrs = function (data, offset, length) {
var i, chr, buf
buf = []
for (i = 0; i < length; i++) {
chr = data.slice(offset + (i - 1), offset + i)
buf.push(chr)
length -= utf8Overhead(chr)
}
return [buf.length, buf.join('')]
}
function _unserialize(data, offset) {
var dtype
var dataoffset
var keyandchrs
var keys
var contig
var length
var array
var readdata
var readData
var ccount
var stringlength
var i
var key
var kprops
var kchrs
var vprops
var vchrs
var value
var chrs = 0
var typeconvert = function (x) {
return x
}
if (!offset) {
offset = 0
}
dtype = (data.slice(offset, offset + 1)).toLowerCase()
dataoffset = offset + 2
switch (dtype) {
case 'i':
typeconvert = function (x) {
return parseInt(x, 10)
}
readData = readUntil(data, dataoffset, ';')
chrs = readData[0]
readdata = readData[1]
dataoffset += chrs + 1
break
case 'b':
typeconvert = function (x) {
return parseInt(x, 10) !== 0
}
readData = readUntil(data, dataoffset, ';')
chrs = readData[0]
readdata = readData[1]
dataoffset += chrs + 1
break
case 'd':
typeconvert = function (x) {
return parseFloat(x)
}
readData = readUntil(data, dataoffset, ';')
chrs = readData[0]
readdata = readData[1]
dataoffset += chrs + 1
break
case 'n':
readdata = null
break
case 's':
ccount = readUntil(data, dataoffset, ':')
chrs = ccount[0]
stringlength = ccount[1]
dataoffset += chrs + 2
readData = readChrs(data, dataoffset + 1, parseInt(stringlength, 10))
chrs = readData[0]
readdata = readData[1]
dataoffset += chrs + 2
if (chrs !== parseInt(stringlength, 10) && chrs !== readdata.length) {
error('SyntaxError', 'String length mismatch')
}
break
case 'a':
readdata = {}
keyandchrs = readUntil(data, dataoffset, ':')
chrs = keyandchrs[0]
keys = keyandchrs[1]
dataoffset += chrs + 2
length = parseInt(keys, 10)
contig = true
for (i = 0; i < length; i++) {
kprops = _unserialize(data, dataoffset)
kchrs = kprops[1]
key = kprops[2]
dataoffset += kchrs
vprops = _unserialize(data, dataoffset)
vchrs = vprops[1]
value = vprops[2]
dataoffset += vchrs
if (key !== i) {
contig = false
}
readdata[key] = value
}
if (contig) {
array = new Array(length)
for (i = 0; i < length; i++) {
array[i] = readdata[i]
}
readdata = array
}
dataoffset += 1
break
default:
error('SyntaxError', 'Unknown / Unhandled data type(s): ' + dtype)
break
}
return [dtype, dataoffset - offset, typeconvert(readdata)]
}
return _unserialize((data + ''), 0)[2]
}
export default unserialize;