@codingame/monaco-vscode-extensions-service-override 25.1.1 → 26.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +7 -0
- package/package.json +3 -3
- package/vscode/src/vs/base/common/console.js +24 -15
- package/vscode/src/vs/platform/extensionManagement/common/extensionManagementCLI.d.ts +4 -1
- package/vscode/src/vs/platform/extensionManagement/common/extensionManagementCLI.js +149 -84
- package/vscode/src/vs/platform/extensionResourceLoader/browser/extensionResourceLoaderService.js +20 -12
- package/vscode/src/vs/platform/extensionResourceLoader/common/extensionResourceLoader.js +38 -21
- package/vscode/src/vs/platform/remote/common/managedSocket.js +7 -10
- package/vscode/src/vs/workbench/api/browser/mainThreadAiEmbeddingVector.js +5 -2
- package/vscode/src/vs/workbench/api/browser/mainThreadAiRelatedInformation.js +5 -2
- package/vscode/src/vs/workbench/api/browser/mainThreadAiSettingsSearch.js +4 -1
- package/vscode/src/vs/workbench/api/browser/mainThreadAuthentication.js +200 -143
- package/vscode/src/vs/workbench/api/browser/mainThreadBulkEdits.js +10 -14
- package/vscode/src/vs/workbench/api/browser/mainThreadCLICommands.js +41 -31
- package/vscode/src/vs/workbench/api/browser/mainThreadChatAgents2.d.ts +9 -12
- package/vscode/src/vs/workbench/api/browser/mainThreadChatAgents2.js +168 -115
- package/vscode/src/vs/workbench/api/browser/mainThreadChatCodeMapper.js +11 -13
- package/vscode/src/vs/workbench/api/browser/mainThreadChatContext.d.ts +5 -5
- package/vscode/src/vs/workbench/api/browser/mainThreadChatContext.js +42 -15
- package/vscode/src/vs/workbench/api/browser/mainThreadChatOutputRenderer.js +8 -7
- package/vscode/src/vs/workbench/api/browser/mainThreadChatSessions.d.ts +4 -2
- package/vscode/src/vs/workbench/api/browser/mainThreadChatSessions.js +170 -99
- package/vscode/src/vs/workbench/api/browser/mainThreadChatStatus.js +2 -5
- package/vscode/src/vs/workbench/api/browser/mainThreadClipboard.js +4 -9
- package/vscode/src/vs/workbench/api/browser/mainThreadCodeInsets.js +13 -12
- package/vscode/src/vs/workbench/api/browser/mainThreadCommands.js +16 -19
- package/vscode/src/vs/workbench/api/browser/mainThreadComments.js +127 -70
- package/vscode/src/vs/workbench/api/browser/mainThreadConfiguration.js +80 -26
- package/vscode/src/vs/workbench/api/browser/mainThreadConsole.js +5 -11
- package/vscode/src/vs/workbench/api/browser/mainThreadCustomEditors.js +199 -97
- package/vscode/src/vs/workbench/api/browser/mainThreadDataChannels.js +1 -4
- package/vscode/src/vs/workbench/api/browser/mainThreadDebugService.js +88 -73
- package/vscode/src/vs/workbench/api/browser/mainThreadDecorations.js +5 -5
- package/vscode/src/vs/workbench/api/browser/mainThreadDiagnostics.js +16 -12
- package/vscode/src/vs/workbench/api/browser/mainThreadDialogs.js +10 -8
- package/vscode/src/vs/workbench/api/browser/mainThreadDocumentContentProviders.js +14 -6
- package/vscode/src/vs/workbench/api/browser/mainThreadDocuments.js +52 -37
- package/vscode/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.js +78 -58
- package/vscode/src/vs/workbench/api/browser/mainThreadEditSessionIdentityParticipant.js +5 -7
- package/vscode/src/vs/workbench/api/browser/mainThreadEditor.js +75 -63
- package/vscode/src/vs/workbench/api/browser/mainThreadEditorTabs.js +99 -91
- package/vscode/src/vs/workbench/api/browser/mainThreadEditors.js +93 -55
- package/vscode/src/vs/workbench/api/browser/mainThreadEmbeddings.js +3 -7
- package/vscode/src/vs/workbench/api/browser/mainThreadExtensionService.js +85 -60
- package/vscode/src/vs/workbench/api/browser/mainThreadFileSystem.js +49 -45
- package/vscode/src/vs/workbench/api/browser/mainThreadFileSystemEventService.js +114 -72
- package/vscode/src/vs/workbench/api/browser/mainThreadInteractive.js +4 -7
- package/vscode/src/vs/workbench/api/browser/mainThreadLabelService.js +1 -4
- package/vscode/src/vs/workbench/api/browser/mainThreadLanguageFeatures.d.ts +2 -2
- package/vscode/src/vs/workbench/api/browser/mainThreadLanguageFeatures.js +381 -238
- package/vscode/src/vs/workbench/api/browser/mainThreadLanguageModelTools.d.ts +7 -3
- package/vscode/src/vs/workbench/api/browser/mainThreadLanguageModelTools.js +90 -13
- package/vscode/src/vs/workbench/api/browser/mainThreadLanguageModels.js +81 -58
- package/vscode/src/vs/workbench/api/browser/mainThreadLanguages.js +9 -10
- package/vscode/src/vs/workbench/api/browser/mainThreadLocalization.js +2 -7
- package/vscode/src/vs/workbench/api/browser/mainThreadLogService.js +6 -10
- package/vscode/src/vs/workbench/api/browser/mainThreadManagedSockets.js +12 -10
- package/vscode/src/vs/workbench/api/browser/mainThreadMcp.d.ts +3 -2
- package/vscode/src/vs/workbench/api/browser/mainThreadMcp.js +162 -97
- package/vscode/src/vs/workbench/api/browser/mainThreadMessageService.js +32 -26
- package/vscode/src/vs/workbench/api/browser/mainThreadNotebook.js +38 -32
- package/vscode/src/vs/workbench/api/browser/mainThreadNotebookDocuments.js +48 -46
- package/vscode/src/vs/workbench/api/browser/mainThreadNotebookDocumentsAndEditors.js +22 -18
- package/vscode/src/vs/workbench/api/browser/mainThreadNotebookDto.js +5 -8
- package/vscode/src/vs/workbench/api/browser/mainThreadNotebookEditors.js +35 -21
- package/vscode/src/vs/workbench/api/browser/mainThreadNotebookKernels.js +31 -28
- package/vscode/src/vs/workbench/api/browser/mainThreadNotebookSaveParticipant.js +5 -7
- package/vscode/src/vs/workbench/api/browser/mainThreadOutputService.js +47 -23
- package/vscode/src/vs/workbench/api/browser/mainThreadProfileContentHandlers.js +15 -12
- package/vscode/src/vs/workbench/api/browser/mainThreadProgress.js +17 -18
- package/vscode/src/vs/workbench/api/browser/mainThreadQuickDiff.js +6 -7
- package/vscode/src/vs/workbench/api/browser/mainThreadQuickOpen.js +83 -66
- package/vscode/src/vs/workbench/api/browser/mainThreadRemoteConnectionData.js +1 -5
- package/vscode/src/vs/workbench/api/browser/mainThreadSCM.js +250 -92
- package/vscode/src/vs/workbench/api/browser/mainThreadSaveParticipant.js +6 -8
- package/vscode/src/vs/workbench/api/browser/mainThreadSearch.js +37 -26
- package/vscode/src/vs/workbench/api/browser/mainThreadSecretState.js +34 -21
- package/vscode/src/vs/workbench/api/browser/mainThreadShare.js +3 -6
- package/vscode/src/vs/workbench/api/browser/mainThreadSpeech.js +19 -14
- package/vscode/src/vs/workbench/api/browser/mainThreadStatusBar.js +41 -16
- package/vscode/src/vs/workbench/api/browser/mainThreadStorage.js +18 -17
- package/vscode/src/vs/workbench/api/browser/mainThreadTask.js +145 -145
- package/vscode/src/vs/workbench/api/browser/mainThreadTelemetry.js +19 -11
- package/vscode/src/vs/workbench/api/browser/mainThreadTerminalService.js +176 -80
- package/vscode/src/vs/workbench/api/browser/mainThreadTerminalShellIntegration.js +52 -21
- package/vscode/src/vs/workbench/api/browser/mainThreadTesting.js +26 -24
- package/vscode/src/vs/workbench/api/browser/mainThreadTheming.js +1 -4
- package/vscode/src/vs/workbench/api/browser/mainThreadTimeline.js +5 -8
- package/vscode/src/vs/workbench/api/browser/mainThreadTreeViews.d.ts +4 -1
- package/vscode/src/vs/workbench/api/browser/mainThreadTreeViews.js +106 -46
- package/vscode/src/vs/workbench/api/browser/mainThreadTunnelService.js +83 -65
- package/vscode/src/vs/workbench/api/browser/mainThreadUriOpeners.js +20 -20
- package/vscode/src/vs/workbench/api/browser/mainThreadUrls.js +14 -9
- package/vscode/src/vs/workbench/api/browser/mainThreadWebviewManager.js +17 -9
- package/vscode/src/vs/workbench/api/browser/mainThreadWebviewPanels.js +49 -38
- package/vscode/src/vs/workbench/api/browser/mainThreadWebviewViews.js +10 -13
- package/vscode/src/vs/workbench/api/browser/mainThreadWebviews.js +38 -27
- package/vscode/src/vs/workbench/api/browser/mainThreadWindow.js +5 -11
- package/vscode/src/vs/workbench/api/browser/mainThreadWorkspace.d.ts +4 -1
- package/vscode/src/vs/workbench/api/browser/mainThreadWorkspace.js +73 -43
- package/vscode/src/vs/workbench/api/common/shared/dataTransferCache.js +2 -2
- package/vscode/src/vs/workbench/contrib/customEditor/common/customTextEditorModel.js +17 -10
- package/vscode/src/vs/workbench/contrib/externalUriOpener/common/contributedOpeners.js +17 -11
- package/vscode/src/vs/workbench/services/extensionManagement/browser/extensionBisect.js +107 -80
- package/vscode/src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.js +336 -175
- package/vscode/src/vs/workbench/services/extensions/browser/extensionService.js +126 -71
- package/vscode/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.js +76 -54
- package/vscode/src/vs/workbench/services/extensions/browser/webWorkerFileSystemProvider.js +1 -2
- package/vscode/src/vs/workbench/services/extensions/common/abstractExtensionService.d.ts +2 -0
- package/vscode/src/vs/workbench/services/extensions/common/abstractExtensionService.js +343 -192
- package/vscode/src/vs/workbench/services/extensions/common/extHostCustomers.js +5 -3
- package/vscode/src/vs/workbench/services/extensions/common/extensionHostManager.d.ts +0 -1
- package/vscode/src/vs/workbench/services/extensions/common/extensionHostManager.js +75 -68
- package/vscode/src/vs/workbench/services/extensions/common/extensionRunningLocationTracker.js +135 -36
- package/vscode/src/vs/workbench/services/extensions/common/extensionsProposedApi.js +22 -18
- package/vscode/src/vs/workbench/services/extensions/common/extensionsUtil.js +14 -12
- package/vscode/src/vs/workbench/services/extensions/common/lazyCreateExtensionHostManager.js +21 -9
- package/vscode/src/vs/workbench/services/extensions/common/remoteExtensionHost.js +48 -25
- package/vscode/src/vs/workbench/services/themes/browser/cssExtensionPoint.d.ts +24 -0
- package/vscode/src/vs/workbench/services/themes/browser/cssExtensionPoint.js +300 -0
|
@@ -29,7 +29,15 @@ import { IQuickInputService } from '@codingame/monaco-vscode-api/vscode/vs/platf
|
|
|
29
29
|
import { IProductService } from '@codingame/monaco-vscode-api/vscode/vs/platform/product/common/productService.service';
|
|
30
30
|
|
|
31
31
|
class MainThreadAuthenticationProvider extends Disposable {
|
|
32
|
-
constructor(
|
|
32
|
+
constructor(
|
|
33
|
+
_proxy,
|
|
34
|
+
id,
|
|
35
|
+
label,
|
|
36
|
+
supportsMultipleAccounts,
|
|
37
|
+
authorizationServers,
|
|
38
|
+
resourceServer,
|
|
39
|
+
onDidChangeSessionsEmitter
|
|
40
|
+
) {
|
|
33
41
|
super();
|
|
34
42
|
this._proxy = _proxy;
|
|
35
43
|
this.id = id;
|
|
@@ -50,8 +58,24 @@ class MainThreadAuthenticationProvider extends Disposable {
|
|
|
50
58
|
}
|
|
51
59
|
}
|
|
52
60
|
class MainThreadAuthenticationProviderWithChallenges extends MainThreadAuthenticationProvider {
|
|
53
|
-
constructor(
|
|
54
|
-
|
|
61
|
+
constructor(
|
|
62
|
+
proxy,
|
|
63
|
+
id,
|
|
64
|
+
label,
|
|
65
|
+
supportsMultipleAccounts,
|
|
66
|
+
authorizationServers,
|
|
67
|
+
resourceServer,
|
|
68
|
+
onDidChangeSessionsEmitter
|
|
69
|
+
) {
|
|
70
|
+
super(
|
|
71
|
+
proxy,
|
|
72
|
+
id,
|
|
73
|
+
label,
|
|
74
|
+
supportsMultipleAccounts,
|
|
75
|
+
authorizationServers,
|
|
76
|
+
resourceServer,
|
|
77
|
+
onDidChangeSessionsEmitter
|
|
78
|
+
);
|
|
55
79
|
}
|
|
56
80
|
getSessionsFromChallenges(constraint, options) {
|
|
57
81
|
return this._proxy.$getSessionsFromChallenges(this.id, constraint, options);
|
|
@@ -61,7 +85,24 @@ class MainThreadAuthenticationProviderWithChallenges extends MainThreadAuthentic
|
|
|
61
85
|
}
|
|
62
86
|
}
|
|
63
87
|
let MainThreadAuthentication = class MainThreadAuthentication extends Disposable {
|
|
64
|
-
constructor(
|
|
88
|
+
constructor(
|
|
89
|
+
extHostContext,
|
|
90
|
+
productService,
|
|
91
|
+
authenticationService,
|
|
92
|
+
authenticationExtensionsService,
|
|
93
|
+
authenticationAccessService,
|
|
94
|
+
authenticationUsageService,
|
|
95
|
+
dialogService,
|
|
96
|
+
notificationService,
|
|
97
|
+
extensionService,
|
|
98
|
+
telemetryService,
|
|
99
|
+
openerService,
|
|
100
|
+
logService,
|
|
101
|
+
urlService,
|
|
102
|
+
dynamicAuthProviderStorageService,
|
|
103
|
+
clipboardService,
|
|
104
|
+
quickInputService
|
|
105
|
+
) {
|
|
65
106
|
super();
|
|
66
107
|
this.productService = productService;
|
|
67
108
|
this.authenticationService = authenticationService;
|
|
@@ -83,7 +124,9 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
|
|
|
83
124
|
this._suppressUnregisterEvent = false;
|
|
84
125
|
this._sentClientIdUsageEvents = ( new Set());
|
|
85
126
|
this._proxy = ( extHostContext.getProxy(ExtHostContext.ExtHostAuthentication));
|
|
86
|
-
this._register(
|
|
127
|
+
this._register(
|
|
128
|
+
this.authenticationService.onDidChangeSessions(e => this._proxy.$onDidChangeAuthenticationSessions(e.providerId, e.label))
|
|
129
|
+
);
|
|
87
130
|
this._register(this.authenticationService.onDidUnregisterAuthenticationProvider(e => {
|
|
88
131
|
if (!this._suppressUnregisterEvent) {
|
|
89
132
|
this._proxy.$onDidUnregisterAuthenticationProvider(e.id);
|
|
@@ -106,24 +149,42 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
|
|
|
106
149
|
let initialTokens = undefined;
|
|
107
150
|
if (clientId) {
|
|
108
151
|
initialTokens = await this.dynamicAuthProviderStorageService.getSessionsForDynamicAuthProvider(authProviderId, clientId);
|
|
109
|
-
}
|
|
110
|
-
else if (serverMetadata.client_id_metadata_document_supported) {
|
|
152
|
+
} else if (serverMetadata.client_id_metadata_document_supported) {
|
|
111
153
|
clientId = this.productService.authClientIdMetadataUrl;
|
|
112
154
|
}
|
|
113
|
-
return await this._proxy.$registerDynamicAuthProvider(
|
|
155
|
+
return await this._proxy.$registerDynamicAuthProvider(
|
|
156
|
+
authorizationServer,
|
|
157
|
+
serverMetadata,
|
|
158
|
+
resource,
|
|
159
|
+
clientId,
|
|
160
|
+
clientSecret,
|
|
161
|
+
initialTokens
|
|
162
|
+
);
|
|
114
163
|
}
|
|
115
164
|
}));
|
|
116
165
|
}
|
|
117
|
-
async $registerAuthenticationProvider(
|
|
166
|
+
async $registerAuthenticationProvider(
|
|
167
|
+
{
|
|
168
|
+
id,
|
|
169
|
+
label,
|
|
170
|
+
supportsMultipleAccounts,
|
|
171
|
+
resourceServer,
|
|
172
|
+
supportedAuthorizationServers,
|
|
173
|
+
supportsChallenges
|
|
174
|
+
}
|
|
175
|
+
) {
|
|
118
176
|
if (!this.authenticationService.declaredProviders.find(p => p.id === id)) {
|
|
119
|
-
this.logService.warn(
|
|
120
|
-
|
|
177
|
+
this.logService.warn(
|
|
178
|
+
`Authentication provider ${id} was not declared in the Extension Manifest.`
|
|
179
|
+
);
|
|
180
|
+
this.telemetryService.publicLog2("authentication.providerNotDeclared", {
|
|
181
|
+
id
|
|
182
|
+
});
|
|
121
183
|
}
|
|
122
184
|
const emitter = ( new Emitter());
|
|
123
185
|
this._registrations.set(id, emitter);
|
|
124
186
|
const supportedAuthorizationServerUris = ( (supportedAuthorizationServers ?? []).map(i => URI.revive(i)));
|
|
125
|
-
const provider = supportsChallenges
|
|
126
|
-
? ( new MainThreadAuthenticationProviderWithChallenges(
|
|
187
|
+
const provider = supportsChallenges ? ( new MainThreadAuthenticationProviderWithChallenges(
|
|
127
188
|
this._proxy,
|
|
128
189
|
id,
|
|
129
190
|
label,
|
|
@@ -131,8 +192,7 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
|
|
|
131
192
|
supportedAuthorizationServerUris,
|
|
132
193
|
resourceServer ? URI.revive(resourceServer) : undefined,
|
|
133
194
|
emitter
|
|
134
|
-
))
|
|
135
|
-
: ( new MainThreadAuthenticationProvider(
|
|
195
|
+
)) : ( new MainThreadAuthenticationProvider(
|
|
136
196
|
this._proxy,
|
|
137
197
|
id,
|
|
138
198
|
label,
|
|
@@ -148,8 +208,7 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
|
|
|
148
208
|
this._suppressUnregisterEvent = true;
|
|
149
209
|
try {
|
|
150
210
|
this.authenticationService.unregisterAuthenticationProvider(id);
|
|
151
|
-
}
|
|
152
|
-
finally {
|
|
211
|
+
} finally {
|
|
153
212
|
this._suppressUnregisterEvent = false;
|
|
154
213
|
}
|
|
155
214
|
}
|
|
@@ -170,7 +229,7 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
|
|
|
170
229
|
async $waitForUriHandler(expectedUri) {
|
|
171
230
|
const deferredPromise = ( new DeferredPromise());
|
|
172
231
|
const disposable = this.urlService.registerHandler({
|
|
173
|
-
handleURL: async
|
|
232
|
+
handleURL: async uri => {
|
|
174
233
|
if (uri.scheme !== expectedUri.scheme || uri.authority !== expectedUri.authority || uri.path !== expectedUri.path) {
|
|
175
234
|
return false;
|
|
176
235
|
}
|
|
@@ -181,22 +240,22 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
|
|
|
181
240
|
});
|
|
182
241
|
const result = await raceTimeout(deferredPromise.p, 5 * 60 * 1000);
|
|
183
242
|
if (!result) {
|
|
184
|
-
throw ( new Error(
|
|
243
|
+
throw ( new Error("Timed out waiting for URI handler"));
|
|
185
244
|
}
|
|
186
245
|
return await deferredPromise.p;
|
|
187
246
|
}
|
|
188
247
|
$showContinueNotification(message) {
|
|
189
|
-
const yes = ( localize(
|
|
190
|
-
const no = ( localize(
|
|
248
|
+
const yes = ( localize(2475, "Yes"));
|
|
249
|
+
const no = ( localize(2476, "No"));
|
|
191
250
|
const deferredPromise = ( new DeferredPromise());
|
|
192
251
|
let result = false;
|
|
193
252
|
const handle = this.notificationService.prompt(Severity.Warning, message, [{
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
253
|
+
label: yes,
|
|
254
|
+
run: () => result = true
|
|
255
|
+
}, {
|
|
256
|
+
label: no,
|
|
257
|
+
run: () => result = false
|
|
258
|
+
}]);
|
|
200
259
|
const disposable = handle.onDidClose(() => {
|
|
201
260
|
deferredPromise.complete(result);
|
|
202
261
|
disposable.dispose();
|
|
@@ -209,15 +268,25 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
|
|
|
209
268
|
label: details.label,
|
|
210
269
|
supportsMultipleAccounts: true,
|
|
211
270
|
supportedAuthorizationServers: [details.authorizationServer],
|
|
212
|
-
resourceServer: details.resourceServer
|
|
271
|
+
resourceServer: details.resourceServer
|
|
213
272
|
});
|
|
214
273
|
await this.dynamicAuthProviderStorageService.storeClientRegistration(details.id, ( URI.revive(details.authorizationServer).toString(true)), details.clientId, details.clientSecret, details.label);
|
|
215
274
|
}
|
|
216
275
|
async $setSessionsForDynamicAuthProvider(authProviderId, clientId, sessions) {
|
|
217
276
|
await this.dynamicAuthProviderStorageService.setSessionsForDynamicAuthProvider(authProviderId, clientId, sessions);
|
|
218
277
|
}
|
|
219
|
-
async $sendDidChangeDynamicProviderInfo(
|
|
220
|
-
|
|
278
|
+
async $sendDidChangeDynamicProviderInfo(
|
|
279
|
+
{
|
|
280
|
+
providerId,
|
|
281
|
+
clientId,
|
|
282
|
+
authorizationServer,
|
|
283
|
+
label,
|
|
284
|
+
clientSecret
|
|
285
|
+
}
|
|
286
|
+
) {
|
|
287
|
+
this.logService.info(
|
|
288
|
+
`Client ID for authentication provider ${providerId} changed to ${clientId}`
|
|
289
|
+
);
|
|
221
290
|
const existing = this.dynamicAuthProviderStorageService.getInteractedProviders().find(p => p.providerId === providerId);
|
|
222
291
|
if (!existing) {
|
|
223
292
|
throw ( new Error(
|
|
@@ -231,70 +300,66 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
|
|
|
231
300
|
const customMessage = provider.confirmation?.(extensionName, recreatingSession);
|
|
232
301
|
if (customMessage) {
|
|
233
302
|
message = customMessage;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
? ( localize(
|
|
238
|
-
2474,
|
|
303
|
+
} else {
|
|
304
|
+
message = recreatingSession ? ( localize(
|
|
305
|
+
2477,
|
|
239
306
|
"The extension '{0}' wants you to sign in again using {1}.",
|
|
240
307
|
extensionName,
|
|
241
308
|
provider.label
|
|
242
|
-
))
|
|
243
|
-
|
|
244
|
-
2475,
|
|
309
|
+
)) : ( localize(
|
|
310
|
+
2478,
|
|
245
311
|
"The extension '{0}' wants to sign in using {1}.",
|
|
246
312
|
extensionName,
|
|
247
313
|
provider.label
|
|
248
314
|
));
|
|
249
315
|
}
|
|
250
|
-
const buttons = [
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
return true;
|
|
255
|
-
},
|
|
316
|
+
const buttons = [{
|
|
317
|
+
label: ( localize(2479, "&&Allow")),
|
|
318
|
+
run() {
|
|
319
|
+
return true;
|
|
256
320
|
}
|
|
257
|
-
];
|
|
321
|
+
}];
|
|
258
322
|
if (options?.learnMore) {
|
|
259
323
|
buttons.push({
|
|
260
|
-
label: ( localize(
|
|
324
|
+
label: ( localize(2480, "Learn more")),
|
|
261
325
|
run: async () => {
|
|
262
326
|
const result = this.loginPrompt(provider, extensionName, recreatingSession, options);
|
|
263
|
-
await this.openerService.open(URI.revive(options.learnMore), {
|
|
327
|
+
await this.openerService.open(URI.revive(options.learnMore), {
|
|
328
|
+
allowCommands: true
|
|
329
|
+
});
|
|
264
330
|
return await result;
|
|
265
331
|
}
|
|
266
332
|
});
|
|
267
333
|
}
|
|
268
|
-
const {
|
|
334
|
+
const {
|
|
335
|
+
result
|
|
336
|
+
} = await this.dialogService.prompt({
|
|
269
337
|
type: Severity.Info,
|
|
270
338
|
message,
|
|
271
339
|
buttons,
|
|
272
340
|
detail: options?.detail,
|
|
273
|
-
cancelButton: true
|
|
341
|
+
cancelButton: true
|
|
274
342
|
});
|
|
275
343
|
return result ?? false;
|
|
276
344
|
}
|
|
277
345
|
async continueWithIncorrectAccountPrompt(chosenAccountLabel, requestedAccountLabel) {
|
|
278
346
|
const result = await this.dialogService.prompt({
|
|
279
|
-
message: ( localize(
|
|
347
|
+
message: ( localize(2481, "Incorrect account detected")),
|
|
280
348
|
detail: ( localize(
|
|
281
|
-
|
|
349
|
+
2482,
|
|
282
350
|
"The chosen account, {0}, does not match the requested account, {1}.",
|
|
283
351
|
chosenAccountLabel,
|
|
284
352
|
requestedAccountLabel
|
|
285
353
|
)),
|
|
286
354
|
type: Severity.Warning,
|
|
287
355
|
cancelButton: true,
|
|
288
|
-
buttons: [
|
|
289
|
-
{
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
},
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
run: () => requestedAccountLabel
|
|
296
|
-
}
|
|
297
|
-
],
|
|
356
|
+
buttons: [{
|
|
357
|
+
label: ( localize(2483, "Keep {0}", chosenAccountLabel)),
|
|
358
|
+
run: () => chosenAccountLabel
|
|
359
|
+
}, {
|
|
360
|
+
label: ( localize(2484, "Login with {0}", requestedAccountLabel)),
|
|
361
|
+
run: () => requestedAccountLabel
|
|
362
|
+
}]
|
|
298
363
|
});
|
|
299
364
|
if (!result.result) {
|
|
300
365
|
throw ( new CancellationError());
|
|
@@ -303,30 +368,31 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
|
|
|
303
368
|
}
|
|
304
369
|
async doGetSession(providerId, scopeListOrRequest, extensionId, extensionName, options) {
|
|
305
370
|
const authorizationServer = URI.revive(options.authorizationServer);
|
|
306
|
-
const sessions = await this.authenticationService.getSessions(providerId, scopeListOrRequest, {
|
|
371
|
+
const sessions = await this.authenticationService.getSessions(providerId, scopeListOrRequest, {
|
|
372
|
+
account: options.account,
|
|
373
|
+
authorizationServer
|
|
374
|
+
}, true);
|
|
307
375
|
const provider = this.authenticationService.getProvider(providerId);
|
|
308
376
|
if (options.forceNewSession && options.createIfNone) {
|
|
309
377
|
throw ( new Error(
|
|
310
|
-
|
|
378
|
+
"Invalid combination of options. Please remove one of the following: forceNewSession, createIfNone"
|
|
311
379
|
));
|
|
312
380
|
}
|
|
313
381
|
if (options.forceNewSession && options.silent) {
|
|
314
382
|
throw ( new Error(
|
|
315
|
-
|
|
383
|
+
"Invalid combination of options. Please remove one of the following: forceNewSession, silent"
|
|
316
384
|
));
|
|
317
385
|
}
|
|
318
386
|
if (options.createIfNone && options.silent) {
|
|
319
387
|
throw ( new Error(
|
|
320
|
-
|
|
388
|
+
"Invalid combination of options. Please remove one of the following: createIfNone, silent"
|
|
321
389
|
));
|
|
322
390
|
}
|
|
323
391
|
if (options.clearSessionPreference) {
|
|
324
392
|
this.authenticationExtensionsService.removeAccountPreference(extensionId, providerId);
|
|
325
393
|
}
|
|
326
394
|
const matchingAccountPreferenceSession =
|
|
327
|
-
options.account
|
|
328
|
-
? sessions[0]
|
|
329
|
-
: this._getAccountPreference(extensionId, providerId, sessions);
|
|
395
|
+
options.account ? sessions[0] : this._getAccountPreference(extensionId, providerId, sessions);
|
|
330
396
|
if (!options.forceNewSession && sessions.length) {
|
|
331
397
|
if (matchingAccountPreferenceSession && this.authenticationAccessService.isAccessAllowed(providerId, matchingAccountPreferenceSession.account.label, extensionId)) {
|
|
332
398
|
return matchingAccountPreferenceSession;
|
|
@@ -337,24 +403,20 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
|
|
|
337
403
|
}
|
|
338
404
|
if (options.createIfNone || options.forceNewSession) {
|
|
339
405
|
let uiOptions;
|
|
340
|
-
if (typeof options.forceNewSession ===
|
|
406
|
+
if (typeof options.forceNewSession === "object") {
|
|
341
407
|
uiOptions = options.forceNewSession;
|
|
342
|
-
}
|
|
343
|
-
else if (typeof options.createIfNone === 'object') {
|
|
408
|
+
} else if (typeof options.createIfNone === "object") {
|
|
344
409
|
uiOptions = options.createIfNone;
|
|
345
410
|
}
|
|
346
411
|
const recreatingSession = !!(options.forceNewSession && sessions.length);
|
|
347
412
|
const isAllowed = await this.loginPrompt(provider, extensionName, recreatingSession, uiOptions);
|
|
348
413
|
if (!isAllowed) {
|
|
349
|
-
throw ( new Error(
|
|
414
|
+
throw ( new Error("User did not consent to login."));
|
|
350
415
|
}
|
|
351
416
|
let session;
|
|
352
417
|
if (sessions?.length && !options.forceNewSession) {
|
|
353
|
-
session = provider.supportsMultipleAccounts && !options.account
|
|
354
|
-
|
|
355
|
-
: sessions[0];
|
|
356
|
-
}
|
|
357
|
-
else {
|
|
418
|
+
session = provider.supportsMultipleAccounts && !options.account ? await this.authenticationExtensionsService.selectSession(providerId, extensionId, extensionName, scopeListOrRequest, sessions) : sessions[0];
|
|
419
|
+
} else {
|
|
358
420
|
const accountToCreate = options.account ?? matchingAccountPreferenceSession?.account;
|
|
359
421
|
do {
|
|
360
422
|
session = await this.authenticationService.createSession(providerId, scopeListOrRequest, {
|
|
@@ -362,25 +424,27 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
|
|
|
362
424
|
account: accountToCreate,
|
|
363
425
|
authorizationServer
|
|
364
426
|
});
|
|
365
|
-
} while (accountToCreate
|
|
366
|
-
&& accountToCreate.label !== session.account.label
|
|
367
|
-
&& !(await this.continueWithIncorrectAccountPrompt(session.account.label, accountToCreate.label)));
|
|
427
|
+
} while (accountToCreate && accountToCreate.label !== session.account.label && !(await this.continueWithIncorrectAccountPrompt(session.account.label, accountToCreate.label)));
|
|
368
428
|
}
|
|
369
|
-
this.authenticationAccessService.updateAllowedExtensions(providerId, session.account.label, [{
|
|
429
|
+
this.authenticationAccessService.updateAllowedExtensions(providerId, session.account.label, [{
|
|
430
|
+
id: extensionId,
|
|
431
|
+
name: extensionName,
|
|
432
|
+
allowed: true
|
|
433
|
+
}]);
|
|
370
434
|
this.authenticationExtensionsService.updateNewSessionRequests(providerId, [session]);
|
|
371
435
|
this.authenticationExtensionsService.updateAccountPreference(extensionId, providerId, session.account);
|
|
372
436
|
return session;
|
|
373
437
|
}
|
|
374
438
|
if (!matchingAccountPreferenceSession) {
|
|
375
|
-
const validSessions = sessions.filter(
|
|
439
|
+
const validSessions = sessions.filter(
|
|
440
|
+
session => this.authenticationAccessService.isAccessAllowed(providerId, session.account.label, extensionId)
|
|
441
|
+
);
|
|
376
442
|
if (validSessions.length === 1) {
|
|
377
443
|
return validSessions[0];
|
|
378
444
|
}
|
|
379
445
|
}
|
|
380
446
|
if (!options.silent) {
|
|
381
|
-
sessions.length
|
|
382
|
-
? this.authenticationExtensionsService.requestSessionAccess(providerId, extensionId, extensionName, scopeListOrRequest, sessions)
|
|
383
|
-
: await this.authenticationExtensionsService.requestNewSession(providerId, scopeListOrRequest, extensionId, extensionName);
|
|
447
|
+
sessions.length ? this.authenticationExtensionsService.requestSessionAccess(providerId, extensionId, extensionName, scopeListOrRequest, sessions) : await this.authenticationExtensionsService.requestNewSession(providerId, scopeListOrRequest, extensionId, extensionName);
|
|
384
448
|
}
|
|
385
449
|
return undefined;
|
|
386
450
|
}
|
|
@@ -392,7 +456,13 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
|
|
|
392
456
|
const session = await this.doGetSession(providerId, scopeListOrRequest, extensionId, extensionName, options);
|
|
393
457
|
if (session) {
|
|
394
458
|
this.sendProviderUsageTelemetry(extensionId, providerId);
|
|
395
|
-
this.authenticationUsageService.addAccountUsage(
|
|
459
|
+
this.authenticationUsageService.addAccountUsage(
|
|
460
|
+
providerId,
|
|
461
|
+
session.account.label,
|
|
462
|
+
session.scopes,
|
|
463
|
+
extensionId,
|
|
464
|
+
extensionName
|
|
465
|
+
);
|
|
396
466
|
}
|
|
397
467
|
return session;
|
|
398
468
|
}
|
|
@@ -401,14 +471,16 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
|
|
|
401
471
|
return accounts;
|
|
402
472
|
}
|
|
403
473
|
sendClientIdUsageTelemetry(extensionId, providerId, scopes) {
|
|
404
|
-
const containsVSCodeClientIdScope = ( scopes.some(scope => scope.startsWith(
|
|
474
|
+
const containsVSCodeClientIdScope = ( scopes.some(scope => scope.startsWith("VSCODE_CLIENT_ID:")));
|
|
405
475
|
const key = `${extensionId}|${providerId}|${containsVSCodeClientIdScope}`;
|
|
406
476
|
if (( this._sentClientIdUsageEvents.has(key))) {
|
|
407
477
|
return;
|
|
408
478
|
}
|
|
409
479
|
this._sentClientIdUsageEvents.add(key);
|
|
410
480
|
if (containsVSCodeClientIdScope) {
|
|
411
|
-
this.telemetryService.publicLog2(
|
|
481
|
+
this.telemetryService.publicLog2("authentication.clientIdUsage", {
|
|
482
|
+
extensionId
|
|
483
|
+
});
|
|
412
484
|
}
|
|
413
485
|
}
|
|
414
486
|
sendProviderUsageTelemetry(extensionId, providerId) {
|
|
@@ -417,7 +489,10 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
|
|
|
417
489
|
return;
|
|
418
490
|
}
|
|
419
491
|
this._sentProviderUsageEvents.add(key);
|
|
420
|
-
this.telemetryService.publicLog2(
|
|
492
|
+
this.telemetryService.publicLog2("authentication.providerUsage", {
|
|
493
|
+
providerId,
|
|
494
|
+
extensionId
|
|
495
|
+
});
|
|
421
496
|
}
|
|
422
497
|
_getAccountPreference(extensionId, providerId, sessions) {
|
|
423
498
|
if (sessions.length === 0) {
|
|
@@ -431,79 +506,75 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
|
|
|
431
506
|
return undefined;
|
|
432
507
|
}
|
|
433
508
|
async $showDeviceCodeModal(userCode, verificationUri) {
|
|
434
|
-
const {
|
|
509
|
+
const {
|
|
510
|
+
result
|
|
511
|
+
} = await this.dialogService.prompt({
|
|
435
512
|
type: Severity.Info,
|
|
436
|
-
message: ( localize(
|
|
513
|
+
message: ( localize(2485, "Device Code Authentication")),
|
|
437
514
|
detail: ( localize(
|
|
438
|
-
|
|
515
|
+
2486,
|
|
439
516
|
"Your code: {0}\n\nTo complete authentication, navigate to {1} and enter the code above.",
|
|
440
517
|
userCode,
|
|
441
518
|
verificationUri
|
|
442
519
|
)),
|
|
443
|
-
buttons: [
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
}
|
|
448
|
-
],
|
|
520
|
+
buttons: [{
|
|
521
|
+
label: ( localize(2487, "Copy & Continue")),
|
|
522
|
+
run: () => true
|
|
523
|
+
}],
|
|
449
524
|
cancelButton: true
|
|
450
525
|
});
|
|
451
526
|
if (result) {
|
|
452
527
|
try {
|
|
453
528
|
await this.clipboardService.writeText(userCode);
|
|
454
529
|
return await this.openerService.open(( URI.parse(verificationUri)));
|
|
455
|
-
}
|
|
456
|
-
|
|
457
|
-
this.notificationService.error(( localize(2485, "Failed to open {0}", verificationUri)));
|
|
530
|
+
} catch (error) {
|
|
531
|
+
this.notificationService.error(( localize(2488, "Failed to open {0}", verificationUri)));
|
|
458
532
|
}
|
|
459
533
|
}
|
|
460
534
|
return false;
|
|
461
535
|
}
|
|
462
536
|
async $promptForClientRegistration(authorizationServerUrl) {
|
|
463
|
-
const redirectUrls =
|
|
537
|
+
const redirectUrls = "http://127.0.0.1:33418\nhttps://vscode.dev/redirect";
|
|
464
538
|
const result = await this.dialogService.prompt({
|
|
465
539
|
type: Severity.Info,
|
|
466
|
-
message: ( localize(
|
|
540
|
+
message: ( localize(2489, "Dynamic Client Registration not supported")),
|
|
467
541
|
detail: ( localize(
|
|
468
|
-
|
|
542
|
+
2490,
|
|
469
543
|
"The authorization server '{0}' does not support automatic client registration. Do you want to proceed by manually providing a client registration (client ID)?\n\nNote: When registering your OAuth application, make sure to include these redirect URIs:\n{1}",
|
|
470
544
|
authorizationServerUrl,
|
|
471
545
|
redirectUrls
|
|
472
546
|
)),
|
|
473
|
-
buttons: [
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
catch (error) {
|
|
481
|
-
this.notificationService.error(( localize(2489, "Failed to copy redirect URIs to clipboard.")));
|
|
482
|
-
}
|
|
483
|
-
return true;
|
|
547
|
+
buttons: [{
|
|
548
|
+
label: ( localize(2491, "Copy URIs & Proceed")),
|
|
549
|
+
run: async () => {
|
|
550
|
+
try {
|
|
551
|
+
await this.clipboardService.writeText(redirectUrls);
|
|
552
|
+
} catch (error) {
|
|
553
|
+
this.notificationService.error(( localize(2492, "Failed to copy redirect URIs to clipboard.")));
|
|
484
554
|
}
|
|
485
|
-
|
|
486
|
-
|
|
555
|
+
return true;
|
|
556
|
+
}
|
|
557
|
+
}],
|
|
487
558
|
cancelButton: {
|
|
488
|
-
label: ( localize(
|
|
559
|
+
label: ( localize(2493, "Cancel")),
|
|
489
560
|
run: () => false
|
|
490
561
|
}
|
|
491
562
|
});
|
|
492
563
|
if (!result) {
|
|
493
564
|
return undefined;
|
|
494
565
|
}
|
|
495
|
-
const sharedTitle = ( localize(
|
|
566
|
+
const sharedTitle = ( localize(2494, "Add Client Registration Details"));
|
|
496
567
|
const clientId = await this.quickInputService.input({
|
|
497
568
|
title: sharedTitle,
|
|
498
569
|
prompt: ( localize(
|
|
499
|
-
|
|
570
|
+
2495,
|
|
500
571
|
"Enter an existing client ID that has been registered with the following redirect URIs: http://127.0.0.1:33418, https://vscode.dev/redirect"
|
|
501
572
|
)),
|
|
502
|
-
placeHolder: ( localize(
|
|
573
|
+
placeHolder: ( localize(2496, "OAuth client ID (azye39d...)")),
|
|
503
574
|
ignoreFocusLost: true,
|
|
504
|
-
validateInput: async
|
|
575
|
+
validateInput: async value => {
|
|
505
576
|
if (!value || value.trim().length === 0) {
|
|
506
|
-
return localize(
|
|
577
|
+
return localize(2497, "Client ID is required");
|
|
507
578
|
}
|
|
508
579
|
return undefined;
|
|
509
580
|
}
|
|
@@ -514,11 +585,11 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
|
|
|
514
585
|
const clientSecret = await this.quickInputService.input({
|
|
515
586
|
title: sharedTitle,
|
|
516
587
|
prompt: ( localize(
|
|
517
|
-
|
|
588
|
+
2498,
|
|
518
589
|
"(optional) Enter an existing client secret associated with the client id '{0}' or leave this field blank",
|
|
519
590
|
clientId
|
|
520
591
|
)),
|
|
521
|
-
placeHolder: ( localize(
|
|
592
|
+
placeHolder: ( localize(2499, "OAuth client secret (wer32o50f...) or leave it blank")),
|
|
522
593
|
password: true,
|
|
523
594
|
ignoreFocusLost: true
|
|
524
595
|
});
|
|
@@ -528,23 +599,9 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
|
|
|
528
599
|
};
|
|
529
600
|
}
|
|
530
601
|
};
|
|
531
|
-
MainThreadAuthentication = __decorate(
|
|
532
|
-
extHostNamedCustomer(MainContext.MainThreadAuthentication),
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
( __param(3, IAuthenticationExtensionsService)),
|
|
536
|
-
( __param(4, IAuthenticationAccessService)),
|
|
537
|
-
( __param(5, IAuthenticationUsageService)),
|
|
538
|
-
( __param(6, IDialogService)),
|
|
539
|
-
( __param(7, INotificationService)),
|
|
540
|
-
( __param(8, IExtensionService)),
|
|
541
|
-
( __param(9, ITelemetryService)),
|
|
542
|
-
( __param(10, IOpenerService)),
|
|
543
|
-
( __param(11, ILogService)),
|
|
544
|
-
( __param(12, IURLService)),
|
|
545
|
-
( __param(13, IDynamicAuthenticationProviderStorageService)),
|
|
546
|
-
( __param(14, IClipboardService)),
|
|
547
|
-
( __param(15, IQuickInputService))
|
|
548
|
-
], MainThreadAuthentication);
|
|
602
|
+
MainThreadAuthentication = __decorate(
|
|
603
|
+
[extHostNamedCustomer(MainContext.MainThreadAuthentication), ( __param(1, IProductService)), ( __param(2, IAuthenticationService)), ( __param(3, IAuthenticationExtensionsService)), ( __param(4, IAuthenticationAccessService)), ( __param(5, IAuthenticationUsageService)), ( __param(6, IDialogService)), ( __param(7, INotificationService)), ( __param(8, IExtensionService)), ( __param(9, ITelemetryService)), ( __param(10, IOpenerService)), ( __param(11, ILogService)), ( __param(12, IURLService)), ( __param(13, IDynamicAuthenticationProviderStorageService)), ( __param(14, IClipboardService)), ( __param(15, IQuickInputService))],
|
|
604
|
+
MainThreadAuthentication
|
|
605
|
+
);
|
|
549
606
|
|
|
550
607
|
export { MainThreadAuthentication };
|
|
@@ -17,21 +17,19 @@ let MainThreadBulkEdits = class MainThreadBulkEdits {
|
|
|
17
17
|
this._logService = _logService;
|
|
18
18
|
this._uriIdentService = _uriIdentService;
|
|
19
19
|
}
|
|
20
|
-
dispose() {
|
|
20
|
+
dispose() {}
|
|
21
21
|
$tryApplyWorkspaceEdit(dto, undoRedoGroupId, isRefactoring) {
|
|
22
22
|
const edits = reviveWorkspaceEditDto(dto.value, this._uriIdentService);
|
|
23
|
-
return this._bulkEditService.apply(edits, {
|
|
23
|
+
return this._bulkEditService.apply(edits, {
|
|
24
|
+
undoRedoGroupId,
|
|
25
|
+
respectAutoSaveConfig: isRefactoring
|
|
26
|
+
}).then(res => res.isApplied, err => {
|
|
24
27
|
this._logService.warn(`IGNORING workspace edit: ${err}`);
|
|
25
28
|
return false;
|
|
26
29
|
});
|
|
27
30
|
}
|
|
28
31
|
};
|
|
29
|
-
MainThreadBulkEdits = __decorate([
|
|
30
|
-
extHostNamedCustomer(MainContext.MainThreadBulkEdits),
|
|
31
|
-
( __param(1, IBulkEditService)),
|
|
32
|
-
( __param(2, ILogService)),
|
|
33
|
-
( __param(3, IUriIdentityService))
|
|
34
|
-
], MainThreadBulkEdits);
|
|
32
|
+
MainThreadBulkEdits = __decorate([extHostNamedCustomer(MainContext.MainThreadBulkEdits), ( __param(1, IBulkEditService)), ( __param(2, ILogService)), ( __param(3, IUriIdentityService))], MainThreadBulkEdits);
|
|
35
33
|
function reviveWorkspaceEditDto(data, uriIdentityService, resolveDataTransferFile) {
|
|
36
34
|
if (!data || !data.edits) {
|
|
37
35
|
return data;
|
|
@@ -45,15 +43,13 @@ function reviveWorkspaceEditDto(data, uriIdentityService, resolveDataTransferFil
|
|
|
45
43
|
if (edit.options) {
|
|
46
44
|
const inContents = edit.options?.contents;
|
|
47
45
|
if (inContents) {
|
|
48
|
-
if (inContents.type ===
|
|
46
|
+
if (inContents.type === "base64") {
|
|
49
47
|
edit.options.contents = Promise.resolve(decodeBase64(inContents.value));
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
48
|
+
} else {
|
|
52
49
|
if (resolveDataTransferFile) {
|
|
53
50
|
edit.options.contents = resolveDataTransferFile(inContents.id);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
throw ( new Error('Could not revive data transfer file'));
|
|
51
|
+
} else {
|
|
52
|
+
throw ( new Error("Could not revive data transfer file"));
|
|
57
53
|
}
|
|
58
54
|
}
|
|
59
55
|
}
|