Skip to content

Commit 3d79d9d

Browse files
committed
fix: align settings behavior across extensions
1 parent d47e11b commit 3d79d9d

File tree

7 files changed

+19
-22
lines changed

7 files changed

+19
-22
lines changed

lib/controller.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ import utils from "./util/utils";
2828
import Zigbee from "./zigbee";
2929

3030
export class Controller {
31-
private eventBus: EventBus;
32-
private zigbee: Zigbee;
33-
private state: State;
34-
private mqtt: Mqtt;
31+
public readonly eventBus: EventBus;
32+
public readonly zigbee: Zigbee;
33+
public readonly state: State;
34+
public readonly mqtt: Mqtt;
3535
private restartCallback: () => Promise<void>;
3636
private exitCallback: (code: number, restart: boolean) => Promise<void>;
3737
public readonly extensions: Set<Extension>;

lib/extension/bind.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import * as settings from "../util/settings";
1212
import utils from "../util/utils";
1313
import Extension from "./extension";
1414

15-
const TOPIC_REGEX = new RegExp(`^${settings.get().mqtt.base_topic}/bridge/request/device/(bind|unbind)`);
1615
const ALL_CLUSTER_CANDIDATES: readonly ClusterName[] = [
1716
"genScenes",
1817
"genOnOff",
@@ -204,6 +203,7 @@ interface ParsedMQTTMessage {
204203
}
205204

206205
export default class Bind extends Extension {
206+
private topicRegex = new RegExp(`^${settings.get().mqtt.base_topic}/bridge/request/device/(bind|unbind)`);
207207
private pollDebouncers: {[s: string]: () => void} = {};
208208

209209
// biome-ignore lint/suspicious/useAwait: API
@@ -216,7 +216,7 @@ export default class Bind extends Extension {
216216
private parseMQTTMessage(
217217
data: eventdata.MQTTMessage,
218218
): [raw: KeyValue | undefined, parsed: ParsedMQTTMessage | undefined, error: string | undefined] {
219-
if (data.topic.match(TOPIC_REGEX)) {
219+
if (data.topic.match(this.topicRegex)) {
220220
const type = data.topic.endsWith("unbind") ? "unbind" : "bind";
221221
let skipDisableReporting = false;
222222
const message = JSON.parse(data.message) as Zigbee2MQTTAPI["bridge/request/device/bind"];

lib/extension/bridge.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,8 @@ import * as settings from "../util/settings";
1717
import utils, {assertString} from "../util/utils";
1818
import Extension from "./extension";
1919

20-
const REQUEST_REGEX = new RegExp(`${settings.get().mqtt.base_topic}/bridge/request/(.*)`);
21-
2220
export default class Bridge extends Extension {
21+
private requestRegex = new RegExp(`${settings.get().mqtt.base_topic}/bridge/request/(.*)`);
2322
// set on `start`
2423
#osInfo!: Zigbee2MQTTAPI["bridge/info"]["os"];
2524
private zigbee2mqttVersion!: {commitHash?: string; version: string};
@@ -197,7 +196,7 @@ export default class Bridge extends Extension {
197196
}
198197

199198
@bind async onMQTTMessage(data: eventdata.MQTTMessage): Promise<void> {
200-
const match = data.topic.match(REQUEST_REGEX);
199+
const match = data.topic.match(this.requestRegex);
201200

202201
if (!match) {
203202
return;

lib/extension/groups.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ import * as settings from "../util/settings";
1111
import utils, {isLightExpose} from "../util/utils";
1212
import Extension from "./extension";
1313

14-
const TOPIC_REGEX = new RegExp(`^${settings.get().mqtt.base_topic}/bridge/request/group/members/(remove|add|remove_all)$`);
15-
1614
const STATE_PROPERTIES: Readonly<Record<string, (value: string, exposes: zhc.Expose[]) => boolean>> = {
1715
state: () => true,
1816
brightness: (_value, exposes) => exposes.some((e) => isLightExpose(e) && e.features.some((f) => f.name === "brightness")),
@@ -38,6 +36,7 @@ interface ParsedMQTTMessage {
3836
}
3937

4038
export default class Groups extends Extension {
39+
private topicRegex = new RegExp(`^${settings.get().mqtt.base_topic}/bridge/request/group/members/(remove|add|remove_all)$`);
4140
private lastOptimisticState: {[s: string]: KeyValue} = {};
4241

4342
// biome-ignore lint/suspicious/useAwait: API
@@ -185,7 +184,7 @@ export default class Groups extends Extension {
185184
private parseMQTTMessage(
186185
data: eventdata.MQTTMessage,
187186
): [raw: KeyValue | undefined, parsed: ParsedMQTTMessage | undefined, error: string | undefined] {
188-
const topicRegexMatch = data.topic.match(TOPIC_REGEX);
187+
const topicRegexMatch = data.topic.match(this.topicRegex);
189188

190189
if (topicRegexMatch) {
191190
const type = topicRegexMatch[1] as "remove" | "add" | "remove_all";

lib/extension/otaUpdate.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,11 @@ export interface UpdatePayload {
2525
};
2626
}
2727

28-
const topicRegex = new RegExp(
29-
`^${settings.get().mqtt.base_topic}/bridge/request/device/ota_update/(update|check|schedule|unschedule)/?(downgrade)?`,
30-
"i",
31-
);
32-
3328
export default class OTAUpdate extends Extension {
29+
private topicRegex = new RegExp(
30+
`^${settings.get().mqtt.base_topic}/bridge/request/device/ota_update/(update|check|schedule|unschedule)/?(downgrade)?`,
31+
"i",
32+
);
3433
private inProgress = new Set<string>();
3534
private lastChecked = new Map<string, number>();
3635
private scheduledUpgrades = new Set<string>();
@@ -252,7 +251,7 @@ export default class OTAUpdate extends Extension {
252251
}
253252

254253
@bind async onMQTTMessage(data: eventdata.MQTTMessage): Promise<void> {
255-
const topicMatch = data.topic.match(topicRegex);
254+
const topicMatch = data.topic.match(this.topicRegex);
256255

257256
if (!topicMatch) {
258257
return;

lib/extension/publish.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ import * as settings from "../util/settings";
99
import utils from "../util/utils";
1010
import Extension from "./extension";
1111

12+
// TODO: get rid of this, use class member
1213
let topicGetSetRegex: RegExp;
13-
// Used by `publish.test.js` to reload regex when changing `mqtt.base_topic`.
14+
// Used by `publish.test.ts` to reload regex when changing `mqtt.base_topic`.
1415
export const loadTopicGetSetRegex = (): void => {
1516
topicGetSetRegex = new RegExp(`^${settings.get().mqtt.base_topic}/(?!bridge)(.+?)/(get|set)(?:/(.+))?$`);
1617
};
17-
loadTopicGetSetRegex();
1818

1919
const STATE_VALUES: ReadonlyArray<string> = ["on", "off", "toggle", "open", "close", "stop", "lock", "unlock"];
2020
const SCENE_CONVERTER_KEYS: ReadonlyArray<string> = ["scene_store", "scene_add", "scene_remove", "scene_remove_all", "scene_rename"];
@@ -29,6 +29,7 @@ interface ParsedTopic {
2929
export default class Publish extends Extension {
3030
// biome-ignore lint/suspicious/useAwait: API
3131
override async start(): Promise<void> {
32+
loadTopicGetSetRegex();
3233
this.eventBus.onMQTTMessage(this, this.onMQTTMessage);
3334
}
3435

lib/zigbee.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@ import utils from "./util/utils";
1515
const entityIDRegex = /^(.+?)(?:\/([^/]+))?$/;
1616

1717
export default class Zigbee {
18-
// @ts-expect-error initialized in start
19-
private herdsman: Controller;
18+
private herdsman!: Controller;
2019
private eventBus: EventBus;
2120
private groupLookup = new Map<number /* group ID */, Group>();
2221
private deviceLookup = new Map<string /* IEEE address */, Device>();

0 commit comments

Comments
 (0)