slump
Version:
create random json
119 lines (99 loc) • 2.46 kB
JavaScript
var sodium = require('sodium-universal')
var util = require('core-util-is')
var bs58 = require('bs58')
function randomBytes (size) {
var buf = Buffer.allocUnsafe(size)
sodium.randombytes_buf(buf)
return buf
}
function byte () {
return randomBytes(1)[0]
}
function integer (signed) {
var bytes = randomBytes(4)
var result = 0
for (var i = 0; i < 4; ++i) {
result *= 256
result += bytes[i]
}
if (signed && bytes[3] >= 128) return 0 - result
return result
}
function float () {
var n = integer(true)
var d = integer() || 1
return n / d
}
function string (opts, length) {
var enc = 'utf8'
if (util.isNumber(opts)) {
length = opts
} else if (util.isObject(opts)) {
length = length || opts.length
enc = opts.enc || enc
if (util.isArray(opts.values) && opts.values.length > 0) {
var i = integer() % opts.values.length
return opts.values[i]
}
}
if (!length) length = integer() % 101
if (!length) return ''
var bytes = randomBytes(length * 10)
return encode(bytes, enc).substr(0, length)
}
function array (length, depth) {
depth = depth || 0
if (!length) length = integer() % 11
var result = []
for (var i = 0; i < length; ++i) {
result[i] = json(depth + 1)
}
return result
}
function obj (size, depth) {
depth = depth || 0
if (!size) size = integer() % 11
var result = {}
for (var i = 0; i < size; ++i) {
var key = generateUniqueKey()
var value = json(depth + 1)
result[key] = value
}
function generateUniqueKey () {
var length, key
do {
length = 1 + integer() % 10
key = string(length)
} while (result[key] !== undefined)
return key
}
return result
}
function json (depth) {
depth = depth || 0
var type = byte() % 8
// if we are too deep don't generate more depth
if (depth > 4 && type > 5) type %= 5
if (type === 0) return false
if (type === 1) return true
if (type === 2) return null
if (type === 3) return integer(true)
if (type === 4) return float()
if (type === 5) return string()
if (type === 6) return array(null, depth)
if (type === 7) return obj(null, depth)
}
function encode (bytes, enc) {
if (enc === 'base58') {
return bs58.encode(bytes)
}
return bytes.toString(enc)
}
exports.bytes = randomBytes
exports.byte = byte
exports.integer = integer
exports.float = float
exports.string = string
exports.array = array
exports.obj = obj
exports.json = json