Skip to content

Commit 0a178ac

Browse files
committed
Parse server config Durations correctly
Applies to server config `browser.credential_timeout` No unit => x * 1000 (seconds assumed) ms => x s => x * 1000 m => x * 60 * 1000
1 parent ca77e94 commit 0a178ac

File tree

3 files changed

+38
-1
lines changed

3 files changed

+38
-1
lines changed

src/shared/modules/credentialsPolicy/credentialsPolicyDuck.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import { USER_INTERACTION } from 'shared/modules/userInteraction/userInteractionDuck'
2222
import { credentialsTimeout } from 'shared/modules/dbMeta/dbMetaDuck'
2323
import { disconnectAction, getActiveConnection } from 'shared/modules/connections/connectionsDuck'
24+
import { parseTimeMillis } from 'services/utils'
2425

2526
// Local variables (used in epics)
2627
let timer = null
@@ -29,7 +30,7 @@ let timer = null
2930
export const credentialsTimeoutEpic = (action$, store) =>
3031
action$.ofType(USER_INTERACTION)
3132
.do((action) => {
32-
const cTimeout = credentialsTimeout(store.getState())
33+
const cTimeout = parseTimeMillis(credentialsTimeout(store.getState()))
3334
if (!cTimeout) return clearTimeout(timer)
3435
clearTimeout(timer)
3536
timer = setTimeout(() => {

src/shared/services/utils.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,25 @@ export const canUseDOM = () => !!(
179179

180180
export const ecsapeCypherMetaItem = (str) => /^[A-Za-z][A-Za-z0-9_]*$/.test(str) ? str : '`' + str.replace(/`/g, '``') + '`'
181181

182+
export const parseTimeMillis = (timeWithOrWithoutUnit) => {
183+
timeWithOrWithoutUnit += '' // cast to string
184+
const readUnit = timeWithOrWithoutUnit.match(/\D+/)
185+
const value = parseInt(timeWithOrWithoutUnit)
186+
187+
const unit = (readUnit === undefined || readUnit === null) ? 's' : readUnit[0] // Assume seconds
188+
189+
switch (unit) {
190+
case 'ms':
191+
return value
192+
case 's':
193+
return value * 1000
194+
case 'm':
195+
return value * 60 * 1000
196+
default:
197+
return 0
198+
}
199+
}
200+
182201
export const stringifyMod = () => {
183202
const toString = Object.prototype.toString
184203
const isArray = Array.isArray || function (a) { return toString.call(a) === '[object Array]' }

src/shared/services/utils.test.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,23 @@ describe('utils', () => {
317317
expect(utils.stringifyMod()(t, modFn)).toEqual(expects[index])
318318
})
319319
})
320+
test('parseTimeMillis correctly parses human readable units correctly', () => {
321+
// Given
322+
const times = [
323+
{ test: '100', expect: 100 * 1000 },
324+
{ test: 100, expect: 100 * 1000 },
325+
{ test: '100ms', expect: 100 },
326+
{ test: '100s', expect: 100 * 1000 },
327+
{ test: '100m', expect: 100 * 60 * 1000 },
328+
{ test: '100x', expect: 0 },
329+
{ test: 'x', expect: 0 }
330+
]
331+
332+
// When & Then
333+
times.forEach((time) => {
334+
expect(utils.parseTimeMillis(time.test)).toEqual(time.expect)
335+
})
336+
})
320337
describe('ecsapeCypherMetaItem', () => {
321338
// Given
322339
const items = [

0 commit comments

Comments
 (0)