@@ -5,6 +5,7 @@ import * as url from "url";
5
5
import * as vscode from "vscode" ;
6
6
import * as Cache from "vscode-cache" ;
7
7
import {
8
+ getResolvedConnectionSpec ,
8
9
config ,
9
10
extensionContext ,
10
11
FILESYSTEM_SCHEMA ,
@@ -39,6 +40,9 @@ export class AtelierAPI {
39
40
// when FileSystemProvider used
40
41
public externalServer = false ;
41
42
43
+ // record of the constructor argument
44
+ public readonly wsOrFile ?: string | vscode . Uri ;
45
+
42
46
public get ns ( ) : string {
43
47
return this . namespace || this . _config . ns ;
44
48
}
@@ -81,9 +85,12 @@ export class AtelierAPI {
81
85
return filename ;
82
86
}
83
87
84
- public constructor ( wsOrFile ?: string | vscode . Uri ) {
88
+ public constructor ( wsOrFile ?: string | vscode . Uri , retryAfter401 = true ) {
89
+ if ( retryAfter401 ) {
90
+ this . wsOrFile = wsOrFile ;
91
+ }
85
92
let workspaceFolderName = "" ;
86
- let namespace ;
93
+ let namespace = "" ;
87
94
if ( wsOrFile ) {
88
95
if ( wsOrFile instanceof vscode . Uri ) {
89
96
if ( wsOrFile . scheme === FILESYSTEM_SCHEMA || wsOrFile . scheme === FILESYSTEM_READONLY_SCHEMA ) {
@@ -147,24 +154,23 @@ export class AtelierAPI {
147
154
}
148
155
149
156
private setConnection ( workspaceFolderName : string , namespace ?: string ) : void {
150
- let serverName ;
151
157
this . configName = workspaceFolderName ;
152
- if ( config ( "intersystems.servers" ) . has ( workspaceFolderName . toLowerCase ( ) ) ) {
153
- this . externalServer = true ;
154
- serverName = workspaceFolderName . toLowerCase ( ) ;
155
- workspaceFolderName = currentWorkspaceFolder ( ) ;
156
- }
157
158
const conn = config ( "conn" , workspaceFolderName ) ;
158
- if ( ! serverName && conn . server ) {
159
+ let serverName = workspaceFolderName . toLowerCase ( ) ;
160
+ if ( config ( "intersystems.servers" ) . has ( serverName ) ) {
161
+ this . externalServer = true ;
162
+ } else if ( conn . server ) {
159
163
serverName = conn . server ;
164
+ } else {
165
+ serverName = "" ;
160
166
}
161
167
162
168
if ( serverName && serverName . length ) {
163
169
const {
164
170
webServer : { scheme, host, port, pathPrefix = "" } ,
165
171
username,
166
172
password,
167
- } = config ( "intersystems.servers" , workspaceFolderName ) . get ( serverName ) ;
173
+ } = getResolvedConnectionSpec ( serverName , config ( "intersystems.servers" , workspaceFolderName ) . get ( serverName ) ) ;
168
174
this . _config = {
169
175
active : this . externalServer || conn . active ,
170
176
apiVersion : 1 ,
@@ -176,6 +182,13 @@ export class AtelierAPI {
176
182
password,
177
183
pathPrefix,
178
184
} ;
185
+
186
+ // Report server as inactive when no namespace has been determined,
187
+ // otherwise output channel reports the issue.
188
+ // This arises when a server-only workspace is editing the user's settings.json, or the .code-workspace file.
189
+ if ( this . _config . ns === "" && this . externalServer ) {
190
+ this . _config . active = false ;
191
+ }
179
192
} else {
180
193
this . _config = conn ;
181
194
}
@@ -201,10 +214,6 @@ export class AtelierAPI {
201
214
if ( ! active ) {
202
215
return Promise . reject ( ) ;
203
216
}
204
- if ( ! username || ! username . length || ! password || ! password . length ) {
205
- outputChannel . appendLine ( "username and password fields in settings are mandatory." ) ;
206
- return Promise . reject ( ) ;
207
- }
208
217
if ( minVersion > apiVersion ) {
209
218
return Promise . reject ( `${ path } not supported by API version ${ apiVersion } ` ) ;
210
219
}
@@ -318,6 +327,10 @@ export class AtelierAPI {
318
327
workspaceState . update ( this . configName + ":host" , undefined ) ;
319
328
workspaceState . update ( this . configName + ":port" , undefined ) ;
320
329
setTimeout ( checkConnection , 30000 ) ;
330
+ } else if ( error . statusCode === 401 && this . wsOrFile ) {
331
+ setTimeout ( ( ) => {
332
+ checkConnection ( true , typeof this . wsOrFile === "object" ? this . wsOrFile : undefined ) ;
333
+ } , 1000 ) ;
321
334
}
322
335
console . error ( error ) ;
323
336
throw error ;
0 commit comments