Skip to content

Commit e3f6b7d

Browse files
committed
new schema format
1 parent 9baa4f7 commit e3f6b7d

File tree

7 files changed

+195
-135
lines changed

7 files changed

+195
-135
lines changed

README.md

Lines changed: 89 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,93 @@
1-
# data-struct
1+
# Data structure
22

3-
Convert between JS object and Node.js buffer
3+
Convert between JS object and Node.js buffer with with rigidly predetermined scheme.
44

5+
## Installing
6+
7+
```shell
8+
npm install data-struct
59
```
6-
{
7-
propname: DataTypes.uint
8-
propname2: [DataTypes.list, DataTypes.string]
9-
propname3: [{
10-
propname: [{
11-
propname: DataTypes.uint
12-
}]
13-
propname4: [DataTypes.list, DataTypes.uint]
14-
}],
15-
propname5: [DataTypes.struct, {
16-
propname: propvalue
17-
}],
18-
propname6: [DataTypes.list,
19-
{
20-
list: []
21-
}
22-
]
23-
24-
}
25-
26-
27-
{
28-
propname: 42
29-
propname2: ['42','43','45']
30-
propname3: [
31-
{
32-
propname: [1,2,3]
33-
},
34-
{
35-
propname: [1,2,3]
36-
},
37-
],
38-
propname4: [
39-
[1,2,3],
40-
[1,2,3],
41-
[1,2,3]
42-
]
43-
44-
}
10+
11+
12+
## Example & usage
13+
14+
```javascript
15+
16+
var DataTypes = require("data-struct").DataTypes;
17+
var DataReader = require("data-struct").DataReader;
18+
var DataWriter = require("data-struct").DataWriter;
19+
20+
var hero = {
21+
id: 9,
22+
name: 'CirnoBaka',
23+
hp: 146,
24+
skills: [
25+
{
26+
id: 34,
27+
description: 'freezing frogs'
28+
},
29+
{
30+
id: 16,
31+
description: 'perfect math'
32+
}
33+
],
34+
playable: false,
35+
experience: 99999999,
36+
position: {
37+
x: 2,
38+
y: 3
39+
}
40+
};
41+
42+
var heroScheme = {
43+
id: DataTypes.uint32,
44+
name: DataTypes.string,
45+
hp: DataTypes.int16,
46+
skills: [{
47+
id: DataTypes.uint16,
48+
description: DataTypes.string
49+
}],
50+
playable: DataTypes.boolean,
51+
experience: DataTypes.uint32,
52+
position: {
53+
x: DataTypes.uint16,
54+
y: DataTypes.uint16
55+
}
56+
};
57+
58+
var heroBuf = DataWriter(hero, heroScheme);
59+
var heroClone = DataReader(heroBuf, heroScheme);
60+
61+
62+
//nested arrays
63+
var map = [
64+
[0,1,0,0,1,1,1,1]
65+
[1,1,0,0,0,1,1,1]
66+
[1,1,0,0,0,0,1,1]
67+
[1,1,1,1,0,0,1,1]
68+
[0,1,1,0,0,0,1,1]
69+
[0,0,0,0,0,1,1,1]
70+
[0,0,0,0,1,1,1,1]
71+
];
72+
73+
var mapScheme = [[DataTypes.uint8]];
74+
75+
var mapBuf = DataWriter(map, mapScheme);
76+
var mapClone = DataReader(mapBuf, mapScheme);
4577
```
78+
79+
80+
## Data types
81+
82+
* **boolean** - 1 byte
83+
* **int8** - 1 byte
84+
* **uint8** - 1 byte
85+
* **int16** - 2 bytes
86+
* **uint16** - 2 bytes
87+
* **int32** - 4 bytes
88+
* **uint32** - 4 bytes
89+
* **float** - 4 bytes
90+
* **double** - 8 bytes
91+
* **string** - 2 bytes header + string bytes length (max length: 65535 bytes, **not string length!**)
92+
* **shortBuffer** - 2 bytes header + buffer length (max length: 65535 bytes)
93+
* **buffer** - 4 bytes header + buffer length (max length 4294967295 bytes)

