Skip to content

Commit 6719e4a

Browse files
committed
fix(homebridge): keep refreshToken up to date in config.json
#109
1 parent dd48775 commit 6719e4a

File tree

5 files changed

+49
-17
lines changed

5 files changed

+49
-17
lines changed

api/api.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export interface RingApiOptions {
2222

2323
export class RingApi {
2424
public readonly restClient = new RingRestClient(this.options)
25+
public readonly onRefreshTokenUpdated = this.restClient.onRefreshTokenUpdated.asObservable()
2526

2627
private locations = this.fetchAndBuildLocations()
2728

api/rest-client.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import axios, { AxiosRequestConfig, ResponseType } from 'axios'
22
import { delay, generateRandomId, logError, logInfo, stringify } from './util'
33
import * as querystring from 'querystring'
44
import { AuthTokenResponse, SessionResponse } from './ring-types'
5+
import { ReplaySubject } from 'rxjs'
56

67
const ringErrorCodes: { [code: number]: string } = {
78
7050: 'NO_ASSET',
@@ -68,6 +69,10 @@ export class RingRestClient {
6869
private authPromise = this.getAuth()
6970
private sessionPromise = this.getSession()
7071
public using2fa = false
72+
public onRefreshTokenUpdated = new ReplaySubject<{
73+
oldRefreshToken?: string
74+
newRefreshToken: string
75+
}>(1)
7176

7277
constructor(private authOptions: RingAuth) {}
7378

@@ -113,6 +118,10 @@ export class RingRestClient {
113118
}
114119
})
115120

121+
this.onRefreshTokenUpdated.next({
122+
oldRefreshToken: this.refreshToken,
123+
newRefreshToken: response.refresh_token
124+
})
116125
this.refreshToken = response.refresh_token
117126

118127
return response

homebridge/config.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { RingApiOptions } from '../api'
2+
import { readFileSync, writeFileSync } from 'fs'
23

34
export interface RingPlatformConfig extends RingApiOptions {
45
alarmOnEntryDelay?: boolean
@@ -10,3 +11,19 @@ export interface RingPlatformConfig extends RingApiOptions {
1011
hideAlarmSirenSwitch?: boolean
1112
showPanicButtons?: boolean
1213
}
14+
15+
export function updateHomebridgeConfig(
16+
homebridge: any,
17+
update: (config: string) => string
18+
) {
19+
const configPath = homebridge.user.configPath(),
20+
config = readFileSync(configPath).toString(),
21+
updatedConfig = update(config)
22+
23+
if (config !== updatedConfig) {
24+
writeFileSync(configPath, updatedConfig)
25+
return true
26+
}
27+
28+
return false
29+
}

homebridge/index.ts

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@ import { hap } from './hap'
33
import { readFileSync, writeFileSync } from 'fs'
44
import { join as joinPath } from 'path'
55
import {
6-
platformName,
7-
pluginName,
86
oldPlatformName,
9-
oldPluginName
7+
oldPluginName,
8+
platformName,
9+
pluginName
1010
} from './plugin-info'
1111
import { logError } from '../api/util'
12+
import { updateHomebridgeConfig } from './config'
1213

1314
export default function(homebridge: any) {
1415
hap.PlatformAccessory = homebridge.platformAccessory
@@ -29,25 +30,17 @@ export default function(homebridge: any) {
2930
cachedAccessories = readFileSync(cachedAccessoriesPath).toString(),
3031
updatedAccessories = cachedAccessories
3132
.replace(new RegExp(oldPluginName, 'g'), pluginName)
32-
.replace(new RegExp(oldPlatformName, 'g'), platformName),
33-
configPath = homebridge.user.configPath(),
34-
config = readFileSync(configPath).toString(),
35-
updatedConfig = config.replace(
36-
`"${oldPlatformName}"`,
37-
`"${platformName}"`
38-
)
39-
let filesChanged = false
33+
.replace(new RegExp(oldPlatformName, 'g'), platformName)
34+
35+
let filesChanged = updateHomebridgeConfig(homebridge, config => {
36+
return config.replace(`"${oldPlatformName}"`, `"${platformName}"`)
37+
})
4038

4139
if (cachedAccessories !== updatedAccessories) {
4240
writeFileSync(cachedAccessoriesPath, updatedAccessories)
4341
filesChanged = true
4442
}
4543

46-
if (config !== updatedConfig) {
47-
writeFileSync(configPath, updatedConfig)
48-
filesChanged = true
49-
}
50-
5144
if (filesChanged) {
5245
logError(
5346
'Your Ring Alarm config has been updated to new Ring config. This is a one time thing, and you do not need to do anything. Just restart homebridge and everything should start normally.'

homebridge/ring-platform.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { Lock } from './lock'
1515
import { SmokeAlarm } from './smoke-alarm'
1616
import { CoAlarm } from './co-alarm'
1717
import { SmokeCoListener } from './smoke-co-listener'
18-
import { RingPlatformConfig } from './config'
18+
import { RingPlatformConfig, updateHomebridgeConfig } from './config'
1919
import { Beam } from './beam'
2020
import { MultiLevelSwitch } from './multi-level-switch'
2121
import { Fan } from './fan'
@@ -241,5 +241,17 @@ export class RingPlatform {
241241
staleAccessories
242242
)
243243
}
244+
245+
ringApi.onRefreshTokenUpdated.subscribe(
246+
({ oldRefreshToken, newRefreshToken }) => {
247+
if (!oldRefreshToken) {
248+
return
249+
}
250+
251+
updateHomebridgeConfig(this.api, config => {
252+
return config.replace(oldRefreshToken, newRefreshToken)
253+
})
254+
}
255+
)
244256
}
245257
}

0 commit comments

Comments
 (0)