Skip to content

Commit

Permalink
Move mapping logic to utils
Browse files Browse the repository at this point in the history
  • Loading branch information
richardhopton committed Mar 30, 2023
1 parent 8d944c5 commit 2b583d2
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 58 deletions.
59 changes: 1 addition & 58 deletions lib/connection.js
Original file line number Diff line number Diff line change
@@ -1,67 +1,10 @@
const EventEmitter = require("events");
const Net = require('net');
const { Entities } = require('./entities');
const { mapMessageByType } = require("./utils/mapMessageByType");
const { serialize, deserialize, pb } = require('./utils/messages');
const Package = require('../package.json');

// https://github.com/miguelmota/is-base64/blob/master/is-base64.js#L17
const base64Regex = /^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\/]{3}=)?$/;
const isBase64 = (payload) => new RegExp(base64Regex, 'gi').test(payload);

const base64Decode = (message) =>
isBase64(message) ? Buffer.from(message, 'base64').toString('ascii') : message;

const uuidRegex = new RegExp(
/([a-f0-9]{8})([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]{12})/
);
const uuidDecode = (segments) =>
segments
.map((segment) => BigInt(segment).toString(16).padStart(16, '0'))
.join('')
.replace(uuidRegex, '$1-$2-$3-$4-$5');

const mapMessageByType = (type, obj) => {
switch (type) {
case 'SubscribeLogsResponse': {
// decode message to string
const message = base64Decode(obj.message);
return { ...obj, message };
}
case 'BluetoothLEAdvertisementResponse': {
// decode name to string
const name = base64Decode(obj.name);
return { ...obj, name };
}
case 'BluetoothGATTGetServicesResponse': {
// decode uuidList to uuid string
const { servicesList, ...rest } = obj;
return {
...rest,
servicesList: servicesList.map(
({ uuidList, characteristicsList, ...rest }) => ({
uuid: uuidDecode(uuidList),
...rest,
characteristicsList: characteristicsList.map(
({ uuidList, descriptorsList, ...rest }) => ({
uuid: uuidDecode(uuidList),
...rest,
descriptorsList: descriptorsList.map(
({ uuidList, ...rest }) => ({
uuid: uuidDecode(uuidList),
...rest,
})
),
})
),
})
),
};
}
default:
return obj;
}
};

class EsphomeNativeApiConnection extends EventEmitter {
constructor({
port = 6053,
Expand Down
62 changes: 62 additions & 0 deletions lib/utils/mapMessageByType.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
// https://github.com/miguelmota/is-base64/blob/master/is-base64.js#L17
const base64Regex = new RegExp(
/^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\/]{3}=)?$/,
"gi"
);
const isBase64 = (payload) => base64Regex.test(payload);
const base64Decode = (message) =>
isBase64(message)
? Buffer.from(message, "base64").toString("ascii")
: message;

const uuidRegex = new RegExp(
/([a-f0-9]{8})([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]{12})/
);
const uuidDecode = (segments) =>
segments
.map((segment) => BigInt(segment).toString(16).padStart(16, "0"))
.join("")
.replace(uuidRegex, "$1-$2-$3-$4-$5");

const mapMessageByType = (type, obj) => {
switch (type) {
case "SubscribeLogsResponse": {
// decode message to string
const message = base64Decode(obj.message);
return { ...obj, message };
}
case "BluetoothLEAdvertisementResponse": {
// decode name to string
const name = base64Decode(obj.name);
return { ...obj, name };
}
case "BluetoothGATTGetServicesResponse": {
// decode uuidList to uuid string
const { servicesList, ...rest } = obj;
return {
...rest,
servicesList: servicesList.map(
({ uuidList, characteristicsList, ...rest }) => ({
uuid: uuidDecode(uuidList),
...rest,
characteristicsList: characteristicsList.map(
({ uuidList, descriptorsList, ...rest }) => ({
uuid: uuidDecode(uuidList),
...rest,
descriptorsList: descriptorsList.map(
({ uuidList, ...rest }) => ({
uuid: uuidDecode(uuidList),
...rest,
})
),
})
),
})
),
};
}
default:
return obj;
}
};
exports.mapMessageByType = mapMessageByType;

0 comments on commit 2b583d2

Please sign in to comment.