benchmark/benchmark.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
var Benchmark = require('benchmark');
2+
var suite = new Benchmark.Suite;
3+
4+
DataTypes = require("../src/index").DataTypes;
5+
DataReader = require("../src/index").DataReader;
6+
DataWriter = require("../src/index").DataWriter;
7+
8+
9+
10+
var suites = {
11+
'int32': {
12+
object: 0x0F00FF00,
13+
scheme: DataTypes.int32
14+
},
15+
'string': {
16+
object: 'Hello I String',
17+
scheme: DataTypes.string
18+
},
19+
'nested': {
20+
object: { nested: { nested2: { nested3: { nested4: { nested5: 42 } } } } },
21+
scheme: { nested: { nested2: { nested3: { nested4: { nested5: DataTypes.uint8 } } } } }
22+
},
23+
'list of list': {
24+
object: [
25+
[90,10,101],
26+
[20,30,400],
27+
[100,110,1]
28+
],
29+
scheme: [[DataTypes.int16]]
30+
}
31+
};
32+
33+
for(s in suites) {
34+
var object = suites[s].object;
35+
var scheme = suites[s].scheme;
36+
37+
(function(s, object, scheme) {
38+
var buf = null;
39+
var obj = null;
40+
suite.add(s + '#writing to buffer', function () {
41+
buf = DataWriter(object, scheme);
42+
})
43+
.add(s + '#reading from buffer', function () {
44+
obj = DataReader(buf, scheme);
45+
});
46+
})(s, object, scheme);
47+
}
48+
49+
50+
suite.on('cycle', function(event) {
51+
console.log(String(event.target));
52+
}).run();

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727
"grunt-simple-mocha": "^0.4.0",
2828
"jit-grunt": "^0.3.2",
2929
"chai": "^1.9.1",
30-
"grunt-contrib-jshint": "^0.9.2"
30+
"grunt-contrib-jshint": "^0.9.2",
31+
"benchmark": "^1.0.0"
3132
},
32-
"dependencies": {
33-
}
33+
"dependencies": {}
3434
}

src/dataReader.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,7 @@ typesTable[DataTypes.buffer] = function (pointer, buffer) {
8383
return res;
8484
};
8585

86-
typesTable[DataTypes.struct] = function (pointer, buffer, scheme) {
87-
return structureReader(pointer, buffer, scheme);
88-
};
89-
90-
typesTable[DataTypes.list] = function (pointer, buffer, scheme) {
86+
function list (pointer, buffer, scheme) {
9187
var length = buffer.readUInt16BE(pointer.offset);
9288
pointer.offset += 2;
9389

@@ -96,10 +92,10 @@ typesTable[DataTypes.list] = function (pointer, buffer, scheme) {
9692
res.push(structureReader(pointer, buffer, scheme));
9793
}
9894
return res;
99-
};
95+
}
10096

10197
var structureReader = function (pointer, buffer, scheme) {
102-
var res;
98+
var res = {};
10399

104100
if (arguments.length === 2) {
105101
scheme = buffer;
@@ -111,17 +107,21 @@ var structureReader = function (pointer, buffer, scheme) {
111107

112108
if(typeof scheme === 'number') {
113109
res = typesTable[scheme](pointer, buffer);
110+
} else if (Array.isArray(scheme)) {
111+
res = list(pointer, buffer, scheme[0]);
114112
} else {
115-
res = {};
116113
for (var el in scheme) {
117114
var s = scheme[el];
118115
if (typeof s === 'number') {
119116
res[el] = typesTable[s](pointer, buffer);
117+
} else if (Array.isArray(s)) {
118+
res[el] = list(pointer, buffer, s[0]);
120119
} else {
121-
res[el] = typesTable[s.type](pointer, buffer, s.scheme);
120+
res[el] = structureReader(pointer, buffer, s);
122121
}
123122
}
124123
}
124+
125125
return res;
126126
};
127127

src/dataTypes.js

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,5 @@ module.exports = {
1111

1212
string: 0x200,
1313
shortBuffer: 0x210,
14-
buffer: 0x211,
15-
16-
struct: 0x500,
17-
list: 0x501
14+
buffer: 0x211
1815
};

src/dataWriter.js

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -97,11 +97,7 @@ typesTable[DataTypes.buffer] = function (value) {
9797
return res;
9898
};
9999

100-
typesTable[DataTypes.struct] = function (value, scheme) {
101-
return structureWriter(value, scheme);
102-
};
103-
104-
typesTable[DataTypes.list] = function (value, scheme) {
100+
function list (value, scheme) {
105101
if (!Array.isArray(value)) {
106102
throw Error('Value is not array.');
107103
}
@@ -117,23 +113,24 @@ typesTable[DataTypes.list] = function (value, scheme) {
117113
}
118114

119115
return Buffer.concat(res);
120-
};
116+
}
121117

122118
var structureWriter = function (object, scheme) {
123119
var res = [];
120+
124121
if(typeof scheme === 'number') {
125122
res.push(typesTable[scheme](object));
123+
} else if(Array.isArray(scheme)) {
124+
res.push(list(object, scheme[0]));
126125
} else {
127-
if(Array.isArray(scheme)) {
128-
console.log('bingo')
129-
} else {
130-
for (var el in scheme) {
131-
var s = scheme[el];
132-
if (typeof s === 'number') {
133-
res.push(typesTable[s](object[el]));
134-
} else {
135-
res.push(typesTable[s.type](object[el], s.scheme));
136-
}
126+
for (var el in scheme) {
127+
var s = scheme[el];
128+
if (typeof s === 'number') {
129+
res.push(typesTable[s](object[el]));
130+
} else if (Array.isArray(s)) {
131+
res.push(list(object[el], s[0]));
132+
} else {
133+
res.push(structureWriter(object[el], s));
137134
}
138135
}
139136
}

0 commit comments

Comments
 (0)