@homebridge-plugins/homebridge-sharkiq 1.6.1 → 1.6.2-beta.0
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 +6 -0
- package/dist/login.d.ts +12 -0
- package/dist/login.d.ts.map +1 -1
- package/dist/login.js +20 -1
- package/dist/login.js.map +1 -1
- package/dist/login.test.d.ts +2 -0
- package/dist/login.test.d.ts.map +1 -0
- package/dist/login.test.js +26 -0
- package/dist/login.test.js.map +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. This project uses [Semantic Versioning](https://semver.org/)
|
|
4
4
|
|
|
5
|
+
## v1.6.2 (Pending Release)
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- fix: explain that a failed code exchange usually means the login code was already used or has expired, instead of reporting a bare http error (#84)
|
|
10
|
+
|
|
5
11
|
## v1.6.1 (2026-07-28)
|
|
6
12
|
|
|
7
13
|
### Changed
|
package/dist/login.d.ts
CHANGED
|
@@ -2,6 +2,18 @@ import type { Logger } from 'homebridge';
|
|
|
2
2
|
interface LoginLogger {
|
|
3
3
|
debug: (message: string, ...parameters: any[]) => void;
|
|
4
4
|
}
|
|
5
|
+
/**
|
|
6
|
+
* Turn a failed token exchange into something a user can act on.
|
|
7
|
+
*
|
|
8
|
+
* A 403 here is by far the most common failure and it almost never means what
|
|
9
|
+
* the bare status suggests. The login code is single-use and short-lived, so
|
|
10
|
+
* it is already spent if the SharkClean app opened the callback (it treats it
|
|
11
|
+
* as an Alexa-style account link, consuming the code and showing a "Linking
|
|
12
|
+
* Error"), and it is stale if the sign-in happened a while ago or against an
|
|
13
|
+
* older login URL. Reported repeatedly in #84 and #85, where the bare
|
|
14
|
+
* `HTTP 403` sent people looking for a problem with their account.
|
|
15
|
+
*/
|
|
16
|
+
export declare function describeTokenExchangeFailure(status: number): string;
|
|
5
17
|
export declare function exchangeOAuthCodeForAuthTokens(auth_file: string, oauth_file: string, code: string, europe?: boolean, app_id?: string, app_secret?: string, log?: LoginLogger): Promise<void>;
|
|
6
18
|
export declare class Login {
|
|
7
19
|
log: Logger;
|
package/dist/login.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AASxC,UAAU,WAAW;IACnB,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;CACvD;AAED,wBAAsB,8BAA8B,CAClD,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,MAAM,UAAQ,EACd,MAAM,CAAC,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,GAAG,CAAC,EAAE,WAAW,GAChB,OAAO,CAAC,IAAI,CAAC,CAqEf;AAED,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;IACjB,MAAM,EAAE,OAAO,CAAA;gBAEV,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,UAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;IAY3J,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAoC1B,aAAa;CAW5B"}
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AASxC,UAAU,WAAW;IACnB,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;CACvD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOnE;AAED,wBAAsB,8BAA8B,CAClD,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,MAAM,UAAQ,EACd,MAAM,CAAC,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,GAAG,CAAC,EAAE,WAAW,GAChB,OAAO,CAAC,IAAI,CAAC,CAqEf;AAED,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;IACjB,MAAM,EAAE,OAAO,CAAA;gBAEV,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,UAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;IAY3J,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAoC1B,aAAa;CAW5B"}
|
package/dist/login.js
CHANGED
|
@@ -3,6 +3,25 @@ import process from 'node:process';
|
|
|
3
3
|
import { generateURL, getAuthData, getOAuthData, removeFile, setAuth0Data, setAuthData } from './config.js';
|
|
4
4
|
import { global_vars } from './sharkiq-js/const.js';
|
|
5
5
|
import { addSeconds } from './utils.js';
|
|
6
|
+
/**
|
|
7
|
+
* Turn a failed token exchange into something a user can act on.
|
|
8
|
+
*
|
|
9
|
+
* A 403 here is by far the most common failure and it almost never means what
|
|
10
|
+
* the bare status suggests. The login code is single-use and short-lived, so
|
|
11
|
+
* it is already spent if the SharkClean app opened the callback (it treats it
|
|
12
|
+
* as an Alexa-style account link, consuming the code and showing a "Linking
|
|
13
|
+
* Error"), and it is stale if the sign-in happened a while ago or against an
|
|
14
|
+
* older login URL. Reported repeatedly in #84 and #85, where the bare
|
|
15
|
+
* `HTTP 403` sent people looking for a problem with their account.
|
|
16
|
+
*/
|
|
17
|
+
export function describeTokenExchangeFailure(status) {
|
|
18
|
+
if (status === 403 || status === 401) {
|
|
19
|
+
return `Unable to get token data. HTTP ${status} - this usually means the login code has already been used or has expired, rather than a problem with your account. `
|
|
20
|
+
+ 'Generate a fresh login URL, sign in again, and exchange the new code straight away. '
|
|
21
|
+
+ 'If the SharkClean app opened when you accepted, it consumed the code - use a browser on a computer that does not have the app installed.';
|
|
22
|
+
}
|
|
23
|
+
return `Unable to get token data. HTTP ${status}`;
|
|
24
|
+
}
|
|
6
25
|
export async function exchangeOAuthCodeForAuthTokens(auth_file, oauth_file, code, europe = false, app_id, app_secret, log) {
|
|
7
26
|
const oauthConfig = europe ? global_vars.EU_OAUTH : global_vars.OAUTH;
|
|
8
27
|
const loginUrl = europe ? global_vars.EU_LOGIN_URL : global_vars.LOGIN_URL;
|
|
@@ -27,7 +46,7 @@ export async function exchangeOAuthCodeForAuthTokens(auth_file, oauth_file, code
|
|
|
27
46
|
log?.debug('Request Data', JSON.stringify(data));
|
|
28
47
|
const response = await fetch(oauthConfig.TOKEN_URL, reqData);
|
|
29
48
|
if (!response.ok) {
|
|
30
|
-
return Promise.reject(new Error(
|
|
49
|
+
return Promise.reject(new Error(describeTokenExchangeFailure(response.status)));
|
|
31
50
|
}
|
|
32
51
|
const tokenData = await response.json();
|
|
33
52
|
log?.debug('Token Data:', JSON.stringify(tokenData));
|
package/dist/login.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,OAAO,MAAM,cAAc,CAAA;AAElC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC3G,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAMvC,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,SAAiB,EACjB,UAAkB,EAClB,IAAY,EACZ,MAAM,GAAG,KAAK,EACd,MAAe,EACf,UAAmB,EACnB,GAAiB;IAEjB,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAA;IACrE,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAA;IAC1E,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,CAAA;IACjG,MAAM,iBAAiB,GAAG,UAAU,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAA;IACjH,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,CAAA;IAEhD,MAAM,IAAI,GAAG;QACX,UAAU,EAAE,oBAAoB;QAChC,SAAS,EAAE,WAAW,CAAC,SAAS;QAChC,IAAI;QACJ,aAAa,EAAE,SAAS,CAAC,WAAW;QACpC,YAAY,EAAE,WAAW,CAAC,YAAY;KACvC,CAAA;IAED,MAAM,OAAO,GAAG;QACd,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,cAAc,EAAE,WAAW,CAAC,YAAY;SACzC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAA;IACD,GAAG,EAAE,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;IAEhD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IAC5D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.test.d.ts","sourceRoot":"","sources":["../src/login.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { describeTokenExchangeFailure } from './login.js';
|
|
3
|
+
/**
|
|
4
|
+
* The bare `Unable to get token data. HTTP 403` sent people hunting for an
|
|
5
|
+
* account problem in #84 and #85, when the real cause is a login code that has
|
|
6
|
+
* already been used or has expired.
|
|
7
|
+
*/
|
|
8
|
+
describe('describeTokenExchangeFailure', () => {
|
|
9
|
+
it('explains what a 403 actually means and what to do next', () => {
|
|
10
|
+
const message = describeTokenExchangeFailure(403);
|
|
11
|
+
expect(message).toContain('HTTP 403');
|
|
12
|
+
expect(message).toContain('already been used or has expired');
|
|
13
|
+
expect(message).toContain('Generate a fresh login URL');
|
|
14
|
+
expect(message).toContain('SharkClean app');
|
|
15
|
+
});
|
|
16
|
+
it('treats a 401 the same way, since it has the same cause', () => {
|
|
17
|
+
expect(describeTokenExchangeFailure(401)).toContain('already been used or has expired');
|
|
18
|
+
});
|
|
19
|
+
it('leaves other statuses as a plain report', () => {
|
|
20
|
+
// A 500 is SharkNinja's problem, not the user's - do not send them off
|
|
21
|
+
// regenerating login URLs that were never the issue.
|
|
22
|
+
expect(describeTokenExchangeFailure(500)).toBe('Unable to get token data. HTTP 500');
|
|
23
|
+
expect(describeTokenExchangeFailure(404)).toBe('Unable to get token data. HTTP 404');
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=login.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.test.js","sourceRoot":"","sources":["../src/login.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAA;AAEzD;;;;GAIG;AACH,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,OAAO,GAAG,4BAA4B,CAAC,GAAG,CAAC,CAAA;QACjD,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QACrC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAA;QAC7D,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAA;QACvD,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,4BAA4B,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAA;IACzF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,uEAAuE;QACvE,qDAAqD;QACrD,MAAM,CAAC,4BAA4B,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAA;QACpF,MAAM,CAAC,4BAA4B,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAA;IACtF,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@homebridge-plugins/homebridge-sharkiq",
|
|
3
3
|
"displayName": "SharkIQ Plugin",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"version": "1.6.
|
|
5
|
+
"version": "1.6.2-beta.0",
|
|
6
6
|
"description": "A Homebridge plugin to connect your Shark Vacuum to homebridge.",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "Bubba8291",
|