forked from LedgerHQ/ledger-live-desktop
-
Notifications
You must be signed in to change notification settings - Fork 0
/
experimental.js
102 lines (89 loc) · 2.56 KB
/
experimental.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// @flow
import { ipcRenderer } from 'electron'
import { setEnvUnsafe, isEnvDefault, changes, getAllEnvs } from '@ledgerhq/live-common/lib/env'
import type { EnvName } from '@ledgerhq/live-common/lib/env'
export type FeatureCommon = {
name: EnvName,
title: string,
description: string,
shadow?: boolean,
}
export type FeatureToggle = {
type: 'toggle',
valueOn?: any,
valueOff?: any,
}
export type Feature = FeatureCommon & FeatureToggle
export const experimentalFeatures: Feature[] = [
{
type: 'toggle',
name: 'MANAGER_DEV_MODE',
title: 'Developer mode',
description: 'Show developer and testnet apps in the Manager.',
},
{
type: 'toggle',
name: 'SCAN_FOR_INVALID_PATHS',
title: 'Extended account search',
description:
'Scan for accounts with erroneous derivation paths. Please send potentially found assets to a regular account.',
},
{
type: 'toggle',
name: 'EXPERIMENTAL_USB',
title: 'Experimental USB',
description:
'Alternative USB implementation that might help solve USB issues. Enabling this feature might create UI glitches.',
},
{
shadow: true,
type: 'toggle',
name: 'EXPERIMENTAL_EXPLORERS',
title: 'Experimental nodes',
description: "Connect to Ledger's new blockchain nodes.",
},
{
shadow: true,
type: 'toggle',
name: 'FORCE_PROVIDER',
valueOn: 4,
valueOff: 1,
title: 'Pre-release apps',
description: 'Enable pre-release apps in the Manager',
},
]
const lsKey = 'experimentalFlags'
export const getLocalStorageEnvs = () => {
const maybeData = window.localStorage.getItem(lsKey)
return maybeData ? JSON.parse(maybeData) : {}
}
const envs = getLocalStorageEnvs()
/* eslint-disable guard-for-in */
for (const k in envs) {
setEnvUnsafe(k, envs[k])
}
for (const k in process.env) {
setEnvUnsafe(k, process.env[k])
}
/* eslint-enable guard-for-in */
sendToMain()
function sendToMain() {
ipcRenderer.send('set-envs', getAllEnvs())
}
changes.subscribe(({ name, value }) => {
if (experimentalFeatures.find(f => f.name === name) && !isReadOnlyEnv(name)) {
setLocalStorageEnv(name, value)
}
})
export const enabledExperimentalFeatures = (): string[] =>
// $FlowFixMe
experimentalFeatures.map(e => e.name).filter(k => !isEnvDefault(k))
export const isReadOnlyEnv = (key: EnvName) => key in process.env
export const setLocalStorageEnv = (key: EnvName, val: string) => {
if (setEnvUnsafe(key, val)) {
const envs = getLocalStorageEnvs()
envs[key] = val
window.localStorage.setItem(lsKey, JSON.stringify(envs))
sendToMain()
}
}