Skip to content

Commit 5d0890b

Browse files
committed
Merge pull request #396 from uProxy/trevj-hexstrings-love
replace arraybuffers hexstring converters with buffer built-ins
2 parents 810afc4 + e68c92c commit 5d0890b

7 files changed

Lines changed: 27 additions & 135 deletions

File tree

src/arraybuffers/arraybuffers.spec.ts

Lines changed: 9 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -2,102 +2,21 @@
22

33
import arraybuffers = require('./arraybuffers');
44

5-
var uint8Array1 = new Uint8Array([12,118,101,114,105,115]);
6-
var array1 = uint8Array1.buffer;
7-
var string1 = '\x0C\x76\x65\x72\x69\x73';
8-
var hexString1 = 'c.76.65.72.69.73';
5+
const array1 = new Uint8Array([12, 118, 101, 114, 105, 115]).buffer;
6+
const array2 = new Uint8Array([0, 2, 129, 128, 0, 1, 0, 5, 0]).buffer;
7+
const array12 = new Uint8Array([12, 118, 101, 114, 105, 115, 0, 2, 129, 128, 0, 1, 0, 5, 0]).buffer;
8+
const emptyArray = (new Uint8Array([])).buffer;
99

10-
var uint8Array2 = new Uint8Array([0,2,129,128,0,1,0,5,0]);
11-
var array2 = uint8Array2.buffer;
12-
var string2 = '\x00\x02\x81\x80\x00\x01\x00\x05\x00';
13-
var hexString2 = '0.2.81.80.0.1.0.5.0';
14-
15-
var uint8Array12 = new Uint8Array(
16-
[12,118,101,114,105,115,0,2,129,128,0,1,0,5,0]);
17-
var array12 = uint8Array12.buffer;
18-
var string12 = string1 + string2;
19-
20-
var emptyArray = (new Uint8Array([])).buffer;
21-
var emptyString = '';
22-
var emptyHexString = '';
23-
24-
describe('ArrayBuffers <-> Hex Strings', function() {
25-
it('byteEquality: emptyArray == emptyArray', function() {
10+
describe('arraybuffers', function() {
11+
it('byteEquality', function() {
2612
expect(arraybuffers.byteEquality(emptyArray, emptyArray)).toBe(true);
27-
});
28-
it('byteEquality: array1 == array1', function() {
2913
expect(arraybuffers.byteEquality(array1, array1)).toBe(true);
30-
});
31-
it('byteEquality: array1 != emptyArray', function() {
3214
expect(arraybuffers.byteEquality(array1, emptyArray)).toBe(false);
33-
});
34-
it('byteEquality: array1 != array2', function() {
3515
expect(arraybuffers.byteEquality(array1, array2)).toBe(false);
3616
});
3717

38-
it('Empty Buffer -> Empty Hex', function() {
39-
expect(arraybuffers.arrayBufferToHexString(emptyArray)).toEqual(emptyHexString);
40-
});
41-
it('Empty Hex -> Empty Buffer', function() {
42-
expect(arraybuffers.byteEquality(arraybuffers.hexStringToArrayBuffer(emptyHexString),
43-
emptyArray)).toBe(true);
44-
});
45-
46-
it('Buffer -> Hex', function() {
47-
expect(arraybuffers.arrayBufferToHexString(emptyArray)).toEqual(emptyString);
48-
expect(arraybuffers.arrayBufferToHexString(array1)).toEqual(hexString1);
49-
expect(arraybuffers.arrayBufferToHexString(array2)).toEqual(hexString2);
50-
});
51-
52-
it('Hex -> Buffer -> Hex = identity', function() {
53-
expect(arraybuffers.arrayBufferToHexString(arraybuffers.hexStringToArrayBuffer(emptyString)))
54-
.toEqual(emptyString);
55-
expect(arraybuffers.arrayBufferToHexString(arraybuffers.hexStringToArrayBuffer(emptyString)))
56-
.not.toEqual(hexString1);
57-
expect(arraybuffers.arrayBufferToHexString(arraybuffers.hexStringToArrayBuffer(hexString1)))
58-
.toEqual(hexString1);
59-
expect(arraybuffers.arrayBufferToHexString(arraybuffers.hexStringToArrayBuffer(hexString2)))
60-
.toEqual(hexString2);
61-
expect(arraybuffers.arrayBufferToHexString(arraybuffers.hexStringToArrayBuffer(hexString1)))
62-
.not.toEqual(hexString2);
63-
});
64-
});
65-
66-
describe('ArrayBuffers chunk', function() {
67-
it('chunk(array12, 6).length == 3', function() {
68-
expect(arraybuffers.chunk(array12,6).length).toBe(3);
69-
});
70-
it('chunk(array12, 1).length == 15', function() {
71-
expect(arraybuffers.chunk(array12,1).length).toBe(15);
72-
});
73-
});
74-
75-
describe('ArrayBuffers <-> strings', function() {
76-
it('Empty Buffer -> Empty Hex', function() {
77-
expect(arraybuffers.arrayBufferToHexString(emptyArray)).toEqual(emptyString);
78-
});
79-
it('Empty Hex -> Empty Buffer', function() {
80-
expect(arraybuffers.byteEquality(arraybuffers.hexStringToArrayBuffer(emptyString),
81-
emptyArray)).toBe(true);
82-
});
83-
84-
it('Buffer -> String', function() {
85-
expect(arraybuffers.arrayBufferToHexString(emptyArray)).toEqual(emptyString);
86-
expect(arraybuffers.arrayBufferToHexString(array1)).toEqual(hexString1);
87-
expect(arraybuffers.arrayBufferToHexString(array1)).not.toEqual(hexString2);
88-
expect(arraybuffers.arrayBufferToHexString(array2)).toEqual(hexString2);
89-
});
90-
91-
it('String -> Buffer -> String = identity', function() {
92-
expect(arraybuffers.arrayBufferToString(arraybuffers.stringToArrayBuffer(emptyString)))
93-
.toEqual(emptyString);
94-
expect(arraybuffers.arrayBufferToString(arraybuffers.stringToArrayBuffer(emptyString)))
95-
.not.toEqual(hexString1);
96-
expect(arraybuffers.arrayBufferToString(arraybuffers.stringToArrayBuffer(string1)))
97-
.toEqual(string1);
98-
expect(arraybuffers.arrayBufferToString(arraybuffers.stringToArrayBuffer(string2)))
99-
.toEqual(string2);
100-
expect(arraybuffers.arrayBufferToString(arraybuffers.stringToArrayBuffer(string1)))
101-
.not.toEqual(string2);
18+
it('chunk', function() {
19+
expect(arraybuffers.chunk(array12, 6).length).toBe(3);
20+
expect(arraybuffers.chunk(array12, 1).length).toBe(15);
10221
});
10322
});

src/arraybuffers/arraybuffers.ts

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -53,30 +53,6 @@ export function stringToArrayBuffer(s:string) :ArrayBuffer {
5353
return buffer;
5454
}
5555

56-
// Converts an ArrayBuffer to a string of hex codes (of the regexp form
57-
// /(hh\.)*hh/).
58-
export function arrayBufferToHexString(buffer:ArrayBuffer) :string {
59-
var bytes = new Uint8Array(buffer);
60-
var a :string[] = [];
61-
for (var i = 0; i < buffer.byteLength; ++i) {
62-
a.push(bytes[i].toString(16));
63-
}
64-
return a.join('.');
65-
}
66-
67-
// Converts a HexString of the regexp form /(hh\.)*hh/ (where `h` is a
68-
// hex-character) to an ArrayBuffer.
69-
export function hexStringToArrayBuffer(hexString:string) :ArrayBuffer {
70-
if(hexString === '') { return new ArrayBuffer(0); }
71-
var hexChars = hexString.split('.');
72-
var buffer = new ArrayBuffer(hexChars.length);
73-
var bytes = new Uint8Array(buffer);
74-
for (var i = 0; i < hexChars.length; ++i) {
75-
bytes[i] = parseInt('0x' + hexChars[i]);
76-
}
77-
return buffer;
78-
}
79-
8056
// Returns an ArrayBuffer backed by the same memory as the supplied
8157
// Node.js Buffer.
8258
export function bufferToArrayBuffer(buffer: Buffer): ArrayBuffer {

src/echo/freedom-module.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
/// <reference path='../../../third_party/typings/browser.d.ts' />
22

3-
import arraybuffers = require('../arraybuffers/arraybuffers');
43
import logging = require('../logging/logging');
54
import loggingTypes = require('../loggingprovider/loggingprovider.types');
65
import net = require('../net/net.types');
@@ -16,7 +15,7 @@ var requestedEndpoint: net.Endpoint = {
1615

1716
// Character code for CTRL-D.
1817
// When received, we close the connection.
19-
var CTRL_D_HEX_STR_CODE = '4';
18+
const CTRL_D_CODE = 4;
2019

2120
var loggingController = freedom['loggingcontroller']();
2221
loggingController.setDefaultFilter(loggingTypes.Destination.console,
@@ -43,7 +42,7 @@ server.listen().then((actualEndpoint) => {
4342

4443
connection.dataFromSocketQueue.setSyncHandler((data:ArrayBuffer): void => {
4544
log.info('%1: received %2 bytes', id, data.byteLength);
46-
if (arraybuffers.arrayBufferToHexString(data) === CTRL_D_HEX_STR_CODE) {
45+
if (data.byteLength === 1 && new Uint8Array(data)[0] === CTRL_D_CODE) {
4746
connection.close();
4847
} else {
4948
connection.send(data);

src/transformers/arithmetic.spec.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,16 @@ describe('Arithmetic coding and decoding - short inputs', function() {
2121
// The encoding input is a simple numerical sequence.
2222
// The encoding output is taken from a reference implementation.
2323
it('encoding short input', function() {
24-
let plain = arraybuffers.hexStringToArrayBuffer('0.1.2.3');
25-
let target = arraybuffers.hexStringToArrayBuffer('ca.0.1.2.3.0.0.0.8');
24+
let plain = new Buffer('00010203', 'hex');
25+
let target = new Buffer('ca0001020300000008', 'hex');
2626
let result = encoder.encode(plain);
2727
expect(arraybuffers.byteEquality(result, target)).toBe(true);
2828
});
2929
// The decoding input is taken from the output of the encoding test.
3030
// The decoding output is taken from the input of the encoding test.
3131
it('decoding short input', function() {
32-
let encoded = arraybuffers.hexStringToArrayBuffer('ca.0.1.2.3.0.0.0.8');
33-
let target = arraybuffers.hexStringToArrayBuffer('0.1.2.3');
32+
let encoded = new Buffer('ca0001020300000008', 'hex');
33+
let target = new Buffer('00010203', 'hex');
3434
let result = decoder.decode(encoded).slice(0, -2);
3535
expect(arraybuffers.byteEquality(result, target)).toBe(true);
3636
});
@@ -45,16 +45,16 @@ describe('Arithmetic coding and decoding - long inputs', function() {
4545
// The encoding input is an example of a real WebRTC packet.
4646
// The encoding output is taken from a reference implementation.
4747
it('encoding long input', function() {
48-
let plain = arraybuffers.hexStringToArrayBuffer('0.1.0.5c.21.12.a4.42.48.4e.43.6a.4e.47.54.66.37.31.45.42.0.6.0.21.34.47.4a.39.65.49.69.4d.75.59.55.35.43.38.49.6a.3a.69.7a.72.51.34.77.72.57.66.70.31.6b.57.66.44.64.0.0.0.80.29.0.8.9a.85.cd.95.50.c8.ee.a.0.24.0.4.6e.7e.1e.ff.0.8.0.14.3.45.95.42.22.f0.da.66.3e.8e.b8.cc.79.a1.f7.ba.1.f.d5.0.80.28.0.4.e2.28.43.3');
49-
let target = arraybuffers.hexStringToArrayBuffer('ca.0.1.0.5c.21.12.a4.42.48.4e.43.6a.4e.47.54.66.37.31.45.42.0.6.0.21.34.47.4a.39.65.49.69.4d.75.59.55.35.43.38.49.6a.3a.69.7a.72.51.34.77.72.57.66.70.31.6b.57.66.44.64.0.0.0.80.29.0.8.9a.85.cd.95.50.c8.ee.a.0.24.0.4.6e.7e.1e.ff.0.8.0.14.3.45.95.42.22.f0.da.66.3e.8e.b8.cc.79.a1.f7.ba.1.f.d5.0.80.28.0.4.e2.28.43.3.0.0.0.74');
48+
let plain = new Buffer('0001005c2112a442484e436a4e475466373145420006002134474a396549694d755955354338496a3a697a7251347772576670316b57664464000000802900089a85cd9550c8ee0a002400046e7e1eff000800140345954222f0da663e8eb8cc79a1f7ba010fd50080280004e2284303', 'hex');
49+
let target = new Buffer('ca0001005c2112a442484e436a4e475466373145420006002134474a396549694d755955354338496a3a697a7251347772576670316b57664464000000802900089a85cd9550c8ee0a002400046e7e1eff000800140345954222f0da663e8eb8cc79a1f7ba010fd50080280004e228430300000074', 'hex');
5050
let encoded = encoder.encode(plain);
5151
expect(arraybuffers.byteEquality(encoded, target)).toBe(true);
5252
});
5353
// The decoding input is taken from the output of the encoding test.
5454
// The decoding output is taken from the input of the encoding test.
5555
it('decoding long input', function() {
56-
let encoded = arraybuffers.hexStringToArrayBuffer('ca.0.1.0.5c.21.12.a4.42.48.4e.43.6a.4e.47.54.66.37.31.45.42.0.6.0.21.34.47.4a.39.65.49.69.4d.75.59.55.35.43.38.49.6a.3a.69.7a.72.51.34.77.72.57.66.70.31.6b.57.66.44.64.0.0.0.80.29.0.8.9a.85.cd.95.50.c8.ee.a.0.24.0.4.6e.7e.1e.ff.0.8.0.14.3.45.95.42.22.f0.da.66.3e.8e.b8.cc.79.a1.f7.ba.1.f.d5.0.80.28.0.4.e2.28.43.3.0.0.0.74');
57-
let target = arraybuffers.hexStringToArrayBuffer('0.1.0.5c.21.12.a4.42.48.4e.43.6a.4e.47.54.66.37.31.45.42.0.6.0.21.34.47.4a.39.65.49.69.4d.75.59.55.35.43.38.49.6a.3a.69.7a.72.51.34.77.72.57.66.70.31.6b.57.66.44.64.0.0.0.80.29.0.8.9a.85.cd.95.50.c8.ee.a.0.24.0.4.6e.7e.1e.ff.0.8.0.14.3.45.95.42.22.f0.da.66.3e.8e.b8.cc.79.a1.f7.ba.1.f.d5.0.80.28.0.4.e2.28.43.3');
56+
let encoded = new Buffer('ca0001005c2112a442484e436a4e475466373145420006002134474a396549694d755955354338496a3a697a7251347772576670316b57664464000000802900089a85cd9550c8ee0a002400046e7e1eff000800140345954222f0da663e8eb8cc79a1f7ba010fd50080280004e228430300000074', 'hex');
57+
let target = new Buffer('0001005c2112a442484e436a4e475466373145420006002134474a396549694d755955354338496a3a697a7251347772576670316b57664464000000802900089a85cd9550c8ee0a002400046e7e1eff000800140345954222f0da663e8eb8cc79a1f7ba010fd50080280004e2284303', 'hex');
5858
let decoded = decoder.decode(encoded).slice(0, -2);
5959
expect(arraybuffers.byteEquality(decoded, target)).toBe(true);
6060
});

src/transformers/byteSequenceShaper.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ export interface SequenceModel {
4949
// Creates a sample (non-random) config, suitable for testing.
5050
export var sampleConfig = () : SequenceConfig => {
5151
var buffer = arraybuffers.stringToArrayBuffer('OH HELLO');
52-
var hex = arraybuffers.arrayBufferToHexString(buffer);
52+
var hex = new Buffer(buffer).toString('hex');
5353
var sequence = {
5454
index: 0,
5555
offset: 0,
@@ -170,10 +170,10 @@ export class ByteSequenceShaper implements transformer.Transformer {
170170
// Decode the byte sequence from a string in the sequence model
171171
static deserializeModel(model :SerializedSequenceModel) :SequenceModel {
172172
return {
173-
index:model.index,
174-
offset:model.offset,
175-
sequence:arraybuffers.hexStringToArrayBuffer(model.sequence),
176-
length:model.length
173+
index: model.index,
174+
offset: model.offset,
175+
sequence: new Buffer(model.sequence, 'hex'),
176+
length: model.length
177177
};
178178
}
179179

src/transformers/defragmenter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export class Defragmenter {
4444
// This fragment a new fragment for a new packet.
4545
public addFragment(fragment:fragments.Fragment) {
4646
// Convert ArrayBuffer to hex string so that it can be used as a map key
47-
var hexid = arraybuffers.arrayBufferToHexString(fragment.id);
47+
var hexid = new Buffer(fragment.id).toString('hex');
4848

4949
if (hexid in this.tracker_) {
5050
// A fragment for an existing packet

src/transformers/encryptionShaper.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,8 @@ export interface EncryptionConfig {
1717

1818
// Creates a sample (non-random) config, suitable for testing.
1919
export var sampleConfig = () : EncryptionConfig => {
20-
var bytes = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
21-
var hex = arraybuffers.arrayBufferToHexString(bytes.buffer);
2220
return {
23-
key: hex
21+
key: new Buffer(16).fill(0).toString('hex')
2422
};
2523
}
2624

@@ -38,7 +36,7 @@ export class EncryptionShaper implements transformer.Transformer {
3836
// Required parameter
3937
if ('key' in config) {
4038
var encryptionConfig = <EncryptionConfig>config;
41-
this.key_ = arraybuffers.hexStringToArrayBuffer(encryptionConfig.key);
39+
this.key_ = new Buffer(encryptionConfig.key, 'hex');
4240
} else {
4341
throw new Error('Encryption shaper requires key parameter');
4442
}

0 commit comments

Comments
 (0)