134 lines
2.1 KiB
Plaintext
134 lines
2.1 KiB
Plaintext
var blob = use('blob')
|
|
var utf8 = use('utf8')
|
|
|
|
var INT = new blob(8, false)
|
|
stone(INT)
|
|
|
|
var FP = new blob(8)
|
|
FP.write_fit(1,8)
|
|
stone(FP)
|
|
|
|
var ARRAY = new blob(8)
|
|
ARRAY.write_fit(2,8)
|
|
stone(ARRAY)
|
|
|
|
var RECORD = new blob(8)
|
|
RECORD.write_fit(3,8)
|
|
stone(RECORD)
|
|
|
|
var BLOB = new blob(8)
|
|
BLOB.write_fit(4,8)
|
|
stone(BLOB)
|
|
|
|
var TEXT = new blob(8)
|
|
TEXT.write_fit(5,8)
|
|
stone(TEXT)
|
|
|
|
var SYMBOL = new blob(8)
|
|
SYMBOL.write_fit(7,8)
|
|
stone(SYMBOL)
|
|
|
|
var NULL = new blob(56)
|
|
NULL.write_fit(0,56)
|
|
stone(NULL)
|
|
|
|
var FALSE = new blob(56)
|
|
FALSE.write_fit(2,56)
|
|
stone(FALSE)
|
|
|
|
var TRUE = new blob(56)
|
|
TRUE.write_fit(3, 56)
|
|
stone(TRUE)
|
|
|
|
var PRIVATE = new blob(56)
|
|
PRIVATE.write_fit(8, 56)
|
|
stone(PRIVATE)
|
|
|
|
var SYSTEM = new blob(56)
|
|
SYSTEM.write_fit(9, 56)
|
|
stone(SYSTEM)
|
|
|
|
var encoders = {}
|
|
|
|
encoders.number = function(b, val)
|
|
{
|
|
// encoding all as floats
|
|
b.write_fit(0,56)
|
|
b.write_blob(FP)
|
|
b.write_number(val)
|
|
}
|
|
|
|
function encode_array(b, val)
|
|
{
|
|
b.write_fit(val.length, 56)
|
|
b.write_blob(ARRAY)
|
|
for (var v of val)
|
|
encode_val(b, v)
|
|
}
|
|
|
|
function encode_object(b, val)
|
|
{
|
|
var keys = Object.keys(val)
|
|
b.write_fit(b, keys.length)
|
|
b.write_blob(RECORD)
|
|
for (var key of keys) {
|
|
if (typeof val[key] === 'function') continue
|
|
encoders.string(b, key)
|
|
encode_val(b, val[key])
|
|
}
|
|
}
|
|
|
|
function encode_blob(b, val)
|
|
{
|
|
b.write_fit(val.length, 56)
|
|
b.write_blob(BLOB)
|
|
b.write_blob(val)
|
|
}
|
|
|
|
encoders.object = function(b, val)
|
|
{
|
|
if (Array.isArray(val))
|
|
encode_array(b,val)
|
|
else if (val instanceof blob)
|
|
encode_blob(b,val)
|
|
else
|
|
encode_object(b,val)
|
|
}
|
|
|
|
encoders.string = function(b, val)
|
|
{
|
|
// encoding as utf8
|
|
b.write_fit(utf8.byte_length(val), 56)
|
|
b.write_blob(TEXT)
|
|
b.write_blob(utf8.encode(val))
|
|
}
|
|
|
|
encoders.boolean = function(b, val)
|
|
{
|
|
if (val)
|
|
b.write_blob(TRUE)
|
|
else
|
|
b.write_blob(FALSE)
|
|
b.write_blob(SYMBOL)
|
|
}
|
|
|
|
encoders.undefined = function(b, val)
|
|
{
|
|
b.write_blob(NULL)
|
|
b.write_blob(SYMBOL)
|
|
}
|
|
|
|
function encode_val(b, val)
|
|
{
|
|
encoders[typeof val](b, val)
|
|
}
|
|
|
|
function encode(val)
|
|
{
|
|
var b = new blob(8*256)// guess a good length
|
|
encode_val(b,val)
|
|
|
|
return stone(b)
|
|
}
|
|
|
|
return { INT,FP,ARRAY,RECORD,BLOB,TEXT,SYMBOL, encode } |