From 476df49454c2eb78eacd6e8f62ca97a5b68dd766 Mon Sep 17 00:00:00 2001 From: Christian Holbrook Date: Wed, 20 Nov 2024 14:42:18 -0700 Subject: [PATCH 1/4] Identify when a 577 error is thrown, send a new developer friendly message --- src/Errors.ts | 13 +++++++++++++ src/RokuDeploy.ts | 12 ++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/Errors.ts b/src/Errors.ts index e87ba2b..0ca24f4 100644 --- a/src/Errors.ts +++ b/src/Errors.ts @@ -55,3 +55,16 @@ export class MissingRequiredOptionError extends Error { Object.setPrototypeOf(this, MissingRequiredOptionError.prototype); } } + +export class DeviceFailedConnectionError extends Error { + results: any; + + constructor() { + super(); + this.message = `Your device needs to check for updates before accepting connections. Please navigate to System Settings and check for updates and then try again. + +https://support.roku.com/article/208755668.`; + this.results = { response: { statusCode: 577 } }; + Object.setPrototypeOf(this, DeviceFailedConnectionError.prototype); + } +} diff --git a/src/RokuDeploy.ts b/src/RokuDeploy.ts index 73392a9..e1482eb 100644 --- a/src/RokuDeploy.ts +++ b/src/RokuDeploy.ts @@ -468,8 +468,16 @@ export class RokuDeploy { if (this.isCompileError(replaceError.message) && options.failOnCompileError) { throw new errors.CompileError('Compile error', replaceError, replaceError.results); } else { - requestOptions.formData.mysubmit = 'Install'; - response = await this.doPostRequest(requestOptions); + try { + response = await this.doPostRequest(requestOptions); + } catch (installError: any) { + switch (installError.results.response.statusCode) { + case 577: + throw new errors.DeviceFailedConnectionError(); + default: + throw installError; + } + } } } From 98b765ac298528273f465f984ab819a1ef5d6bd8 Mon Sep 17 00:00:00 2001 From: Christian Holbrook Date: Thu, 21 Nov 2024 13:44:49 -0700 Subject: [PATCH 2/4] Add unit test to get 100% coverage. Testing the publish 577 response code --- src/RokuDeploy.spec.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/RokuDeploy.spec.ts b/src/RokuDeploy.spec.ts index 5dd4593..dfe03fc 100644 --- a/src/RokuDeploy.spec.ts +++ b/src/RokuDeploy.spec.ts @@ -1103,6 +1103,19 @@ describe('index', () => { }); }); + it('rejects when response contains invalid password status code', () => { + options.failOnCompileError = true; + mockDoPostRequest('', 577); + + return rokuDeploy.publish(options).then(() => { + assert.fail('Should not have succeeded due to roku server compilation failure'); + }, (err) => { + expect(err.message).to.be.a('string').and.satisfy(msg => msg.startsWith(`Your device needs to check for updates before accepting connections. Please navigate to System Settings and check for updates and then try again. + +https://support.roku.com/article/208755668.`)); + }); + }); + it('handles successful deploy', () => { options.failOnCompileError = true; mockDoPostRequest(); From 5a4912c35307a791cf4cdfb99b95dd5cf3e40928 Mon Sep 17 00:00:00 2001 From: Christian-Holbrook <118202694+Christian-Holbrook@users.noreply.github.com> Date: Sat, 23 Nov 2024 02:34:02 -0700 Subject: [PATCH 3/4] Update src/Errors.ts Co-authored-by: Bronley Plumb --- src/Errors.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Errors.ts b/src/Errors.ts index 0ca24f4..8a620e1 100644 --- a/src/Errors.ts +++ b/src/Errors.ts @@ -61,9 +61,7 @@ export class DeviceFailedConnectionError extends Error { constructor() { super(); - this.message = `Your device needs to check for updates before accepting connections. Please navigate to System Settings and check for updates and then try again. - -https://support.roku.com/article/208755668.`; + this.message = `Your device needs to check for updates before accepting connections. Please navigate to System Settings and check for updates and then try again.\n\nhttps://support.roku.com/article/208755668.`; this.results = { response: { statusCode: 577 } }; Object.setPrototypeOf(this, DeviceFailedConnectionError.prototype); } From e708071bcdbe9d58e630c61158b9283242e11e54 Mon Sep 17 00:00:00 2001 From: Christian Holbrook Date: Mon, 25 Nov 2024 17:42:32 -0700 Subject: [PATCH 4/4] Rename the 577 error to updateCheckRequiredError. Pass the underlying error as the cause so developers can trace back to the root cause of the error --- src/Errors.ts | 9 ++++++--- src/RokuDeploy.ts | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Errors.ts b/src/Errors.ts index 8a620e1..7f480aa 100644 --- a/src/Errors.ts +++ b/src/Errors.ts @@ -56,13 +56,16 @@ export class MissingRequiredOptionError extends Error { } } -export class DeviceFailedConnectionError extends Error { +export class UpdateCheckRequiredError extends Error { results: any; - constructor() { + cause: Error; + + constructor(originalError: Error) { super(); this.message = `Your device needs to check for updates before accepting connections. Please navigate to System Settings and check for updates and then try again.\n\nhttps://support.roku.com/article/208755668.`; this.results = { response: { statusCode: 577 } }; - Object.setPrototypeOf(this, DeviceFailedConnectionError.prototype); + this.cause = originalError; + Object.setPrototypeOf(this, UpdateCheckRequiredError.prototype); } } diff --git a/src/RokuDeploy.ts b/src/RokuDeploy.ts index e1482eb..7c3ccdd 100644 --- a/src/RokuDeploy.ts +++ b/src/RokuDeploy.ts @@ -473,7 +473,7 @@ export class RokuDeploy { } catch (installError: any) { switch (installError.results.response.statusCode) { case 577: - throw new errors.DeviceFailedConnectionError(); + throw new errors.UpdateCheckRequiredError(installError); default: throw installError; }