denon-mqtt 0.0.1

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.
Files changed (48) hide show
  1. package/README.md +217 -0
  2. package/dist/CliParser.d.ts +11 -0
  3. package/dist/CliParser.js +80 -0
  4. package/dist/CliParser.js.map +1 -0
  5. package/dist/CommandMessage.d.ts +6 -0
  6. package/dist/CommandMessage.js +3 -0
  7. package/dist/CommandMessage.js.map +1 -0
  8. package/dist/ListenerConfig.d.ts +5 -0
  9. package/dist/ListenerConfig.js +3 -0
  10. package/dist/ListenerConfig.js.map +1 -0
  11. package/dist/MqttBroadcaster.d.ts +22 -0
  12. package/dist/MqttBroadcaster.js +72 -0
  13. package/dist/MqttBroadcaster.js.map +1 -0
  14. package/dist/MqttListener.d.ts +19 -0
  15. package/dist/MqttListener.js +65 -0
  16. package/dist/MqttListener.js.map +1 -0
  17. package/dist/MqttManager.d.ts +24 -0
  18. package/dist/MqttManager.js +45 -0
  19. package/dist/MqttManager.js.map +1 -0
  20. package/dist/MqttUpdate.d.ts +6 -0
  21. package/dist/MqttUpdate.js +3 -0
  22. package/dist/MqttUpdate.js.map +1 -0
  23. package/dist/Orchestrator.d.ts +22 -0
  24. package/dist/Orchestrator.js +143 -0
  25. package/dist/Orchestrator.js.map +1 -0
  26. package/dist/ParserResult.d.ts +6 -0
  27. package/dist/ParserResult.js +3 -0
  28. package/dist/ParserResult.js.map +1 -0
  29. package/dist/ReceiverConfig.d.ts +7 -0
  30. package/dist/ReceiverConfig.js +3 -0
  31. package/dist/ReceiverConfig.js.map +1 -0
  32. package/dist/ReceiverManager.d.ts +16 -0
  33. package/dist/ReceiverManager.js +44 -0
  34. package/dist/ReceiverManager.js.map +1 -0
  35. package/dist/TelnetBroadcaster.d.ts +7 -0
  36. package/dist/TelnetBroadcaster.js +22 -0
  37. package/dist/TelnetBroadcaster.js.map +1 -0
  38. package/dist/TelnetListener.d.ts +12 -0
  39. package/dist/TelnetListener.js +84 -0
  40. package/dist/TelnetListener.js.map +1 -0
  41. package/dist/ZoneConfig.d.ts +5 -0
  42. package/dist/ZoneConfig.js +3 -0
  43. package/dist/ZoneConfig.js.map +1 -0
  44. package/dist/entryPoint.d.ts +2 -0
  45. package/dist/entryPoint.js +47 -0
  46. package/dist/entryPoint.js.map +1 -0
  47. package/dist/tsconfig.tsbuildinfo +1 -0
  48. package/package.json +56 -0
