1
1
import useSWR from 'swr' ;
2
- import { STORAGE_KEY_ENVVARS , STORAGE_KEY_LOCALSTACK , STORAGE_KEY_MOUNT } from '../../constants' ;
3
- import { ConfigData , DockerContainer , mountPointData , RunConfig } from '../../types' ;
2
+ import {
3
+ STORAGE_KEY_ENVVARS ,
4
+ STORAGE_KEY_LOCALSTACK ,
5
+ STORAGE_KEY_MOUNT ,
6
+ } from '../../constants' ;
7
+ import {
8
+ ConfigData ,
9
+ DockerContainer ,
10
+ mountPointData ,
11
+ RunConfig ,
12
+ } from '../../types' ;
4
13
import { isALocalStackContainer , isJson } from '../util' ;
5
14
import { useDDClient } from './utils' ;
6
15
7
16
interface useRunConfigsReturn {
8
- configData : ConfigData ,
9
- isLoading : boolean ,
17
+ configData : ConfigData ;
18
+ isLoading : boolean ;
10
19
setRunningConfig : ( data : string ) => unknown ;
11
20
createConfig : ( data : RunConfig ) => unknown ;
12
21
updateConfig : ( data : RunConfig ) => unknown ;
13
22
deleteConfig : ( data : string ) => unknown ;
14
23
}
15
24
16
- interface HTTPMessage {
17
- data : {
18
- Message : string ,
19
- } ,
20
- }
25
+ // This is what backend calls send in MacOS
26
+ type BaseMessage = {
27
+ Message : string ;
28
+ } ;
29
+
30
+ // This is what backend calls send on Linux
31
+ type LinuxMessage = {
32
+ data : BaseMessage ;
33
+ } ;
34
+
35
+ type HTTPMessage = LinuxMessage | BaseMessage ;
36
+
37
+ const isBaseMessage = ( msg : HTTPMessage ) : msg is BaseMessage => ( msg as BaseMessage ) . Message !== undefined ;
38
+
39
+ const resolveOSMessage = ( message : HTTPMessage | undefined ) : BaseMessage | undefined => {
40
+ if ( ! message ) return undefined ;
41
+ if ( isBaseMessage ( message ) ) return message ;
42
+ return message . data ;
43
+ } ;
21
44
22
45
const adaptVersionData = ( message : HTTPMessage , error : Error ) => {
23
- const newData = ( ! message || ! message . data ?. Message || error ) ?
24
- { configs : [ ] , runningConfig : null }
25
- :
26
- JSON . parse ( message . data ?. Message ) ;
46
+ const data = resolveOSMessage ( message ) ;
47
+ const newData =
48
+ ! data || ! data ?. Message || error
49
+ ? { configs : [ ] , runningConfig : null }
50
+ : JSON . parse ( data ?. Message ) ;
27
51
if ( Array . isArray ( newData ) ) {
28
52
return { configs : newData , runningConfig : newData . at ( 0 ) . id ?? null } ;
29
53
}
@@ -35,21 +59,27 @@ export const useRunConfigs = (): useRunConfigsReturn => {
35
59
const { client : ddClient } = useDDClient ( ) ;
36
60
const { data, mutate, isValidating, error } = useSWR (
37
61
cacheKey ,
38
- ( ) => ( ddClient . extension . vm . service . get ( '/configs' ) as Promise < HTTPMessage > ) ,
62
+ ( ) => ddClient . extension . vm . service . get ( '/configs' ) as Promise < HTTPMessage > ,
39
63
) ;
40
64
41
65
const updateConfig = async ( newData : RunConfig ) => {
42
- await ddClient . extension . vm . service . put ( '/configs' , { Data : JSON . stringify ( newData ) } ) ;
66
+ await ddClient . extension . vm . service . put ( '/configs' , {
67
+ Data : JSON . stringify ( newData ) ,
68
+ } ) ;
43
69
mutate ( ) ;
44
70
} ;
45
71
46
72
const setRunningConfig = async ( configId : string ) => {
47
- await ddClient . extension . vm . service . put ( '/configs/running' , { Data : JSON . stringify ( configId ) } ) ;
73
+ await ddClient . extension . vm . service . put ( '/configs/running' , {
74
+ Data : JSON . stringify ( configId ) ,
75
+ } ) ;
48
76
mutate ( ) ;
49
77
} ;
50
78
51
79
const createConfig = async ( newData : RunConfig ) => {
52
- await ddClient . extension . vm . service . post ( '/configs' , { Data : JSON . stringify ( newData ) } ) ;
80
+ await ddClient . extension . vm . service . post ( '/configs' , {
81
+ Data : JSON . stringify ( newData ) ,
82
+ } ) ;
53
83
mutate ( ) ;
54
84
} ;
55
85
@@ -58,7 +88,6 @@ export const useRunConfigs = (): useRunConfigsReturn => {
58
88
mutate ( ) ;
59
89
} ;
60
90
61
-
62
91
return {
63
92
configData : adaptVersionData ( data , error ) ,
64
93
isLoading : isValidating || ( ! error && ! data ) ,
@@ -70,12 +99,12 @@ export const useRunConfigs = (): useRunConfigsReturn => {
70
99
} ;
71
100
72
101
interface useMountPointReturn {
73
- user : string | null ,
74
- os : string | null ,
75
- showForm : boolean ,
76
- showSetupWarning : boolean ,
77
- hasSkippedConfiguration : boolean ,
78
- isLoading : boolean ,
102
+ user : string | null ;
103
+ os : string | null ;
104
+ showForm : boolean ;
105
+ showSetupWarning : boolean ;
106
+ hasSkippedConfiguration : boolean ;
107
+ isLoading : boolean ;
79
108
setMountPointData : ( data : mountPointData ) => void ;
80
109
}
81
110
@@ -85,30 +114,41 @@ export const useMountPoint = (): useMountPointReturn => {
85
114
86
115
const { data, mutate, isValidating, error } = useSWR (
87
116
cacheKey ,
88
- async ( ) => ( ddClient . extension . vm . service . get ( '/mount' ) as Promise < HTTPMessage > ) ,
117
+ async ( ) =>
118
+ ddClient . extension . vm . service . get ( '/mount' ) as Promise < HTTPMessage > ,
89
119
) ;
90
120
91
121
const setMountPointData = async ( data : mountPointData ) => {
92
- await ddClient . extension . vm . service . post ( '/mount' , { Data : JSON . stringify ( data ) } ) ;
122
+ await ddClient . extension . vm . service . post ( '/mount' , {
123
+ Data : JSON . stringify ( data ) ,
124
+ } ) ;
93
125
mutate ( ) ;
94
126
} ;
95
127
96
- const fileContent = ( ! error && data ) ? data . data . Message : null ;
97
- const mountPointData = isJson ( fileContent ) ? JSON . parse ( fileContent ) as mountPointData : null ;
128
+ const adaptedData = resolveOSMessage ( data ) ;
129
+
130
+ const fileContent = ! error && adaptedData ? adaptedData . Message : null ;
131
+ const mountPointData = isJson ( fileContent )
132
+ ? ( JSON . parse ( fileContent ) as mountPointData )
133
+ : null ;
98
134
99
135
return {
100
136
user : mountPointData ?. user ,
101
137
os : mountPointData ?. os ,
102
- showForm : mountPointData ?. showForm == null ? true : mountPointData ?. showForm ,
103
- showSetupWarning : mountPointData ?. showSetupWarning == null ? true : mountPointData ?. showSetupWarning ,
138
+ showForm :
139
+ mountPointData ?. showForm == null ? true : mountPointData ?. showForm ,
140
+ showSetupWarning :
141
+ mountPointData ?. showSetupWarning == null
142
+ ? true
143
+ : mountPointData ?. showSetupWarning ,
104
144
hasSkippedConfiguration : mountPointData ?. hasSkippedConfiguration || false ,
105
- isLoading : isValidating || ( ! error && ! data ) ,
145
+ isLoading : isValidating || ( ! error && ! adaptedData ) ,
106
146
setMountPointData,
107
147
} ;
108
148
} ;
109
149
110
150
interface useLocalStackReturn {
111
- data : DockerContainer | null ,
151
+ data : DockerContainer | null ;
112
152
mutate : ( ) => void ;
113
153
}
114
154
@@ -118,15 +158,21 @@ export const useLocalStack = (): useLocalStackReturn => {
118
158
119
159
const { data, mutate } = useSWR (
120
160
cacheKey ,
121
- async ( ) => ( await ddClient . docker . listContainers ( ) as [ DockerContainer ] )
122
- . find ( container =>
123
- isALocalStackContainer ( container ) && container . Command !== 'bin/localstack update docker-images' ,
124
- ) , {
125
- refreshInterval : 2000 , compare :
126
- /*
127
- * compares whether the old (b) status aligns with that of new (a) status
128
- */
129
- ( a , b ) => a ?. Id === b ?. Id && a ?. Status . includes ( 'unhealthy' ) === b ?. Status . includes ( 'unhealthy' ) ,
161
+ async ( ) =>
162
+ ( ( await ddClient . docker . listContainers ( ) ) as [ DockerContainer ] ) . find (
163
+ ( container ) =>
164
+ isALocalStackContainer ( container ) &&
165
+ container . Command !== 'bin/localstack update docker-images' ,
166
+ ) ,
167
+ {
168
+ refreshInterval : 2000 ,
169
+ compare :
170
+ /*
171
+ * compares whether the old (b) status aligns with that of new (a) status
172
+ */
173
+ ( a , b ) =>
174
+ a ?. Id === b ?. Id &&
175
+ a ?. Status . includes ( 'unhealthy' ) === b ?. Status . includes ( 'unhealthy' ) ,
130
176
} ,
131
177
) ;
132
178
0 commit comments