Comparing version 1.0.1 to 1.0.2
@@ -20,3 +20,3 @@ const Types = require('./src/types') | ||
/** | ||
@arg {object} definitions - examples https://github.com/eosjs/json/blob/master/schema/operations.json | ||
@arg {object} definitions - examples https://github.com/eosjs/json/blob/master/schema/generated.json | ||
@arg {SerializerConfig} config | ||
@@ -23,0 +23,0 @@ @return {CreateStruct} |
/* eslint-env mocha */ | ||
const assert = require('assert') | ||
const Fcbuffer = require('.') | ||
const Types = require('./src/types') | ||
const Struct = require('./src/struct') | ||
const {create, toBuffer, fromBuffer} = require('./src/fcbuffer') | ||
const {create} = require('./src/fcbuffer') | ||
@@ -142,3 +143,3 @@ describe('API', function () { | ||
assertCompile({Struct: {fields: {checksum: 'FixedBytes32'}}}) | ||
throws(() => assertCompile({Struct: {}}), /Expecting Struct.base or Struct.fields/) | ||
throws(() => assertCompile({Struct: {}}), /Expecting Struct.fields or Struct.base/) | ||
throws(() => assertCompile({Struct: {base: {obj: 'val'}}}), /Expecting string/) | ||
@@ -207,7 +208,58 @@ throws(() => assertCompile({Struct: {fields: 'String'}}), /Expecting object/) | ||
const type = structs.Struct | ||
throws(() => fromBuffer(type, Buffer.from('')), /Illegal offset/) | ||
throws(() => Fcbuffer.fromBuffer(type, Buffer.from('')), /Illegal offset/) | ||
}) | ||
}) | ||
function assertCompile (definitions, config = {defaults: true, debug: false}) { | ||
describe('Override', function () { | ||
it('Struct', function () { | ||
const definitions = { | ||
Message: { | ||
fields: { | ||
type: 'String', // another definition (like transfer) | ||
data: 'Bytes' | ||
} | ||
}, | ||
transfer: { | ||
fields: { | ||
from: 'String', | ||
to: 'String' | ||
} | ||
} | ||
} | ||
const config = { | ||
override: { | ||
'Message.data.fromByteBuffer': ({fields, object, b, config}) => { | ||
const ser = (object.type || '') == '' ? fields.data : structs[object.type] | ||
object.data = ser.fromByteBuffer(b, config) | ||
}, | ||
'Message.data.appendByteBuffer': ({fields, object, b}) => { | ||
const ser = (object.type || '') == '' ? fields.data : structs[object.type] | ||
ser.appendByteBuffer(b, object.data) | ||
}, | ||
'Message.data.fromObject': ({fields, serializedObject, result}) => { | ||
const {data, type} = serializedObject | ||
const ser = (type || '') == '' ? fields.data : structs[type] | ||
result.data = ser.fromObject(data) | ||
}, | ||
'Message.data.toObject': ({fields, serializedObject, result, config}) => { | ||
const {data, type} = serializedObject || {} | ||
const ser = (type || '') == '' ? fields.data : structs[type] | ||
result.data = ser.toObject(data, config) | ||
}, | ||
} | ||
} | ||
const {structs, errors} = create(definitions, Types(config)) | ||
assert.equal(errors.length, 0) | ||
assertSerializer(structs.Message, { | ||
type: 'transfer', | ||
data: { | ||
from: 'slim', | ||
to: 'charles' | ||
} | ||
}) | ||
}) | ||
}) | ||
function assertCompile (definitions, config) { | ||
config = Object.assign({defaults: true, debug: false}, config) | ||
const {errors, structs} = create(definitions, Types(config)) | ||
@@ -226,4 +278,4 @@ assert.equal(errors.length, 0, errors[0]) | ||
const obj = type.fromObject(value) // tests fromObject | ||
const buf = toBuffer(type, obj) // tests appendByteBuffer | ||
const obj2 = fromBuffer(type, buf) // tests fromByteBuffer | ||
const buf = Fcbuffer.toBuffer(type, obj) // tests appendByteBuffer | ||
const obj2 = Fcbuffer.fromBuffer(type, buf) // tests fromByteBuffer | ||
@@ -230,0 +282,0 @@ // tests toObject |
{ | ||
"name": "fcbuffer", | ||
"description": "Serialization library geared towards immutable data storage such as blockchains.", | ||
"version": "1.0.1", | ||
"version": "1.0.2", | ||
"main": "index.js", | ||
@@ -6,0 +6,0 @@ "license": "MIT", |
@@ -96,3 +96,3 @@ [![Build Status](https://travis-ci.org/jcalfee/fcbuffer.svg?branch=master)](https://travis-ci.org/jcalfee/fcbuffer) | ||
- Built-in Types: [types.js](./src/types.js) | ||
- EOS Definitions: [operations.json](https://github.com/eosjs/json/blob/master/schema/operations.json) | ||
- EOS Definitions: [generated.json](https://github.com/eosjs/json/blob/master/schema/generated.json) | ||
@@ -99,0 +99,0 @@ # Environment |
@@ -24,3 +24,3 @@ const ByteBuffer = require('bytebuffer') | ||
if (!base && !fields) { | ||
errors.push(`Expecting ${key}.base or ${key}.fields`) | ||
errors.push(`Expecting ${key}.fields or ${key}.base`) | ||
continue | ||
@@ -70,3 +70,3 @@ } | ||
// Structs can inherit another struct, they will share the same instance | ||
// Structs can inherit another struct, they will share the same instance | ||
for (const key in definitions) { | ||
@@ -89,2 +89,3 @@ const thisStruct = structs[key] | ||
// Create types from a string (ex Vector[Type]) | ||
function getTypeOrStruct (Type, typeArgs) { | ||
@@ -96,3 +97,3 @@ const typeatty = parseType(Type) | ||
if (arrayType == null) { | ||
// AnyType | ||
// AnyType | ||
const fieldStruct = structs[name] | ||
@@ -99,0 +100,0 @@ if (fieldStruct) { return fieldStruct } |
const ByteBuffer = require('bytebuffer') | ||
/** @class Struct */ | ||
/** | ||
@class Struct | ||
@arg {object} config.override = { | ||
'Message.data.appendByteBuffer': ({fields, object, b}) => {..} | ||
} | ||
Rare cases where specialized serilization is needed (ex A Message object has | ||
'type' and 'data' fields where object.type === 'transfer' can define | ||
serialization time Struct needed for 'data' .. This saves complexity for the | ||
end-user's working with json. See override unit test. | ||
*/ | ||
module.exports = (name, config = {debug: false}) => { | ||
config = Object.assign({override: {}}, config) | ||
const fields = {} | ||
@@ -39,3 +50,8 @@ return { | ||
} else { | ||
object[field] = type.fromByteBuffer(b, config) | ||
const fromByteBuffer = config.override[`${name}.${field}.fromByteBuffer`] | ||
if(fromByteBuffer) { | ||
fromByteBuffer({fields, object, b, config}) | ||
} else { | ||
object[field] = type.fromByteBuffer(b, config) | ||
} | ||
} | ||
@@ -65,3 +81,8 @@ } catch (e) { | ||
} else { | ||
type.appendByteBuffer(b, object[field]) | ||
const appendByteBuffer = config.override[`${name}.${field}.appendByteBuffer`] | ||
if(appendByteBuffer) { | ||
appendByteBuffer({fields, object, b}) | ||
} else { | ||
type.appendByteBuffer(b, object[field]) | ||
} | ||
} | ||
@@ -90,5 +111,10 @@ } | ||
} else { | ||
const value = serializedObject[field] | ||
const object = type.fromObject(value) | ||
result[field] = object | ||
const fromObject = config.override[`${name}.${field}.fromObject`] | ||
if(fromObject) { | ||
fromObject({fields, serializedObject, result}) | ||
} else { | ||
const value = serializedObject[field] | ||
const object = type.fromObject(value) | ||
result[field] = object | ||
} | ||
} | ||
@@ -113,8 +139,13 @@ } | ||
const object = type.toObject(serializedObject ? serializedObject[field] : null, config) | ||
if (field === '') { | ||
// structPtr | ||
result = Object.assign(result, object) | ||
const toObject = config.override[`${name}.${field}.toObject`] | ||
if(toObject) { | ||
toObject({fields, serializedObject, result, config}) | ||
} else { | ||
result[field] = object | ||
const object = type.toObject(serializedObject ? serializedObject[field] : null, config) | ||
if (field === '') { | ||
// structPtr | ||
result = Object.assign(result, object) | ||
} else { | ||
result[field] = object | ||
} | ||
} | ||
@@ -121,0 +152,0 @@ |
@@ -41,3 +41,5 @@ const BN = require('bn.js') | ||
config = Object.assign({defaults: false, debug: false, customTypes: {}}, config) | ||
const typeMap = Object.keys(Object.assign(types, config.customTypes)).reduce((map, name) => { | ||
const allTypes = Object.assign(types, config.customTypes) | ||
const createTypeReducer = (map, name) => { | ||
map[name] = (...args) => { | ||
@@ -48,3 +50,5 @@ const type = createType(name, config, ...args) | ||
return map | ||
}, {}) | ||
} | ||
const typeMap = Object.keys(allTypes).reduce(createTypeReducer, {}) | ||
typeMap.config = config | ||
@@ -234,3 +238,3 @@ return typeMap | ||
fromByteBuffer (b) { | ||
return Buffer.from(b.readVString(), 'utf8') | ||
return b.readVString() | ||
}, | ||
@@ -243,3 +247,3 @@ appendByteBuffer (b, value) { | ||
validate(value, validation) | ||
return Buffer.from(value, 'utf8') | ||
return value | ||
}, | ||
@@ -251,3 +255,3 @@ toObject (value) { | ||
validate(value, validation) | ||
return value.toString('utf8') | ||
return value | ||
} | ||
@@ -307,3 +311,3 @@ }) | ||
if (isEmpty(value)) { | ||
throw new Error(`Required value ${validation.typeName}`) | ||
throw new Error(`Required ${validation.typeName}`) | ||
} | ||
@@ -331,3 +335,3 @@ | ||
if (isEmpty(value)) { | ||
throw new Error(`Required value ${validation.typeName}`) | ||
throw new Error(`Required ${validation.typeName}`) | ||
} | ||
@@ -334,0 +338,0 @@ const {signed = false, bits = 54} = validation |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
66044
976