Skip to content

Commit 3d8d297

Browse files
authored
Add ability to parse multiple packets and move polyfills (#7)
Add ability to parse multiple packets and move polyfills
2 parents bd0f422 + 1a4b385 commit 3d8d297

File tree

5 files changed

+56
-38
lines changed

5 files changed

+56
-38
lines changed

package-lock.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"babel-cli": "6.26.0",
2626
"babel-preset-env": "1.7.0",
2727
"eslint-config-xo-typescript": "0.19.0",
28-
"husky": "3.0.7",
28+
"husky": "3.0.8",
2929
"typescript": "3.6.3",
3030
"xo": "0.25.3"
3131
},

src/device.ts

Lines changed: 28 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,3 @@
1-
// Polyfills
2-
/* eslint-disable import/no-unassigned-import */
3-
import 'core-js/stable';
4-
import 'regenerator-runtime/runtime';
5-
6-
// Application
71
import {EventEmitter} from 'events';
82
import {Socket} from 'net';
93
import debug from 'debug';
@@ -162,32 +156,34 @@ class Device extends EventEmitter implements Device {
162156
private _handleSocketData(data: Buffer): void {
163157
this._log('Received:', data.toString('hex'));
164158

165-
const frame = this._messenger.decode(data);
166-
167-
// Emit Frame as data event
168-
this.emit('data', frame);
169-
170-
// Check if it's a heartbeat packet
171-
if (frame.command === COMMANDS.HEART_BEAT) {
172-
this._lastHeartbeat = new Date();
173-
return;
174-
}
175-
176-
// Atempt to convert to JSON
177-
let parsedData;
178-
179-
try {
180-
parsedData = JSON.parse(frame.payload.toString('ascii'));
181-
} catch (_) {
182-
// Not JSON data
183-
return;
184-
}
185-
186-
if ('dps' in parsedData) {
187-
// State update event
188-
this._state = {...this._state, ...parsedData.dps};
189-
this.emit('state-change', this._state);
190-
}
159+
this._messenger.splitPackets(data).forEach(packet => {
160+
const frame = this._messenger.decode(packet);
161+
162+
// Emit Frame as data event
163+
this.emit('data', frame);
164+
165+
// Check if it's a heartbeat packet
166+
if (frame.command === COMMANDS.HEART_BEAT) {
167+
this._lastHeartbeat = new Date();
168+
return;
169+
}
170+
171+
// Atempt to convert to JSON
172+
let parsedData;
173+
174+
try {
175+
parsedData = JSON.parse(frame.payload.toString('ascii'));
176+
} catch (_) {
177+
// Not JSON data
178+
return;
179+
}
180+
181+
if ('dps' in parsedData) {
182+
// State update event
183+
this._state = {...this._state, ...parsedData.dps};
184+
this.emit('state-change', this._state);
185+
}
186+
});
191187
}
192188

193189
private _handleSocketError(error: Error): void {

src/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
// Polyfills
2+
/* eslint-disable import/no-unassigned-import */
3+
import 'core-js/stable';
4+
import 'regenerator-runtime/runtime';
5+
16
import Device from './device';
27

38
import * as Constants from './lib/constants';

src/lib/messenger.ts

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,23 @@ class Messenger extends EventEmitter {
2323
return frame;
2424
}
2525

26+
splitPackets(p: Buffer): Buffer[] {
27+
const packets: Buffer[] = [];
28+
29+
const empty = Buffer.from('');
30+
31+
while (!p.equals(empty)) {
32+
const startIndex = p.indexOf(Buffer.from('000055aa', 'hex'));
33+
const endIndex = p.indexOf(Buffer.from('0000aa55', 'hex')) + 4;
34+
35+
packets.push(p.slice(startIndex, endIndex));
36+
37+
p = p.slice(endIndex, p.length);
38+
}
39+
40+
return packets;
41+
}
42+
2643
decode(packet: Buffer): Frame {
2744
this.checkPacket(packet);
2845

@@ -47,9 +64,9 @@ class Messenger extends EventEmitter {
4764
// Adjust for messages lacking a return code
4865
let payload;
4966
if (returnCode === 0) {
50-
payload = packet.slice(HEADER_SIZE, HEADER_SIZE + payloadSize - 8);
51-
} else {
5267
payload = packet.slice(HEADER_SIZE + 4, HEADER_SIZE + payloadSize - 8);
68+
} else {
69+
payload = packet.slice(HEADER_SIZE, HEADER_SIZE + payloadSize - 8);
5370
}
5471

5572
// Check CRC

0 commit comments

Comments
 (0)