teeworlds 2.0.4 → 2.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/index.ts +1 -1
- package/lib/client.ts +3 -19
- package/lib/huffman.ts +228 -0
- package/lib/snapshot.ts +8 -4
- package/package.json +1 -1
- package/lib/MsgPacker.js +0 -53
- package/lib/MsgUnpacker.js +0 -37
- package/lib/client.js +0 -536
- package/lib/huffman.py +0 -224
- package/lib/snapshot.js +0 -397
package/README.md
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
# tw-chatonly
|
|
2
2
|
Library to connect a bot to a Teeworlds server.
|
|
3
3
|
|
|
4
|
+
https://www.npmjs.com/package/teeworlds
|
|
5
|
+
|
|
6
|
+
|
|
4
7
|
# Usage
|
|
5
8
|
Example file:
|
|
6
|
-
```const
|
|
7
|
-
let client = new
|
|
9
|
+
```const teeworlds = require('teeworlds');
|
|
10
|
+
let client = new teeworlds.Client("127.0.0.1", 8303, "teest");
|
|
8
11
|
|
|
9
12
|
client.connect();
|
|
10
13
|
|
package/index.ts
CHANGED
package/lib/client.ts
CHANGED
|
@@ -7,7 +7,9 @@ import { spawn } from 'child_process';
|
|
|
7
7
|
import MsgUnpacker from './MsgUnpacker';
|
|
8
8
|
import MsgPacker from './MsgPacker';
|
|
9
9
|
import { Snapshot } from './snapshot';
|
|
10
|
+
import Huffman from "./huffman";
|
|
10
11
|
|
|
12
|
+
const huff = new Huffman();
|
|
11
13
|
const SnapUnpacker = new Snapshot();
|
|
12
14
|
|
|
13
15
|
enum NETMSGTYPE {
|
|
@@ -83,24 +85,6 @@ interface chunk {
|
|
|
83
85
|
function toHexStream(buff: Buffer): string {
|
|
84
86
|
return buff.toJSON().data.map(a => ('0' + (a & 0xff).toString(16)).slice(-2)).join("");
|
|
85
87
|
}
|
|
86
|
-
async function decompress(buff: Buffer): Promise<Buffer> {
|
|
87
|
-
return new Promise((resolve) => {
|
|
88
|
-
// get hex stream
|
|
89
|
-
var hexStream = toHexStream(buff)
|
|
90
|
-
var ls = spawn('python', [__dirname + '\\huffman.py', hexStream, "-decompress"])
|
|
91
|
-
ls.stdout.on('data', (data) => {
|
|
92
|
-
resolve(Buffer.from(eval(data.toString()))); // convert stdout array to actual array, then convert the array to Buffer & return it
|
|
93
|
-
});
|
|
94
|
-
setTimeout(() => {
|
|
95
|
-
ls.stdin.end();
|
|
96
|
-
ls.stdout.destroy();
|
|
97
|
-
ls.stderr.destroy();
|
|
98
|
-
|
|
99
|
-
resolve(Buffer.from([]));
|
|
100
|
-
}, 750)
|
|
101
|
-
|
|
102
|
-
})
|
|
103
|
-
}
|
|
104
88
|
interface _packet {
|
|
105
89
|
twprotocol: { flags: number, ack: number, chunkAmount: number, size: number },
|
|
106
90
|
chunks: chunk[]
|
|
@@ -207,7 +191,7 @@ class Client extends EventEmitter {
|
|
|
207
191
|
return unpacked;
|
|
208
192
|
packet = packet.slice(3)
|
|
209
193
|
if (unpacked.twprotocol.flags & 128) {
|
|
210
|
-
packet =
|
|
194
|
+
packet = huff.decompress(packet)
|
|
211
195
|
if (packet.length == 1 && packet[0] == -1)
|
|
212
196
|
return unpacked
|
|
213
197
|
}
|
package/lib/huffman.ts
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
let FREQ_TABLE = [
|
|
2
|
+
1 << 30, 4545, 2657, 431, 1950, 919, 444, 482, 2244, 617, 838, 542, 715, 1814, 304, 240, 754, 212, 647, 186,
|
|
3
|
+
283, 131, 146, 166, 543, 164, 167, 136, 179, 859, 363, 113, 157, 154, 204, 108, 137, 180, 202, 176,
|
|
4
|
+
872, 404, 168, 134, 151, 111, 113, 109, 120, 126, 129, 100, 41, 20, 16, 22, 18, 18, 17, 19,
|
|
5
|
+
16, 37, 13, 21, 362, 166, 99, 78, 95, 88, 81, 70, 83, 284, 91, 187, 77, 68, 52, 68,
|
|
6
|
+
59, 66, 61, 638, 71, 157, 50, 46, 69, 43, 11, 24, 13, 19, 10, 12, 12, 20, 14, 9,
|
|
7
|
+
20, 20, 10, 10, 15, 15, 12, 12, 7, 19, 15, 14, 13, 18, 35, 19, 17, 14, 8, 5,
|
|
8
|
+
15, 17, 9, 15, 14, 18, 8, 10, 2173, 134, 157, 68, 188, 60, 170, 60, 194, 62, 175, 71,
|
|
9
|
+
148, 67, 167, 78, 211, 67, 156, 69, 1674, 90, 174, 53, 147, 89, 181, 51, 174, 63, 163, 80,
|
|
10
|
+
167, 94, 128, 122, 223, 153, 218, 77, 200, 110, 190, 73, 174, 69, 145, 66, 277, 143, 141, 60,
|
|
11
|
+
136, 53, 180, 57, 142, 57, 158, 61, 166, 112, 152, 92, 26, 22, 21, 28, 20, 26, 30, 21,
|
|
12
|
+
32, 27, 20, 17, 23, 21, 30, 22, 22, 21, 27, 25, 17, 27, 23, 18, 39, 26, 15, 21,
|
|
13
|
+
12, 18, 18, 27, 20, 18, 15, 19, 11, 17, 33, 12, 18, 15, 19, 18, 16, 26, 17, 18,
|
|
14
|
+
9, 10, 25, 22, 22, 17, 20, 16, 6, 16, 15, 20, 14, 18, 24, 335, 1517],
|
|
15
|
+
|
|
16
|
+
HUFFMAN_EOF_SYMBOL = 256,
|
|
17
|
+
HUFFMAN_MAX_SYMBOLS = HUFFMAN_EOF_SYMBOL + 1,
|
|
18
|
+
HUFFMAN_MAX_NODES = HUFFMAN_MAX_SYMBOLS * 2 - 1,
|
|
19
|
+
HUFFMAN_LUTBITS = 10,
|
|
20
|
+
HUFFMAN_LUTSIZE = 1 << HUFFMAN_LUTBITS,
|
|
21
|
+
HUFFMAN_LUTMASK = HUFFMAN_LUTSIZE - 1;
|
|
22
|
+
|
|
23
|
+
interface HuffmanNode {
|
|
24
|
+
bits: number;
|
|
25
|
+
numbits: number;
|
|
26
|
+
left: number;
|
|
27
|
+
right: number;
|
|
28
|
+
symbol: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
interface HuffmanConstructNode {
|
|
33
|
+
node_id: number;
|
|
34
|
+
frequency: number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
class Huffman {
|
|
38
|
+
nodes: HuffmanNode[];
|
|
39
|
+
decode_lut: number[];
|
|
40
|
+
num_nodes: number;
|
|
41
|
+
start_node_index: number;
|
|
42
|
+
|
|
43
|
+
constructor(frequencies = FREQ_TABLE) {
|
|
44
|
+
this.nodes = new Array<HuffmanNode>(HUFFMAN_MAX_NODES);
|
|
45
|
+
for (let i = 0; i < HUFFMAN_MAX_NODES; i++) {
|
|
46
|
+
this.nodes[i] = {} as HuffmanNode;
|
|
47
|
+
}
|
|
48
|
+
this.decode_lut = new Array<number>(HUFFMAN_LUTSIZE);
|
|
49
|
+
this.num_nodes = 0;
|
|
50
|
+
this.start_node_index = 0;
|
|
51
|
+
|
|
52
|
+
this.construct_tree(frequencies);
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
for (let i = 0; i < HUFFMAN_LUTSIZE; i++) {
|
|
56
|
+
let bits = i;
|
|
57
|
+
let broke = false;
|
|
58
|
+
let index = this.start_node_index;
|
|
59
|
+
for (let x = 0; x < HUFFMAN_LUTBITS; x++) {
|
|
60
|
+
if (bits & 1)
|
|
61
|
+
index = this.nodes[index].right;
|
|
62
|
+
else
|
|
63
|
+
index = this.nodes[index].left;
|
|
64
|
+
bits >>= 1;
|
|
65
|
+
if (this.nodes[index].numbits) {
|
|
66
|
+
this.decode_lut[i] = index;
|
|
67
|
+
broke = true;
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (!broke) {
|
|
72
|
+
this.decode_lut[i] = index;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
set_bits_r(node_index: number, bits: number, depth: number) {
|
|
77
|
+
if (this.nodes[node_index].right != 0xffff)
|
|
78
|
+
this.set_bits_r(this.nodes[node_index].right, bits | (1 << depth), depth + 1)
|
|
79
|
+
if (this.nodes[node_index].left != 0xffff)
|
|
80
|
+
this.set_bits_r(this.nodes[node_index].left, bits, depth + 1)
|
|
81
|
+
if (this.nodes[node_index].numbits) {
|
|
82
|
+
this.nodes[node_index].bits = bits;
|
|
83
|
+
this.nodes[node_index].numbits = depth;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
bubble_sort(index_list: number[], node_list: HuffmanConstructNode[], size: number) {
|
|
88
|
+
let changed = true;
|
|
89
|
+
while (changed) {
|
|
90
|
+
changed = false;
|
|
91
|
+
for (let i = 0; i < size-1; i++) {
|
|
92
|
+
if (node_list[index_list[i]].frequency < node_list[index_list[i + 1]].frequency) {
|
|
93
|
+
let temp = index_list[i];
|
|
94
|
+
index_list[i] = index_list[i + 1];
|
|
95
|
+
index_list[i + 1] = temp;
|
|
96
|
+
changed = true;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
size--;
|
|
100
|
+
}
|
|
101
|
+
return index_list;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
construct_tree(frequencies = FREQ_TABLE) {
|
|
105
|
+
let nodes_left_storage: HuffmanConstructNode[] = new Array<HuffmanConstructNode>(HUFFMAN_MAX_SYMBOLS);
|
|
106
|
+
for (let i = 0; i < HUFFMAN_MAX_SYMBOLS; i++) {
|
|
107
|
+
nodes_left_storage[i] = {} as HuffmanConstructNode;
|
|
108
|
+
}
|
|
109
|
+
let nodes_left: number[] = new Array<number>(HUFFMAN_MAX_SYMBOLS);
|
|
110
|
+
let num_nodes_left = HUFFMAN_MAX_SYMBOLS;
|
|
111
|
+
|
|
112
|
+
for (let i = 0; i < HUFFMAN_MAX_SYMBOLS; i++) {
|
|
113
|
+
this.nodes[i].numbits = 0xFFFFFFFF;
|
|
114
|
+
this.nodes[i].symbol = i;
|
|
115
|
+
this.nodes[i].left = 0xFFFF;
|
|
116
|
+
this.nodes[i].right = 0xFFFF;
|
|
117
|
+
|
|
118
|
+
if (i == HUFFMAN_EOF_SYMBOL) {
|
|
119
|
+
nodes_left_storage[i].frequency = 1;
|
|
120
|
+
} else
|
|
121
|
+
nodes_left_storage[i].frequency = frequencies[i];
|
|
122
|
+
nodes_left_storage[i].node_id = i;
|
|
123
|
+
nodes_left[i] = i;
|
|
124
|
+
}
|
|
125
|
+
this.num_nodes = HUFFMAN_MAX_SYMBOLS;
|
|
126
|
+
|
|
127
|
+
while (num_nodes_left > 1) {
|
|
128
|
+
nodes_left = this.bubble_sort(nodes_left, nodes_left_storage, num_nodes_left);
|
|
129
|
+
|
|
130
|
+
this.nodes[this.num_nodes].numbits = 0;
|
|
131
|
+
this.nodes[this.num_nodes].left = nodes_left_storage[nodes_left[num_nodes_left - 1]].node_id
|
|
132
|
+
this.nodes[this.num_nodes].right = nodes_left_storage[nodes_left[num_nodes_left - 2]].node_id
|
|
133
|
+
|
|
134
|
+
nodes_left_storage[nodes_left[num_nodes_left - 2]].node_id = this.num_nodes;
|
|
135
|
+
nodes_left_storage[nodes_left[num_nodes_left - 2]].frequency = nodes_left_storage[nodes_left[num_nodes_left - 1]].frequency
|
|
136
|
+
+ nodes_left_storage[nodes_left[num_nodes_left - 2]].frequency
|
|
137
|
+
this.num_nodes++;
|
|
138
|
+
num_nodes_left--;
|
|
139
|
+
}
|
|
140
|
+
this.start_node_index = this.num_nodes-1;
|
|
141
|
+
this.set_bits_r(this.start_node_index, 0, 0);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
compress(inp_buffer: Buffer, start_index = 0, size: number = 0): Buffer {
|
|
145
|
+
let output = [];
|
|
146
|
+
let bits = 0;
|
|
147
|
+
let bitcount = 0;
|
|
148
|
+
|
|
149
|
+
if (size == 0)
|
|
150
|
+
size = inp_buffer.byteLength;
|
|
151
|
+
inp_buffer = inp_buffer.slice(start_index, start_index + size);
|
|
152
|
+
for (let i = 0; i < size; i++) {
|
|
153
|
+
let x = inp_buffer[i];
|
|
154
|
+
bits |= this.nodes[x].bits << bitcount;
|
|
155
|
+
bitcount += this.nodes[x].numbits;
|
|
156
|
+
|
|
157
|
+
while (bitcount >= 8) {
|
|
158
|
+
output.push(bits & 0xff);
|
|
159
|
+
bits >>= 8;
|
|
160
|
+
bitcount -= 8;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
bits |= this.nodes[HUFFMAN_EOF_SYMBOL].bits << bitcount;
|
|
164
|
+
bitcount += this.nodes[HUFFMAN_EOF_SYMBOL].numbits;
|
|
165
|
+
|
|
166
|
+
while (bitcount >= 8) {
|
|
167
|
+
output.push(bits & 0xff);
|
|
168
|
+
bits >>= 8;
|
|
169
|
+
bitcount -= 8;
|
|
170
|
+
}
|
|
171
|
+
output.push(bits);
|
|
172
|
+
return Buffer.from(output);
|
|
173
|
+
}
|
|
174
|
+
decompress(inp_buffer: Buffer, size = 0): Buffer {
|
|
175
|
+
|
|
176
|
+
let bits = 0;
|
|
177
|
+
let bitcount = 0;
|
|
178
|
+
let eof = this.nodes[HUFFMAN_EOF_SYMBOL];
|
|
179
|
+
let output = [];
|
|
180
|
+
|
|
181
|
+
if (size == 0)
|
|
182
|
+
size = inp_buffer.byteLength;
|
|
183
|
+
inp_buffer = inp_buffer.slice(0, size);
|
|
184
|
+
let src_index = 0;
|
|
185
|
+
while (true) {
|
|
186
|
+
let node_i = -1;
|
|
187
|
+
if (bitcount >= HUFFMAN_LUTBITS)
|
|
188
|
+
node_i = this.decode_lut[bits & HUFFMAN_LUTMASK];
|
|
189
|
+
while (bitcount < 24 && src_index != size) {
|
|
190
|
+
bits |= inp_buffer[src_index] << bitcount;
|
|
191
|
+
bitcount += 8;
|
|
192
|
+
src_index++;
|
|
193
|
+
}
|
|
194
|
+
if (node_i == -1)
|
|
195
|
+
node_i = this.decode_lut[bits & HUFFMAN_LUTMASK];
|
|
196
|
+
if (this.nodes[node_i].numbits) {
|
|
197
|
+
bits >>= this.nodes[node_i].numbits;
|
|
198
|
+
bitcount -= this.nodes[node_i].numbits;
|
|
199
|
+
} else {
|
|
200
|
+
bits >>= HUFFMAN_LUTBITS;
|
|
201
|
+
bitcount -= HUFFMAN_LUTBITS;
|
|
202
|
+
|
|
203
|
+
while (true) {
|
|
204
|
+
if (bits & 1) {
|
|
205
|
+
node_i = this.nodes[node_i].right;
|
|
206
|
+
} else
|
|
207
|
+
node_i = this.nodes[node_i].left;
|
|
208
|
+
bitcount -= 1;
|
|
209
|
+
bits >>= 1;
|
|
210
|
+
|
|
211
|
+
if (this.nodes[node_i].numbits)
|
|
212
|
+
break;
|
|
213
|
+
if (bitcount == 0)
|
|
214
|
+
throw new Error("No more bits, decoding error")
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
}
|
|
218
|
+
if (this.nodes[node_i] == eof)
|
|
219
|
+
break;
|
|
220
|
+
output.push(this.nodes[node_i].symbol);
|
|
221
|
+
}
|
|
222
|
+
return Buffer.from(output);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
export = Huffman;
|
package/lib/snapshot.ts
CHANGED
|
@@ -336,11 +336,15 @@ class Snapshot {
|
|
|
336
336
|
|
|
337
337
|
var data: number[] = []
|
|
338
338
|
for (let i = 0; i < _size; i++) {
|
|
339
|
-
snap = MsgUnpacker.unpackInt(snap).remaining;
|
|
340
|
-
data.push(MsgUnpacker.unpackInt(snap).result);
|
|
341
339
|
if (snap.length == 0) {
|
|
342
340
|
items.lost++;
|
|
343
341
|
}
|
|
342
|
+
if (snap[0]) {
|
|
343
|
+
snap = MsgUnpacker.unpackInt(snap).remaining;
|
|
344
|
+
data.push(MsgUnpacker.unpackInt(snap).result);
|
|
345
|
+
} else
|
|
346
|
+
break;
|
|
347
|
+
|
|
344
348
|
}
|
|
345
349
|
if (type_id > 0x4000 || type_id == 0) {
|
|
346
350
|
if (_size == 5 && id == 0) {
|
|
@@ -354,9 +358,9 @@ class Snapshot {
|
|
|
354
358
|
// score: (!players[id] == undefined || typeof players[id].score == 'undefined') ? -1 : players[id].score
|
|
355
359
|
}
|
|
356
360
|
// console.log(Ddnet_Character)
|
|
357
|
-
|
|
361
|
+
if (Ddnet_Character.freeze_end > 0 || Ddnet_Character.freeze_end == -1) // freezed or deepfreezed
|
|
358
362
|
|
|
359
|
-
|
|
363
|
+
console.log(Ddnet_Character)
|
|
360
364
|
} // else
|
|
361
365
|
// console.log("lolol uuid??", _size, type_id, id, data)
|
|
362
366
|
}
|
package/package.json
CHANGED
package/lib/MsgPacker.js
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var MsgPacker = /** @class */ (function () {
|
|
3
|
-
function MsgPacker(msg, sys) {
|
|
4
|
-
this.result = Buffer.from([2 * msg + (sys ? 1 : 0)]); // booleans turn into int automatically.
|
|
5
|
-
this.sys = sys;
|
|
6
|
-
}
|
|
7
|
-
MsgPacker.prototype.AddString = function (str) {
|
|
8
|
-
this.result = Buffer.concat([this.result, Buffer.from(str), Buffer.from([0x00])]);
|
|
9
|
-
};
|
|
10
|
-
MsgPacker.prototype.AddBuffer = function (buffer) {
|
|
11
|
-
this.result = Buffer.concat([this.result, buffer]);
|
|
12
|
-
};
|
|
13
|
-
MsgPacker.prototype.AddInt = function (i) {
|
|
14
|
-
var result = [];
|
|
15
|
-
var pDst = (i >> 25) & 0x40;
|
|
16
|
-
var i = i ^ (i >> 31);
|
|
17
|
-
pDst |= i & 0x3f;
|
|
18
|
-
i >>= 6;
|
|
19
|
-
if (i) {
|
|
20
|
-
pDst |= 0x80;
|
|
21
|
-
result.push(pDst);
|
|
22
|
-
while (true) {
|
|
23
|
-
pDst++;
|
|
24
|
-
pDst = i & (0x7f);
|
|
25
|
-
i >>= 7;
|
|
26
|
-
pDst |= (Number(i != 0)) << 7;
|
|
27
|
-
result.push(pDst);
|
|
28
|
-
if (!i)
|
|
29
|
-
break;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
else
|
|
33
|
-
result.push(pDst);
|
|
34
|
-
// ... i'll just stop trying to understand.
|
|
35
|
-
this.result = Buffer.concat([this.result, Buffer.from(result)]);
|
|
36
|
-
};
|
|
37
|
-
Object.defineProperty(MsgPacker.prototype, "size", {
|
|
38
|
-
get: function () {
|
|
39
|
-
return this.result.byteLength;
|
|
40
|
-
},
|
|
41
|
-
enumerable: false,
|
|
42
|
-
configurable: true
|
|
43
|
-
});
|
|
44
|
-
Object.defineProperty(MsgPacker.prototype, "buffer", {
|
|
45
|
-
get: function () {
|
|
46
|
-
return this.result;
|
|
47
|
-
},
|
|
48
|
-
enumerable: false,
|
|
49
|
-
configurable: true
|
|
50
|
-
});
|
|
51
|
-
return MsgPacker;
|
|
52
|
-
}());
|
|
53
|
-
module.exports = MsgPacker;
|
package/lib/MsgUnpacker.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var decoder = new TextDecoder('utf-8');
|
|
3
|
-
function unpackInt(pSrc) {
|
|
4
|
-
var result = 0;
|
|
5
|
-
var len = 1;
|
|
6
|
-
var iter = pSrc[Symbol.iterator]();
|
|
7
|
-
var src = iter.next();
|
|
8
|
-
// if (src.done)
|
|
9
|
-
// console.warn("Unexpected end", src)
|
|
10
|
-
src = src.value;
|
|
11
|
-
var sign = ((src >> 6) & 1);
|
|
12
|
-
result |= (src & 63);
|
|
13
|
-
for (var i = 0; i < 4; i++) {
|
|
14
|
-
if ((src & 128) == 0)
|
|
15
|
-
break;
|
|
16
|
-
src = iter.next();
|
|
17
|
-
// console.log(src & 0b1000_0000)
|
|
18
|
-
// if (src.done)
|
|
19
|
-
// console.warn("Unexpected end", src);
|
|
20
|
-
src = src.value;
|
|
21
|
-
len += 1;
|
|
22
|
-
if (i == 3 && (src & 240) != 0)
|
|
23
|
-
console.warn("NonZeroIntPadding");
|
|
24
|
-
result |= ((src & 127)) << (6 + 7 * i);
|
|
25
|
-
}
|
|
26
|
-
if (len > 1 && src == 0) {
|
|
27
|
-
console.warn("OverlongIntEncoding");
|
|
28
|
-
}
|
|
29
|
-
result ^= -sign;
|
|
30
|
-
return { result: result, remaining: Array.from(iter) };
|
|
31
|
-
}
|
|
32
|
-
function unpackString(pSrc) {
|
|
33
|
-
var result = pSrc.slice(0, pSrc.indexOf(0));
|
|
34
|
-
pSrc = pSrc.slice(pSrc.indexOf(0), pSrc.length);
|
|
35
|
-
return { result: decoder.decode(new Uint8Array(result)), remaining: pSrc };
|
|
36
|
-
}
|
|
37
|
-
module.exports = { unpackInt: unpackInt, unpackString: unpackString };
|