@homebridge-plugins/homebridge-sharkiq 1.3.2
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.
- package/CHANGELOG.md +12 -0
- package/LICENSE +176 -0
- package/README.md +92 -0
- package/config.schema.json +114 -0
- package/dist/config.d.ts +7 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +131 -0
- package/dist/config.js.map +1 -0
- package/dist/homebridge-ui/public/index.html +201 -0
- package/dist/homebridge-ui/server.d.ts +2 -0
- package/dist/homebridge-ui/server.d.ts.map +1 -0
- package/dist/homebridge-ui/server.js +47 -0
- package/dist/homebridge-ui/server.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/login.d.ts +16 -0
- package/dist/login.d.ts.map +1 -0
- package/dist/login.js +242 -0
- package/dist/login.js.map +1 -0
- package/dist/platform.d.ts +16 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +118 -0
- package/dist/platform.js.map +1 -0
- package/dist/platformAccessory.d.ts +29 -0
- package/dist/platformAccessory.d.ts.map +1 -0
- package/dist/platformAccessory.js +285 -0
- package/dist/platformAccessory.js.map +1 -0
- package/dist/settings.d.ts +3 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +3 -0
- package/dist/settings.js.map +1 -0
- package/dist/sharkiq-js/ayla_api.d.ts +39 -0
- package/dist/sharkiq-js/ayla_api.d.ts.map +1 -0
- package/dist/sharkiq-js/ayla_api.js +289 -0
- package/dist/sharkiq-js/ayla_api.js.map +1 -0
- package/dist/sharkiq-js/const.d.ts +22 -0
- package/dist/sharkiq-js/const.d.ts.map +1 -0
- package/dist/sharkiq-js/const.js +23 -0
- package/dist/sharkiq-js/const.js.map +1 -0
- package/dist/sharkiq-js/properties.d.ts +52 -0
- package/dist/sharkiq-js/properties.d.ts.map +1 -0
- package/dist/sharkiq-js/properties.js +56 -0
- package/dist/sharkiq-js/properties.js.map +1 -0
- package/dist/sharkiq-js/sharkiq.d.ts +59 -0
- package/dist/sharkiq-js/sharkiq.d.ts.map +1 -0
- package/dist/sharkiq-js/sharkiq.js +359 -0
- package/dist/sharkiq-js/sharkiq.js.map +1 -0
- package/dist/type.d.ts +12 -0
- package/dist/type.d.ts.map +1 -0
- package/dist/type.js +2 -0
- package/dist/type.js.map +1 -0
- package/dist/utils.d.ts +10 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +35 -0
- package/dist/utils.js.map +1 -0
- package/docs/.nojekyll +1 -0
- package/docs/assets/dmt/dmt-component-data.js +1 -0
- package/docs/assets/dmt/dmt-components.css +20 -0
- package/docs/assets/dmt/dmt-components.js +67 -0
- package/docs/assets/dmt/dmt-search.cmp +0 -0
- package/docs/assets/dmt/dmt-theme.css +1 -0
- package/docs/assets/hierarchy.js +1 -0
- package/docs/assets/highlight.css +57 -0
- package/docs/assets/icons.js +18 -0
- package/docs/assets/icons.svg +1 -0
- package/docs/assets/main.js +60 -0
- package/docs/assets/style.css +1611 -0
- package/docs/functions/default.html +2 -0
- package/docs/index.html +50 -0
- package/docs/modules.html +2 -0
- package/eslint.config.js +49 -0
- package/package.json +87 -0
- package/typedoc.json +21 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
<p class="text-center">
|
|
2
|
+
<img src="https://raw.githubusercontent.com/homebridge/plugins/latest/icons/homebridge-sharkiq.png"
|
|
3
|
+
alt="homebridge-sharkiq logo" style="width: 15%" />
|
|
4
|
+
</p>
|
|
5
|
+
<div id="pageIntro" style="display: none">
|
|
6
|
+
<p class="lead text-center">Thank you for installing<strong> homebridge-sharkiq</strong></p>
|
|
7
|
+
<p class="lead text-center">To get started link your SharkIQ Account:</p>
|
|
8
|
+
<ol>
|
|
9
|
+
<li class="mb-3">Input your SharkIQ <strong>E-mail & Password</strong> into the SharkIQ Account Info.</li>
|
|
10
|
+
<li class="mb-3">Finally <strong>Restart</strong> Homebridge..</li>
|
|
11
|
+
</ol>
|
|
12
|
+
<div class="text-center">
|
|
13
|
+
<button type="button" class="btn btn-primary" id="introLink">Continue →</button>
|
|
14
|
+
</div>
|
|
15
|
+
</div>
|
|
16
|
+
<div id="menuWrapper" class="btn-group w-100 mb-0" role="group" aria-label="UI Menu" style="display: none">
|
|
17
|
+
<button type="button" class="btn btn-primary" id="menuDevices">Devices</button>
|
|
18
|
+
<button type="button" class="btn btn-primary" id="menuSettings">Settings</button>
|
|
19
|
+
<button type="button" class="btn btn-primary mr-0" id="menuHome">Support</button>
|
|
20
|
+
</div>
|
|
21
|
+
<div id="pageDevices" class="mt-4" style="display: none">
|
|
22
|
+
<div id="deviceInfo">
|
|
23
|
+
<form>
|
|
24
|
+
<div class="form-group">
|
|
25
|
+
<select class="form-control" id="deviceSelect"></select>
|
|
26
|
+
</div>
|
|
27
|
+
</form>
|
|
28
|
+
<table class="table w-100" id="deviceTable" style="display: none">
|
|
29
|
+
<thead>
|
|
30
|
+
<tr class="table-active">
|
|
31
|
+
<th scope="col" style="width: 40%">Device Name</th>
|
|
32
|
+
<th scope="col" style="width: 60%" id="displayName"></th>
|
|
33
|
+
</tr>
|
|
34
|
+
</thead>
|
|
35
|
+
<tbody>
|
|
36
|
+
<tr>
|
|
37
|
+
<th scope="row">Lock ID</th>
|
|
38
|
+
<td id="lockId"></td>
|
|
39
|
+
</tr>
|
|
40
|
+
<tr>
|
|
41
|
+
<th scope="row">Model</th>
|
|
42
|
+
<td id="model"></td>
|
|
43
|
+
</tr>
|
|
44
|
+
<tr>
|
|
45
|
+
<th scope="row">Firmware Version</th>
|
|
46
|
+
<td id="firmwareRevision"></td>
|
|
47
|
+
</tr>
|
|
48
|
+
</tbody>
|
|
49
|
+
</table>
|
|
50
|
+
<p class="text-center">External Accessories Will Not Display Here.</p>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
<div id="pageSupport" class="mt-4" style="display: none">
|
|
54
|
+
<p class="text-center lead">Thank you for using <strong>homebridge-sharkiq</strong></p>
|
|
55
|
+
<p class="text-center">The links below will take you to our GitHub wiki</p>
|
|
56
|
+
<h5>Setup</h5>
|
|
57
|
+
<ul>
|
|
58
|
+
<li>
|
|
59
|
+
<a href="https://github.com/homebridge-plugins/homebridge-sharkiq/wiki" target="_blank">Wiki Home</a>
|
|
60
|
+
</li>
|
|
61
|
+
<li>
|
|
62
|
+
<a href="https://github.com/homebridge-plugins/homebridge-sharkiq/wiki/Configuration" target="_blank">Configuration</a>
|
|
63
|
+
</li>
|
|
64
|
+
<li>
|
|
65
|
+
<a href="https://github.com/homebridge-plugins/homebridge-sharkiq/wiki/Beta-Version" target="_blank">Beta Version</a>
|
|
66
|
+
</li>
|
|
67
|
+
<li>
|
|
68
|
+
<a href="https://github.com/homebridge-plugins/homebridge-sharkiq/wiki/Node-Version" target="_blank">Node Version</a>
|
|
69
|
+
</li>
|
|
70
|
+
<li>
|
|
71
|
+
<a href="https://github.com/homebridge-plugins/homebridge-sharkiq/wiki/Uninstallation"
|
|
72
|
+
target="_blank">Uninstallation</a>
|
|
73
|
+
</li>
|
|
74
|
+
</ul>
|
|
75
|
+
<h5>Features</h5>
|
|
76
|
+
<ul>
|
|
77
|
+
<li>
|
|
78
|
+
<a href="https://github.com/homebridge-plugins/homebridge-sharkiq/wiki/Supported-Devices" target="_blank">Supported
|
|
79
|
+
Devices</a>
|
|
80
|
+
</li>
|
|
81
|
+
</ul>
|
|
82
|
+
<h5>Help/About</h5>
|
|
83
|
+
<ul>
|
|
84
|
+
<li>
|
|
85
|
+
<a href="https://github.com/homebridge-plugins/homebridge-sharkiq/issues/new/choose" target="_blank">Support Request</a>
|
|
86
|
+
</li>
|
|
87
|
+
<li>
|
|
88
|
+
<a href="https://github.com/homebridge-plugins/homebridge-sharkiq/blob/latest/CHANGELOG.md"
|
|
89
|
+
target="_blank">Changelog</a>
|
|
90
|
+
</li>
|
|
91
|
+
</ul>
|
|
92
|
+
</div>
|
|
93
|
+
<script>
|
|
94
|
+
(async () => {
|
|
95
|
+
try {
|
|
96
|
+
const currentConfig = await homebridge.getPluginConfig();
|
|
97
|
+
showIntro = () => {
|
|
98
|
+
const introLink = document.getElementById('introLink');
|
|
99
|
+
introLink.addEventListener('click', () => {
|
|
100
|
+
homebridge.showSpinner();
|
|
101
|
+
document.getElementById('pageIntro').style.display = 'none';
|
|
102
|
+
document.getElementById('menuWrapper').style.display = 'inline-flex';
|
|
103
|
+
showDevices();
|
|
104
|
+
homebridge.hideSpinner();
|
|
105
|
+
});
|
|
106
|
+
document.getElementById('pageIntro').style.display = 'block';
|
|
107
|
+
};
|
|
108
|
+
showDevices = async () => {
|
|
109
|
+
homebridge.showSpinner();
|
|
110
|
+
homebridge.hideSchemaForm();
|
|
111
|
+
document.getElementById('menuHome').classList.remove('btn-elegant');
|
|
112
|
+
document.getElementById('menuHome').classList.add('btn-primary');
|
|
113
|
+
document.getElementById('menuDevices').classList.add('btn-elegant');
|
|
114
|
+
document.getElementById('menuDevices').classList.remove('btn-primary');
|
|
115
|
+
document.getElementById('menuSettings').classList.remove('btn-elegant');
|
|
116
|
+
document.getElementById('menuSettings').classList.add('btn-primary');
|
|
117
|
+
document.getElementById('pageSupport').style.display = 'none';
|
|
118
|
+
document.getElementById('pageDevices').style.display = 'block';
|
|
119
|
+
const cachedAccessories =
|
|
120
|
+
typeof homebridge.getCachedAccessories === 'function'
|
|
121
|
+
? await homebridge.getCachedAccessories()
|
|
122
|
+
: await homebridge.request('/getCachedAccessories');
|
|
123
|
+
if (cachedAccessories.length > 0) {
|
|
124
|
+
cachedAccessories.sort((a, b) => {
|
|
125
|
+
return a.displayName.toLowerCase() > b.displayName.toLowerCase() ? 1 : b.displayName.toLowerCase() > a.displayName.toLowerCase() ? -1 : 0;
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
const deviceSelect = document.getElementById('deviceSelect');
|
|
129
|
+
deviceSelect.innerHTML = '';
|
|
130
|
+
cachedAccessories.forEach((a) => {
|
|
131
|
+
const option = document.createElement('option');
|
|
132
|
+
option.text = a.displayName;
|
|
133
|
+
option.value = a.UUID;
|
|
134
|
+
deviceSelect.add(option);
|
|
135
|
+
});
|
|
136
|
+
showDeviceInfo = async (UUID) => {
|
|
137
|
+
homebridge.showSpinner();
|
|
138
|
+
const thisAcc = cachedAccessories.find((x) => x.UUID === UUID);
|
|
139
|
+
const context = thisAcc.context;
|
|
140
|
+
const deviceConfig = currentConfig.find((x) => x.UUID === UUID);
|
|
141
|
+
document.getElementById('displayName').innerHTML = thisAcc.displayName;
|
|
142
|
+
document.getElementById('lockId').innerHTML = context.lockId;
|
|
143
|
+
document.getElementById('model').innerHTML = context.model;
|
|
144
|
+
document.getElementById('firmwareRevision').innerHTML = context.firmwareRevision || 'N/A';
|
|
145
|
+
document.getElementById('deviceTable').style.display = 'inline-table';
|
|
146
|
+
homebridge.hideSpinner();
|
|
147
|
+
};
|
|
148
|
+
deviceSelect.addEventListener('change', (event) => showDeviceInfo(event.target.value));
|
|
149
|
+
if (cachedAccessories.length > 0) {
|
|
150
|
+
showDeviceInfo(cachedAccessories[0].UUID);
|
|
151
|
+
} else {
|
|
152
|
+
const option = document.createElement('option');
|
|
153
|
+
option.text = 'No Devices';
|
|
154
|
+
deviceSelect.add(option);
|
|
155
|
+
}
|
|
156
|
+
homebridge.hideSpinner();
|
|
157
|
+
};
|
|
158
|
+
showSupport = () => {
|
|
159
|
+
homebridge.showSpinner();
|
|
160
|
+
homebridge.hideSchemaForm();
|
|
161
|
+
document.getElementById('menuHome').classList.add('btn-elegant');
|
|
162
|
+
document.getElementById('menuHome').classList.remove('btn-primary');
|
|
163
|
+
document.getElementById('menuDevices').classList.remove('btn-elegant');
|
|
164
|
+
document.getElementById('menuDevices').classList.add('btn-primary');
|
|
165
|
+
document.getElementById('menuSettings').classList.remove('btn-elegant');
|
|
166
|
+
document.getElementById('menuSettings').classList.add('btn-primary');
|
|
167
|
+
document.getElementById('pageSupport').style.display = 'block';
|
|
168
|
+
document.getElementById('pageDevices').style.display = 'none';
|
|
169
|
+
homebridge.hideSpinner();
|
|
170
|
+
};
|
|
171
|
+
showSettings = () => {
|
|
172
|
+
homebridge.showSpinner();
|
|
173
|
+
document.getElementById('menuHome').classList.remove('btn-elegant');
|
|
174
|
+
document.getElementById('menuHome').classList.add('btn-primary');
|
|
175
|
+
document.getElementById('menuDevices').classList.remove('btn-elegant');
|
|
176
|
+
document.getElementById('menuDevices').classList.add('btn-primary');
|
|
177
|
+
document.getElementById('menuSettings').classList.add('btn-elegant');
|
|
178
|
+
document.getElementById('menuSettings').classList.remove('btn-primary');
|
|
179
|
+
document.getElementById('pageSupport').style.display = 'none';
|
|
180
|
+
document.getElementById('pageDevices').style.display = 'none';
|
|
181
|
+
homebridge.showSchemaForm();
|
|
182
|
+
homebridge.hideSpinner();
|
|
183
|
+
};
|
|
184
|
+
menuHome.addEventListener('click', () => showSupport());
|
|
185
|
+
menuDevices.addEventListener('click', () => showDevices());
|
|
186
|
+
menuSettings.addEventListener('click', () => showSettings());
|
|
187
|
+
if (currentConfig.length) {
|
|
188
|
+
document.getElementById('menuWrapper').style.display = 'inline-flex';
|
|
189
|
+
showDevices();
|
|
190
|
+
} else {
|
|
191
|
+
currentConfig.push({ name: 'August' });
|
|
192
|
+
await homebridge.updatePluginConfig(currentConfig);
|
|
193
|
+
showIntro();
|
|
194
|
+
}
|
|
195
|
+
} catch (err) {
|
|
196
|
+
homebridge.toast.error(err.message, 'Error');
|
|
197
|
+
} finally {
|
|
198
|
+
homebridge.hideSpinner();
|
|
199
|
+
}
|
|
200
|
+
})();
|
|
201
|
+
</script>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/homebridge-ui/server.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
/* Copyright(C) 2021-2024, donavanbecker (https://github.com/donavanbecker). All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* server.ts: homebridge-sharkiq.
|
|
5
|
+
*/
|
|
6
|
+
import { HomebridgePluginUiServer } from '@homebridge/plugin-ui-utils';
|
|
7
|
+
class PluginUiServer extends HomebridgePluginUiServer {
|
|
8
|
+
constructor() {
|
|
9
|
+
super();
|
|
10
|
+
/*
|
|
11
|
+
A native method getCachedAccessories() was introduced in config-ui-x v4.37.0
|
|
12
|
+
The following is for users who have a lower version of config-ui-x
|
|
13
|
+
*/
|
|
14
|
+
this.onRequest('getCachedAccessories', () => {
|
|
15
|
+
try {
|
|
16
|
+
const plugin = 'homebridge-sharkiq';
|
|
17
|
+
const devicesToReturn = [];
|
|
18
|
+
// The path and file of the cached accessories
|
|
19
|
+
const accFile = `${this.homebridgeStoragePath}/accessories/cachedAccessories`;
|
|
20
|
+
// Check the file exists
|
|
21
|
+
if (fs.existsSync(accFile)) {
|
|
22
|
+
// read the cached accessories file
|
|
23
|
+
const cachedAccessories = JSON.parse(fs.readFileSync(accFile, 'utf8'));
|
|
24
|
+
cachedAccessories.forEach((accessory) => {
|
|
25
|
+
// Check the accessory is from this plugin
|
|
26
|
+
if (accessory.plugin === plugin) {
|
|
27
|
+
// Add the cached accessory to the array
|
|
28
|
+
devicesToReturn.push(accessory.accessory);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
// Return the array
|
|
33
|
+
return devicesToReturn;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// Just return an empty accessory list in case of any errors
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
this.ready();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function startPluginUiServer() {
|
|
44
|
+
return new PluginUiServer();
|
|
45
|
+
}
|
|
46
|
+
startPluginUiServer();
|
|
47
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/homebridge-ui/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AAExB;;;GAGG;AACH,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAA;AAEtE,MAAM,cAAe,SAAQ,wBAAwB;IACnD;QACE,KAAK,EAAE,CAAA;QACP;;;UAGE;QACF,IAAI,CAAC,SAAS,CAAC,sBAAsB,EAAE,GAAG,EAAE;YAC1C,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,oBAAoB,CAAA;gBACnC,MAAM,eAAe,GAAG,EAAE,CAAA;gBAE1B,8CAA8C;gBAC9C,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,qBAAqB,gCAAgC,CAAA;gBAE7E,wBAAwB;gBACxB,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC3B,mCAAmC;oBACnC,MAAM,iBAAiB,GAAU,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;oBAE7E,iBAAiB,CAAC,OAAO,CAAC,CAAC,SAAc,EAAE,EAAE;wBAC3C,0CAA0C;wBAC1C,IAAI,SAAS,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;4BAChC,wCAAwC;4BACxC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,SAAkB,CAAC,CAAA;wBACpD,CAAC;oBACH,CAAC,CAAC,CAAA;gBACJ,CAAC;gBACD,mBAAmB;gBACnB,OAAO,eAAe,CAAA;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,4DAA4D;gBAC5D,OAAO,EAAE,CAAA;YACX,CAAC;QACH,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,KAAK,EAAE,CAAA;IACd,CAAC;CACF;AAED,SAAS,mBAAmB;IAC1B,OAAO,IAAI,cAAc,EAAE,CAAA;AAC7B,CAAC;AAED,mBAAmB,EAAE,CAAA"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAA;yBAMrB,KAAK,GAAG,KAAG,IAAI;AAA/B,wBAEC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { SharkIQPlatform } from './platform.js';
|
|
2
|
+
import { PLATFORM_NAME, PLUGIN_NAME } from './settings.js';
|
|
3
|
+
// Register our platform with homebridge.
|
|
4
|
+
export default (api) => {
|
|
5
|
+
api.registerPlatform(PLUGIN_NAME, PLATFORM_NAME, SharkIQPlatform);
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE1D,yCAAyC;AACzC,eAAe,CAAC,GAAQ,EAAQ,EAAE;IAChC,GAAG,CAAC,gBAAgB,CAAC,WAAW,EAAE,aAAa,EAAE,eAAe,CAAC,CAAA;AACnE,CAAC,CAAA"}
|
package/dist/login.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Logger } from 'homebridge';
|
|
2
|
+
export declare class Login {
|
|
3
|
+
log: Logger;
|
|
4
|
+
auth_file: string;
|
|
5
|
+
oauth_file: string;
|
|
6
|
+
email: string;
|
|
7
|
+
password: string;
|
|
8
|
+
app_id: string;
|
|
9
|
+
app_secret: string;
|
|
10
|
+
oAuthCode: string;
|
|
11
|
+
constructor(log: Logger, auth_file: string, oauth_file: string, email: string, password: string, oAuthCode: string, app_id?: string, app_secret?: string);
|
|
12
|
+
checkLogin(): Promise<void>;
|
|
13
|
+
private login;
|
|
14
|
+
private loginCallback;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=login.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAexC,qBAAa,KAAK;IACT,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;gBAEZ,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,SAA2B,EAAE,UAAU,SAA+B;IAWnL,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YA2D1B,KAAK;YAmGL,aAAa;CAwD5B"}
|
package/dist/login.js
ADDED
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import process from 'node:process';
|
|
2
|
+
import { setTimeout } from 'node:timers/promises';
|
|
3
|
+
import fetch from 'node-fetch';
|
|
4
|
+
import puppeteer from 'puppeteer-extra';
|
|
5
|
+
import StealthPlugin from 'puppeteer-extra-plugin-stealth';
|
|
6
|
+
import { generateURL, getAuthData, getOAuthData, removeFile, setAuthData } from './config.js';
|
|
7
|
+
import { global_vars } from './sharkiq-js/const.js';
|
|
8
|
+
import { addSeconds } from './utils.js';
|
|
9
|
+
export class Login {
|
|
10
|
+
log;
|
|
11
|
+
auth_file;
|
|
12
|
+
oauth_file;
|
|
13
|
+
email;
|
|
14
|
+
password;
|
|
15
|
+
app_id;
|
|
16
|
+
app_secret;
|
|
17
|
+
oAuthCode;
|
|
18
|
+
constructor(log, auth_file, oauth_file, email, password, oAuthCode, app_id = global_vars.SHARK_APP_ID, app_secret = global_vars.SHARK_APP_SECRET) {
|
|
19
|
+
this.log = log;
|
|
20
|
+
this.auth_file = auth_file;
|
|
21
|
+
this.oauth_file = oauth_file;
|
|
22
|
+
this.email = email;
|
|
23
|
+
this.password = password;
|
|
24
|
+
this.oAuthCode = oAuthCode;
|
|
25
|
+
this.app_id = app_id;
|
|
26
|
+
this.app_secret = app_secret;
|
|
27
|
+
}
|
|
28
|
+
async checkLogin() {
|
|
29
|
+
try {
|
|
30
|
+
await getAuthData(this.auth_file);
|
|
31
|
+
this.log.debug('Already logged in to Shark');
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
this.log.debug('Not logged in to Shark');
|
|
35
|
+
const email = this.email;
|
|
36
|
+
const password = this.password;
|
|
37
|
+
const architecure = process.arch;
|
|
38
|
+
const platform = process.platform;
|
|
39
|
+
if (email === '' && password === '') {
|
|
40
|
+
if (this.oAuthCode === '') {
|
|
41
|
+
try {
|
|
42
|
+
const url = await generateURL(this.oauth_file);
|
|
43
|
+
return Promise.reject(new Error(`Please login to Shark using the following URL: ${url}`));
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
return Promise.reject(error);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
try {
|
|
51
|
+
const ouath_data = await getOAuthData(this.oauth_file);
|
|
52
|
+
try {
|
|
53
|
+
await this.loginCallback(this.oAuthCode, ouath_data);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
return Promise.reject(error);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
this.log.warn('OAuth data not found with OAuth code set. Please clear the OAuth code and try again.');
|
|
61
|
+
return Promise.reject(error);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
if (platform === 'linux' && architecure === 'arm64') {
|
|
67
|
+
this.log.warn(`${platform} ${architecure} architecture does not support automatic login. Please use OAuth code login method.`);
|
|
68
|
+
const url = await generateURL(this.oauth_file);
|
|
69
|
+
return Promise.reject(new Error(`Please login to Shark using the following URL: ${url}`));
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
const url = await generateURL(this.oauth_file);
|
|
73
|
+
await this.login(email, password, url);
|
|
74
|
+
if (this.oAuthCode === '') {
|
|
75
|
+
return Promise.reject(new Error('Error: No OAuth code found'));
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
const ouath_data = await getOAuthData(this.oauth_file);
|
|
79
|
+
await this.loginCallback(this.oAuthCode, ouath_data);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
this.log.warn('If you received the error Syntax error: Unterminated quoted string, please use the OAuth code login method. '
|
|
84
|
+
+ 'This is a known issue with arm64 devices like Raspberry Pi.');
|
|
85
|
+
this.log.info('To login using the OAuth code method, '
|
|
86
|
+
+ 'please remove the email and password from your Homebridge configuration and restart Homebridge.');
|
|
87
|
+
return Promise.reject(error);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async login(email, password, url) {
|
|
93
|
+
const stealth = StealthPlugin();
|
|
94
|
+
puppeteer.use(stealth);
|
|
95
|
+
const headless = true;
|
|
96
|
+
this.log.debug('Headless:', headless);
|
|
97
|
+
let error = '';
|
|
98
|
+
try {
|
|
99
|
+
const browser = await puppeteer.launch({
|
|
100
|
+
headless,
|
|
101
|
+
targetFilter: target => target.type() !== 'other',
|
|
102
|
+
});
|
|
103
|
+
this.log.debug('Opening chromium browser...');
|
|
104
|
+
const page = await browser.newPage();
|
|
105
|
+
const pages = await browser.pages();
|
|
106
|
+
pages[0].close();
|
|
107
|
+
this.log.debug('Navigating to Shark login page...');
|
|
108
|
+
await page.goto(url, { waitUntil: 'domcontentloaded' });
|
|
109
|
+
page.on('response', async (response) => {
|
|
110
|
+
if (response.url().includes('login?')) {
|
|
111
|
+
this.log.debug('Retrieving login response...');
|
|
112
|
+
if (!response.ok() && ![301, 302].includes(response.status())) {
|
|
113
|
+
this.log.debug('Error logging in: HTTP', response.status());
|
|
114
|
+
await setTimeout(1000);
|
|
115
|
+
await page.screenshot({ path: 'login_error.png' });
|
|
116
|
+
const errorMessages = await page.$$eval('span[class="ulp-input-error-message"]', el => el.map(x => x.textContent?.trim() || ''));
|
|
117
|
+
const promptAlert = await page.$('div[id="prompt-alert"]');
|
|
118
|
+
if (promptAlert) {
|
|
119
|
+
const alertP = await promptAlert.$('p');
|
|
120
|
+
if (alertP) {
|
|
121
|
+
const alertText = await alertP.evaluate(el => el.textContent?.trim());
|
|
122
|
+
if (alertText) {
|
|
123
|
+
errorMessages.push(alertText);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
error = errorMessages.join(', ');
|
|
128
|
+
await browser.close();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else if (response.url().includes('resume?')) {
|
|
132
|
+
this.log.debug('Retrieving callback response...');
|
|
133
|
+
const headers = response.headers();
|
|
134
|
+
const queries = headers.location.split('?');
|
|
135
|
+
if (queries.length > 1) {
|
|
136
|
+
const code = queries[1].split('&').find((query) => query.includes('code='));
|
|
137
|
+
if (code) {
|
|
138
|
+
this.oAuthCode = code.slice(5);
|
|
139
|
+
}
|
|
140
|
+
await browser.close();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
if (headless) {
|
|
145
|
+
this.log.debug('Inputing login info...');
|
|
146
|
+
await page.waitForSelector('button[name="action"]');
|
|
147
|
+
await setTimeout(1000);
|
|
148
|
+
await page.waitForSelector('input[inputMode="email"]');
|
|
149
|
+
await page.type('input[inputMode="email"]', email);
|
|
150
|
+
await setTimeout(1000);
|
|
151
|
+
await page.type('input[type="password"]', password);
|
|
152
|
+
let verified = false;
|
|
153
|
+
let attempts = 0;
|
|
154
|
+
while (!verified) {
|
|
155
|
+
await setTimeout(5000);
|
|
156
|
+
const captchaInput = await page.$('input[name="captcha"]');
|
|
157
|
+
const needsCaptcha = await captchaInput?.$eval('input[name="captcha"]', el => el.value === '');
|
|
158
|
+
if (!needsCaptcha) {
|
|
159
|
+
verified = true;
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
attempts++;
|
|
163
|
+
if (attempts > 3) {
|
|
164
|
+
error = `Unable to verify captcha after ${attempts} attempts`;
|
|
165
|
+
await browser.close();
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
this.log.debug('Captcha not verified. Attempt #', attempts);
|
|
169
|
+
const checkbox = await page.$('input[type="checkbox"]');
|
|
170
|
+
if (checkbox) {
|
|
171
|
+
await checkbox.click();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
await page.click('button[name="action"]');
|
|
177
|
+
await setTimeout(5000);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
return Promise.reject(new Error(`Error: ${error}`));
|
|
182
|
+
}
|
|
183
|
+
if (error !== '') {
|
|
184
|
+
return Promise.reject(new Error(`Error: ${error}`));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
async loginCallback(code, oAuthData) {
|
|
188
|
+
const data = {
|
|
189
|
+
grant_type: 'authorization_code',
|
|
190
|
+
client_id: global_vars.OAUTH.CLIENT_ID,
|
|
191
|
+
code,
|
|
192
|
+
code_verifier: oAuthData.code_verify,
|
|
193
|
+
redirect_uri: global_vars.OAUTH.REDIRECT_URI,
|
|
194
|
+
};
|
|
195
|
+
const reqData = {
|
|
196
|
+
method: 'POST',
|
|
197
|
+
headers: {
|
|
198
|
+
'Content-Type': 'application/json',
|
|
199
|
+
'Auth0-Client': global_vars.OAUTH.AUTH0_CLIENT,
|
|
200
|
+
},
|
|
201
|
+
body: JSON.stringify(data),
|
|
202
|
+
};
|
|
203
|
+
this.log.debug('Request Data', JSON.stringify(data));
|
|
204
|
+
const response = await fetch(global_vars.OAUTH.TOKEN_URL, reqData);
|
|
205
|
+
if (!response.ok) {
|
|
206
|
+
return Promise.reject(new Error(`Unable to get token data. HTTP ${response.status}`));
|
|
207
|
+
}
|
|
208
|
+
const tokenData = await response.json();
|
|
209
|
+
this.log.debug('Token Data:', JSON.stringify(tokenData));
|
|
210
|
+
const reqData2 = {
|
|
211
|
+
method: 'POST',
|
|
212
|
+
headers: {
|
|
213
|
+
'Content-Type': 'application/json',
|
|
214
|
+
},
|
|
215
|
+
body: JSON.stringify({
|
|
216
|
+
app_id: this.app_id,
|
|
217
|
+
app_secret: this.app_secret,
|
|
218
|
+
token: tokenData.id_token,
|
|
219
|
+
}),
|
|
220
|
+
};
|
|
221
|
+
const response2 = await fetch(`${global_vars.LOGIN_URL}/api/v1/token_sign_in`, reqData2);
|
|
222
|
+
if (!response2.ok) {
|
|
223
|
+
return Promise.reject(new Error(`Unable to get authorization tokens. HTTP ${response2.status}`));
|
|
224
|
+
}
|
|
225
|
+
const aylaTokenData = await response2.json();
|
|
226
|
+
const dateNow = new Date();
|
|
227
|
+
aylaTokenData.expiration = addSeconds(dateNow, aylaTokenData.expires_in);
|
|
228
|
+
this.log.debug('Setting auth data...', JSON.stringify(aylaTokenData));
|
|
229
|
+
try {
|
|
230
|
+
await setAuthData(this.auth_file, aylaTokenData);
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
return Promise.reject(new Error(`${error}`));
|
|
234
|
+
}
|
|
235
|
+
try {
|
|
236
|
+
await removeFile(this.oauth_file);
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { API, Characteristic, DynamicPlatformPlugin, Logger, PlatformAccessory, PlatformConfig, Service } from 'homebridge';
|
|
2
|
+
import type { SharkIqVacuum } from './sharkiq-js/sharkiq';
|
|
3
|
+
export declare class SharkIQPlatform implements DynamicPlatformPlugin {
|
|
4
|
+
readonly log: Logger;
|
|
5
|
+
readonly config: PlatformConfig;
|
|
6
|
+
readonly api: API;
|
|
7
|
+
readonly Service: typeof Service;
|
|
8
|
+
readonly Characteristic: typeof Characteristic;
|
|
9
|
+
readonly accessories: PlatformAccessory[];
|
|
10
|
+
vacuumDevices: SharkIqVacuum[];
|
|
11
|
+
constructor(log: Logger, config: PlatformConfig, api: API);
|
|
12
|
+
login: () => Promise<SharkIqVacuum[]>;
|
|
13
|
+
configureAccessory(accessory: PlatformAccessory): void;
|
|
14
|
+
discoverDevices(): void;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=platform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,EAAE,iBAAiB,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEhI,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAWzD,qBAAa,eAAgB,YAAW,qBAAqB;aAUzC,GAAG,EAAE,MAAM;aACX,MAAM,EAAE,cAAc;aACtB,GAAG,EAAE,GAAG;IAX1B,SAAgB,OAAO,EAAE,OAAO,OAAO,CAAA;IACvC,SAAgB,cAAc,EAAE,OAAO,cAAc,CAAA;IAGrD,SAAgB,WAAW,EAAE,iBAAiB,EAAE,CAAK;IAE9C,aAAa,EAAE,aAAa,EAAE,CAAK;gBAGxB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,cAAc,EACtB,GAAG,EAAE,GAAG;IA+B1B,KAAK,QAAa,OAAO,CAAC,aAAa,EAAE,CAAC,CA0BzC;IAGD,kBAAkB,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI;IAOtD,eAAe,IAAI,IAAI;CAsCxB"}
|