@@ -0,0 +1,22 @@
1
+ import { ReceiverConfig } from './ReceiverConfig';
2
+ export interface OrchestratorOptions {
3
+ receivers: ReceiverConfig[];
4
+ mqtt: string;
5
+ port: string;
6
+ username: string;
7
+ password: string;
8
+ prefix: string;
9
+ }
10
+ export declare class Orchestrator {
11
+ private options;
12
+ private mqttClient;
13
+ private mqttManagers;
14
+ private receiverManagers;
15
+ constructor(options: OrchestratorOptions);
16
+ init(): Promise<void>;
17
+ addReceiver(receiver: ReceiverConfig): Promise<void>;
18
+ start(): Promise<void>;
19
+ cleanup(): Promise<void>;
20
+ static run(options: OrchestratorOptions): Promise<void>;
21
+ static handleExit(callback: () => void): void;
22
+ }
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ var __asyncValues = (this && this.__asyncValues) || function (o) {
3
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
4
+ var m = o[Symbol.asyncIterator], i;
5
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
6
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
7
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.Orchestrator = void 0;
11
+ const mqtt_1 = require("mqtt");
12
+ const MqttManager_1 = require("./MqttManager");
13
+ const ReceiverManager_1 = require("./ReceiverManager");
14
+ class Orchestrator {
15
+ constructor(options) {
16
+ this.options = options;
17
+ this.mqttManagers = [];
18
+ this.receiverManagers = [];
19
+ }
20
+ async init() {
21
+ var _a, e_1, _b, _c;
22
+ this.mqttClient = await (0, mqtt_1.connectAsync)(`mqtt://${this.options.mqtt}:${this.options.port}`, {
23
+ username: this.options.username,
24
+ password: this.options.password,
25
+ });
26
+ console.debug('Connected to MQTT');
27
+ this.mqttClient.on('error', (err) => {
28
+ console.error(err);
29
+ process.exit();
30
+ });
31
+ try {
32
+ for (var _d = true, _e = __asyncValues(this.options.receivers), _f; _f = await _e.next(), _a = _f.done, !_a; _d = true) {
33
+ _c = _f.value;
34
+ _d = false;
35
+ const config = _c;
36
+ await this.addReceiver(config);
37
+ }
38
+ }
39
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
40
+ finally {
41
+ try {
42
+ if (!_d && !_a && (_b = _e.return)) await _b.call(_e);
43
+ }
44
+ finally { if (e_1) throw e_1.error; }
45
+ }
46
+ }
47
+ async addReceiver(receiver) {
48
+ console.debug(`Adding receiver ${receiver.name}`);
49
+ const mqttManager = new MqttManager_1.MqttManager(this.mqttClient, {
50
+ host: this.options.mqtt,
51
+ port: parseInt(this.options.port),
52
+ username: this.options.username,
53
+ password: this.options.password,
54
+ prefix: this.options.prefix,
55
+ id: receiver.id,
56
+ receiver,
57
+ });
58
+ this.mqttManagers.push(mqttManager);
59
+ const receiverManager = new ReceiverManager_1.ReceiverManager(receiver, mqttManager);
60
+ this.receiverManagers.push(receiverManager);
61
+ await mqttManager.connect(receiverManager);
62
+ await receiverManager.connect();
63
+ await receiverManager.query();
64
+ }
65
+ async start() {
66
+ while (true) {
67
+ await Promise.all(this.receiverManagers.map((r) => r.read()));
68
+ }
69
+ }
70
+ async cleanup() {
71
+ var _a, e_2, _b, _c, _d, e_3, _e, _f;
72
+ const promises = [];
73
+ try {
74
+ for (var _g = true, _h = __asyncValues(this.mqttManagers), _j; _j = await _h.next(), _a = _j.done, !_a; _g = true) {
75
+ _c = _j.value;
76
+ _g = false;
77
+ const mqttManager = _c;
78
+ promises.push(mqttManager.disconnect());
79
+ }
80
+ }
81
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
82
+ finally {
83
+ try {
84
+ if (!_g && !_a && (_b = _h.return)) await _b.call(_h);
85
+ }
86
+ finally { if (e_2) throw e_2.error; }
87
+ }
88
+ try {
89
+ for (var _k = true, _l = __asyncValues(this.receiverManagers), _m; _m = await _l.next(), _d = _m.done, !_d; _k = true) {
90
+ _f = _m.value;
91
+ _k = false;
92
+ const receiverManager = _f;
93
+ promises.push(receiverManager.disconnect());
94
+ }
95
+ }
96
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
97
+ finally {
98
+ try {
99
+ if (!_k && !_d && (_e = _l.return)) await _e.call(_l);
100
+ }
101
+ finally { if (e_3) throw e_3.error; }
102
+ }
103
+ await Promise.all(promises);
104
+ }
105
+ static async run(options) {
106
+ console.debug('Starting...');
107
+ if (options.receivers.length === 0) {
108
+ throw new Error('At least one AVR config must be provided');
109
+ }
110
+ const orchestrator = new Orchestrator(options);
111
+ await orchestrator.init();
112
+ await orchestrator.start();
113
+ Orchestrator.handleExit(() => {
114
+ console.debug('Cleaning up...');
115
+ orchestrator
116
+ .cleanup()
117
+ .then(() => {
118
+ process.exit();
119
+ })
120
+ .catch(() => {
121
+ process.exit();
122
+ });
123
+ });
124
+ }
125
+ static handleExit(callback) {
126
+ function exitHandler(options, exitCode) {
127
+ if (options.cleanup) {
128
+ callback();
129
+ }
130
+ if (exitCode || exitCode === 0)
131
+ console.log(exitCode);
132
+ if (options.exit)
133
+ process.exit();
134
+ }
135
+ process.on('exit', exitHandler.bind(null, { cleanup: true }));
136
+ process.on('SIGINT', exitHandler.bind(null, { exit: true }));
137
+ process.on('SIGUSR1', exitHandler.bind(null, { exit: true }));
138
+ process.on('SIGUSR2', exitHandler.bind(null, { exit: true }));
139
+ process.on('uncaughtException', exitHandler.bind(null, { exit: true }));
140
+ }
141
+ }
142
+ exports.Orchestrator = Orchestrator;
143
+ //# sourceMappingURL=Orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Orchestrator.js","sourceRoot":"","sources":["../src/Orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface ParserResult {
2
+ handled: boolean;
3
+ key?: string;
4
+ value?: string;
5
+ zone?: number;
6
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ParserResult.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParserResult.js","sourceRoot":"","sources":["../src/ParserResult.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import { ZoneConfig } from './ZoneConfig';
2
+ export interface ReceiverConfig {
3
+ name: string;
4
+ id: string;
5
+ ip: string;
6
+ zones: ZoneConfig[];
7
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ReceiverConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReceiverConfig.js","sourceRoot":"","sources":["../src/ReceiverConfig.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import { MqttManager } from './MqttManager';
2
+ import { ReceiverConfig } from './ReceiverConfig';
3
+ export declare class ReceiverManager {
4
+ options: ReceiverConfig;
5
+ private mqttManager;
6
+ private telnetClient;
7
+ private listener;
8
+ private broadcaster;
9
+ private exiting;
10
+ constructor(options: ReceiverConfig, mqttManager: MqttManager);
11
+ connect(): Promise<void>;
12
+ query(): Promise<void>;
13
+ read(): Promise<void>;
14
+ send(data: string): Promise<void>;
15
+ disconnect(): Promise<void>;
16
+ }
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ReceiverManager = void 0;
4
+ const telnet_client_1 = require("telnet-client");
5
+ const TelnetBroadcaster_1 = require("./TelnetBroadcaster");
6
+ const TelnetListener_1 = require("./TelnetListener");
7
+ class ReceiverManager {
8
+ constructor(options, mqttManager) {
9
+ this.options = options;
10
+ this.mqttManager = mqttManager;
11
+ }
12
+ async connect() {
13
+ const telnetClient = new telnet_client_1.Telnet();
14
+ await telnetClient.connect({
15
+ host: this.options.ip,
16
+ negotiationMandatory: false,
17
+ timeout: 5000,
18
+ irs: '\r',
19
+ ors: '\r',
20
+ sendTimeout: undefined,
21
+ });
22
+ console.debug(`Connected to Receiver "${this.options.name} on ${this.options.ip}`);
23
+ this.listener = new TelnetListener_1.TelnetListener(telnetClient, this.options.zones.length);
24
+ this.broadcaster = new TelnetBroadcaster_1.TelnetBroadcaster(telnetClient);
25
+ }
26
+ async query() {
27
+ await this.broadcaster.query();
28
+ }
29
+ async read() {
30
+ await this.listener.read(this.mqttManager);
31
+ if (!this.exiting) {
32
+ await this.read();
33
+ }
34
+ }
35
+ send(data) {
36
+ return this.broadcaster.send(data);
37
+ }
38
+ disconnect() {
39
+ this.exiting = true;
40
+ return this.telnetClient.destroy();
41
+ }
42
+ }
43
+ exports.ReceiverManager = ReceiverManager;
44
+ //# sourceMappingURL=ReceiverManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReceiverManager.js","sourceRoot":"","sources":["../src/ReceiverManager.ts"],"names":[],"mappings":";;;AAAA,iDAAuC;AAIvC,2DAAwD;AACxD,qDAAkD;AAElD,MAAa,eAAe;IAM1B,YACS,OAAuB,EACtB,WAAwB;QADzB,YAAO,GAAP,OAAO,CAAgB;QACtB,gBAAW,GAAX,WAAW,CAAa;IAC/B,CAAC;IAEG,KAAK,CAAC,OAAO;QAClB,MAAM,YAAY,GAAG,IAAI,sBAAM,EAAE,CAAC;QAClC,MAAM,YAAY,CAAC,OAAO,CAAC;YACzB,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;YACrB,oBAAoB,EAAE,KAAK;YAC3B,OAAO,EAAE,IAAI;YACb,GAAG,EAAE,IAAI;YACT,GAAG,EAAE,IAAI;YACT,WAAW,EAAE,SAAS;SACvB,CAAC,CAAC;QAEH,OAAO,CAAC,KAAK,CAAC,0BAA0B,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAEnF,IAAI,CAAC,QAAQ,GAAG,IAAI,+BAAc,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAE5E,IAAI,CAAC,WAAW,GAAG,IAAI,qCAAiB,CAAC,YAAY,CAAC,CAAC;IACzD,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IACjC,CAAC;IAEM,KAAK,CAAC,IAAI;QACf,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAE3C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAEM,IAAI,CAAC,IAAY;QACtB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAEM,UAAU;QACf,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;IACrC,CAAC;CACF;AAjDD,0CAiDC"}
@@ -0,0 +1,7 @@
1
+ import { Telnet } from 'telnet-client';
2
+ export declare class TelnetBroadcaster {
3
+ private client;
4
+ constructor(client: Telnet);
5
+ send(data: string): Promise<void>;
6
+ query(): Promise<void>;
7
+ }
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TelnetBroadcaster = void 0;
4
+ class TelnetBroadcaster {
5
+ constructor(client) {
6
+ this.client = client;
7
+ }
8
+ async send(data) {
9
+ try {
10
+ await this.client.send(data);
11
+ console.debug('Sent:', data.replace(/\r/g, '\r\n'));
12
+ }
13
+ catch (err) {
14
+ console.error(err);
15
+ }
16
+ }
17
+ async query() {
18
+ await this.send('SI?\rPW?\rMV?\rCV?\rMU?\rZM?\rSR?\rSD?\rDC?\rSV?\rSLP?\rMS?\rZ2?\rZ2MU?\rZ2CS?\rZ2CV?\rZ2HPF?\rZ2QUICK ?\rZ3?\rZ3MU?\rZ3CS?\rZ3CV?\rZ3HPF?\rZ3QUICK ?\rSSSPC ?\rPSCLV ?\rPSSWL ?\rSSLEV ?');
19
+ }
20
+ }
21
+ exports.TelnetBroadcaster = TelnetBroadcaster;
22
+ //# sourceMappingURL=TelnetBroadcaster.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TelnetBroadcaster.js","sourceRoot":"","sources":["../src/TelnetBroadcaster.ts"],"names":[],"mappings":";;;AAEA,MAAa,iBAAiB;IAC5B,YAAoB,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAAG,CAAC;IAEtC,KAAK,CAAC,IAAI,CAAC,IAAY;QACrB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,IAAI,CACb,2LAA2L,CAC5L,CAAC;IACJ,CAAC;CACF;AAjBD,8CAiBC"}
@@ -0,0 +1,12 @@
1
+ import { Telnet } from 'telnet-client';
2
+ import { MqttUpdate } from './MqttUpdate';
3
+ import { MqttManager } from './MqttManager';
4
+ export declare class TelnetListener {
5
+ private client;
6
+ private parsers;
7
+ private states;
8
+ constructor(client: Telnet, zones: number);
9
+ AddZone(): void;
10
+ handle(data: string): MqttUpdate | undefined;
11
+ read(mqttManager: MqttManager): Promise<void>;
12
+ }
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ var __asyncValues = (this && this.__asyncValues) || function (o) {
3
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
4
+ var m = o[Symbol.asyncIterator], i;
5
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
6
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
7
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.TelnetListener = void 0;
11
+ const denon_state_manager_1 = require("denon-state-manager");
12
+ class TelnetListener {
13
+ constructor(client, zones) {
14
+ this.parsers = [];
15
+ this.states = [];
16
+ this.client = client;
17
+ for (let i = 0; i < zones; i++) {
18
+ this.AddZone();
19
+ }
20
+ }
21
+ AddZone() {
22
+ const state = new denon_state_manager_1.ReceiverState();
23
+ this.states.push(state);
24
+ if (this.parsers.length === 0) {
25
+ this.parsers.push(new denon_state_manager_1.MainParser(state));
26
+ }
27
+ else {
28
+ this.parsers.push(new denon_state_manager_1.ZoneParser(state, `Z${this.states.length}`));
29
+ }
30
+ }
31
+ handle(data) {
32
+ var _a;
33
+ for (let zone = 1; zone <= this.parsers.length; zone++) {
34
+ const result = this.parsers[zone - 1].parse(data);
35
+ if (result.handled && result.value) {
36
+ return {
37
+ key: (_a = result.key) !== null && _a !== void 0 ? _a : denon_state_manager_1.ReceiverSettings.None,
38
+ value: result.value,
39
+ zone,
40
+ };
41
+ }
42
+ }
43
+ }
44
+ async read(mqttManager) {
45
+ var _a, e_1, _b, _c;
46
+ var _d;
47
+ try {
48
+ const data = await this.client.nextData();
49
+ const lines = (_d = data === null || data === void 0 ? void 0 : data.split('\r')) !== null && _d !== void 0 ? _d : [];
50
+ try {
51
+ for (var _e = true, lines_1 = __asyncValues(lines), lines_1_1; lines_1_1 = await lines_1.next(), _a = lines_1_1.done, !_a; _e = true) {
52
+ _c = lines_1_1.value;
53
+ _e = false;
54
+ const line = _c;
55
+ if (line !== '') {
56
+ console.debug('Received:', line);
57
+ const result = this.handle(line);
58
+ if (result) {
59
+ await mqttManager.publish(result);
60
+ const state = this.states[result.zone - 1];
61
+ state.updateState(result.key, result.value);
62
+ await mqttManager.publishState(state, result.zone);
63
+ }
64
+ else {
65
+ console.debug('Unhandled:', line);
66
+ }
67
+ }
68
+ }
69
+ }
70
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
71
+ finally {
72
+ try {
73
+ if (!_e && !_a && (_b = lines_1.return)) await _b.call(lines_1);
74
+ }
75
+ finally { if (e_1) throw e_1.error; }
76
+ }
77
+ }
78
+ catch (err) {
79
+ console.error(err);
80
+ }
81
+ }
82
+ }
83
+ exports.TelnetListener = TelnetListener;
84
+ //# sourceMappingURL=TelnetListener.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TelnetListener.js","sourceRoot":"","sources":["../src/TelnetListener.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export interface ZoneConfig {
2
+ index: string;
3
+ name: string;
4
+ sources: string[];
5
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ZoneConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ZoneConfig.js","sourceRoot":"","sources":["../src/ZoneConfig.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const dotenv_1 = __importDefault(require("dotenv"));
8
+ const CliParser_1 = require("./CliParser");
9
+ (async () => {
10
+ var _a;
11
+ dotenv_1.default.config();
12
+ if (!process.env.AVR_HOST) {
13
+ throw new Error('Must set AVR_HOST environment variable');
14
+ }
15
+ if (process.argv.length > 2) {
16
+ await CliParser_1.CliParser.run({
17
+ name: 'denon-mqtt',
18
+ version: 'dev',
19
+ args: process.argv,
20
+ });
21
+ }
22
+ else {
23
+ await CliParser_1.CliParser.run({
24
+ name: 'denon-mqtt',
25
+ version: 'dev',
26
+ args: [
27
+ 'node',
28
+ 'src/entryPoint.ts',
29
+ '--avr',
30
+ (_a = process.env.AVR_HOST) !== null && _a !== void 0 ? _a : '192.168.1.34',
31
+ '--mqtt',
32
+ 'localhost',
33
+ '--username',
34
+ 'user',
35
+ '--password',
36
+ 'password',
37
+ '--zones',
38
+ 'Living|Rumpus|Porch',
39
+ ],
40
+ });
41
+ }
42
+ })()
43
+ .then()
44
+ .catch((error) => {
45
+ console.error(error);
46
+ });
47
+ //# sourceMappingURL=entryPoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entryPoint.js","sourceRoot":"","sources":["../src/entryPoint.ts"],"names":[],"mappings":";;;;;;AACA,oDAA4B;AAE5B,2CAAwC;AAExC,CAAC,KAAK,IAAI,EAAE;;IACV,gBAAM,CAAC,MAAM,EAAE,CAAC;IAEhB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,qBAAS,CAAC,GAAG,CAAC;YAClB,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,qBAAS,CAAC,GAAG,CAAC;YAClB,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,KAAK;YACd,IAAI,EAAE;gBACJ,MAAM;gBACN,mBAAmB;gBACnB,OAAO;gBACP,MAAA,OAAO,CAAC,GAAG,CAAC,QAAQ,mCAAI,cAAc;gBACtC,QAAQ;gBACR,WAAW;gBACX,YAAY;gBACZ,MAAM;gBACN,YAAY;gBACZ,UAAU;gBACV,SAAS;gBACT,qBAAqB;aACtB;SACF,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,EAAE;KACD,IAAI,EAAE;KACN,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}