Skip to content

Commit 36141fa

Browse files
committed
microsoft#85619 Enable following
- getting all refs - resolving content for a ref - deleting a resource
1 parent 014ddaf commit 36141fa

6 files changed

Lines changed: 141 additions & 6 deletions

File tree

src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ import { IProductService } from 'vs/platform/product/common/productService';
5252
import { IUserDataSyncService, IUserDataSyncStoreService, registerConfiguration, IUserDataSyncLogService, IUserDataSyncUtilService, ISettingsSyncService, IUserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSync';
5353
import { UserDataSyncService } from 'vs/platform/userDataSync/common/userDataSyncService';
5454
import { UserDataSyncStoreService } from 'vs/platform/userDataSync/common/userDataSyncStoreService';
55-
import { UserDataSyncChannel, UserDataSyncUtilServiceClient, SettingsSyncChannel, UserDataAutoSyncChannel } from 'vs/platform/userDataSync/common/userDataSyncIpc';
55+
import { UserDataSyncChannel, UserDataSyncUtilServiceClient, SettingsSyncChannel, UserDataAutoSyncChannel, UserDataSyncStoreServiceChannel } from 'vs/platform/userDataSync/common/userDataSyncIpc';
5656
import { IElectronService } from 'vs/platform/electron/node/electron';
5757
import { LoggerService } from 'vs/platform/log/node/loggerService';
5858
import { UserDataSyncLogService } from 'vs/platform/userDataSync/common/userDataSyncLog';
@@ -219,6 +219,10 @@ async function main(server: Server, initData: ISharedProcessInitData, configurat
219219
const authTokenChannel = new AuthenticationTokenServiceChannel(authTokenService);
220220
server.registerChannel('authToken', authTokenChannel);
221221

222+
const userDataSyncStoreService = accessor.get(IUserDataSyncStoreService);
223+
const userDataSyncStoreServiceChannel = new UserDataSyncStoreServiceChannel(userDataSyncStoreService);
224+
server.registerChannel('userDataSyncStoreService', userDataSyncStoreServiceChannel);
225+
222226
const settingsSyncService = accessor.get(ISettingsSyncService);
223227
const settingsSyncChannel = new SettingsSyncChannel(settingsSyncService);
224228
server.registerChannel('settingsSync', settingsSyncChannel);

src/vs/platform/userDataSync/common/userDataSync.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,9 @@ export interface IUserDataSyncStoreService {
151151
write(key: ResourceKey, content: string, ref: string | null, source?: SyncSource): Promise<string>;
152152
manifest(): Promise<IUserDataManifest | null>;
153153
clear(): Promise<void>;
154+
getAllRefs(key: ResourceKey): Promise<string[]>;
155+
resolveContent(key: ResourceKey, ref: string): Promise<string | null>;
156+
delete(key: ResourceKey): Promise<void>;
154157
}
155158

156159
//#endregion

src/vs/platform/userDataSync/common/userDataSyncIpc.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import { IServerChannel, IChannel } from 'vs/base/parts/ipc/common/ipc';
77
import { Event } from 'vs/base/common/event';
8-
import { IUserDataSyncService, IUserDataSyncUtilService, ISettingsSyncService, IUserDataAutoSyncService } from 'vs/platform/userDataSync/common/userDataSync';
8+
import { IUserDataSyncService, IUserDataSyncUtilService, ISettingsSyncService, IUserDataAutoSyncService, IUserDataSyncStoreService } from 'vs/platform/userDataSync/common/userDataSync';
99
import { URI } from 'vs/base/common/uri';
1010
import { IStringDictionary } from 'vs/base/common/collections';
1111
import { FormattingOptions } from 'vs/base/common/jsonFormatter';
@@ -131,3 +131,20 @@ export class UserDataSyncUtilServiceClient implements IUserDataSyncUtilService {
131131

132132
}
133133

134+
export class UserDataSyncStoreServiceChannel implements IServerChannel {
135+
136+
constructor(private readonly service: IUserDataSyncStoreService) { }
137+
138+
listen(_: unknown, event: string): Event<any> {
139+
throw new Error(`Event not found: ${event}`);
140+
}
141+
142+
call(context: any, command: string, args?: any): Promise<any> {
143+
switch (command) {
144+
case 'getAllRefs': return this.service.getAllRefs(args[0]);
145+
case 'resolveContent': return this.service.resolveContent(args[0], args[1]);
146+
case 'delete': return this.service.delete(args[0]);
147+
}
148+
throw new Error('Invalid call');
149+
}
150+
}

src/vs/platform/userDataSync/common/userDataSyncStoreService.ts

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { Disposable, } from 'vs/base/common/lifecycle';
7-
import { IUserData, IUserDataSyncStoreService, UserDataSyncErrorCode, IUserDataSyncStore, getUserDataSyncStore, SyncSource, UserDataSyncStoreError, IUserDataSyncLogService, IUserDataManifest } from 'vs/platform/userDataSync/common/userDataSync';
7+
import { IUserData, IUserDataSyncStoreService, UserDataSyncErrorCode, IUserDataSyncStore, getUserDataSyncStore, SyncSource, UserDataSyncStoreError, IUserDataSyncLogService, IUserDataManifest, ResourceKey } from 'vs/platform/userDataSync/common/userDataSync';
88
import { IRequestService, asText, isSuccess, asJson } from 'vs/platform/request/common/request';
9-
import { joinPath } from 'vs/base/common/resources';
9+
import { joinPath, relativePath } from 'vs/base/common/resources';
1010
import { CancellationToken } from 'vs/base/common/cancellation';
1111
import { IHeaders, IRequestOptions, IRequestContext } from 'vs/base/parts/request/common/request';
1212
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
1313
import { IAuthenticationTokenService } from 'vs/platform/authentication/common/authentication';
1414
import { IProductService } from 'vs/platform/product/common/productService';
15+
import { URI } from 'vs/base/common/uri';
1516

1617
export class UserDataSyncStoreService extends Disposable implements IUserDataSyncStoreService {
1718

@@ -30,7 +31,58 @@ export class UserDataSyncStoreService extends Disposable implements IUserDataSyn
3031
this.userDataSyncStore = getUserDataSyncStore(productService, configurationService);
3132
}
3233

33-
async read(key: string, oldValue: IUserData | null, source?: SyncSource): Promise<IUserData> {
34+
async getAllRefs(key: ResourceKey): Promise<string[]> {
35+
if (!this.userDataSyncStore) {
36+
throw new Error('No settings sync store url configured.');
37+
}
38+
39+
const uri = joinPath(this.userDataSyncStore.url, 'resource', key);
40+
const headers: IHeaders = {};
41+
42+
const context = await this.request({ type: 'GET', url: uri.toString(), headers }, undefined, CancellationToken.None);
43+
44+
if (!isSuccess(context)) {
45+
throw new UserDataSyncStoreError('Server returned ' + context.res.statusCode, UserDataSyncErrorCode.Unknown, undefined);
46+
}
47+
48+
const resources: string[] = await asJson<string[]>(context) || [];
49+
return resources.map(resource => relativePath(uri, URI.parse(resource))!);
50+
}
51+
52+
async resolveContent(key: ResourceKey, ref: string): Promise<string | null> {
53+
if (!this.userDataSyncStore) {
54+
throw new Error('No settings sync store url configured.');
55+
}
56+
57+
const url = joinPath(this.userDataSyncStore.url, 'resource', key, ref).toString();
58+
const headers: IHeaders = {};
59+
60+
const context = await this.request({ type: 'GET', url, headers }, undefined, CancellationToken.None);
61+
62+
if (!isSuccess(context)) {
63+
throw new UserDataSyncStoreError('Server returned ' + context.res.statusCode, UserDataSyncErrorCode.Unknown, undefined);
64+
}
65+
66+
const content = await asText(context);
67+
return content;
68+
}
69+
70+
async delete(key: ResourceKey): Promise<void> {
71+
if (!this.userDataSyncStore) {
72+
throw new Error('No settings sync store url configured.');
73+
}
74+
75+
const url = joinPath(this.userDataSyncStore.url, 'resource', key).toString();
76+
const headers: IHeaders = {};
77+
78+
const context = await this.request({ type: 'DELETE', url, headers }, undefined, CancellationToken.None);
79+
80+
if (!isSuccess(context)) {
81+
throw new UserDataSyncStoreError('Server returned ' + context.res.statusCode, UserDataSyncErrorCode.Unknown, undefined);
82+
}
83+
}
84+
85+
async read(key: ResourceKey, oldValue: IUserData | null, source?: SyncSource): Promise<IUserData> {
3486
if (!this.userDataSyncStore) {
3587
throw new Error('No settings sync store url configured.');
3688
}
@@ -62,7 +114,7 @@ export class UserDataSyncStoreService extends Disposable implements IUserDataSyn
62114
return { ref, content };
63115
}
64116

65-
async write(key: string, data: string, ref: string | null, source?: SyncSource): Promise<string> {
117+
async write(key: ResourceKey, data: string, ref: string | null, source?: SyncSource): Promise<string> {
66118
if (!this.userDataSyncStore) {
67119
throw new Error('No settings sync store url configured.');
68120
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import { SyncSource, IUserDataSyncStoreService, IUserDataSyncStore, getUserDataSyncStore, ResourceKey, IUserData, IUserDataManifest } from 'vs/platform/userDataSync/common/userDataSync';
7+
import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService';
8+
import { IChannel } from 'vs/base/parts/ipc/common/ipc';
9+
import { registerSingleton } from 'vs/platform/instantiation/common/extensions';
10+
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
11+
import { IProductService } from 'vs/platform/product/common/productService';
12+
13+
export class UserDataSyncStoreService implements IUserDataSyncStoreService {
14+
15+
_serviceBrand: undefined;
16+
private readonly channel: IChannel;
17+
readonly userDataSyncStore: IUserDataSyncStore | undefined;
18+
19+
constructor(
20+
@ISharedProcessService sharedProcessService: ISharedProcessService,
21+
@IProductService productService: IProductService,
22+
@IConfigurationService configurationService: IConfigurationService
23+
) {
24+
this.channel = sharedProcessService.getChannel('userDataSyncStoreService');
25+
this.userDataSyncStore = getUserDataSyncStore(productService, configurationService);
26+
}
27+
28+
read(key: ResourceKey, oldValue: IUserData | null, source?: SyncSource): Promise<IUserData> {
29+
throw new Error('Not Supported');
30+
}
31+
32+
write(key: ResourceKey, content: string, ref: string | null, source?: SyncSource): Promise<string> {
33+
throw new Error('Not Supported');
34+
}
35+
36+
manifest(): Promise<IUserDataManifest | null> {
37+
throw new Error('Not Supported');
38+
}
39+
40+
clear(): Promise<void> {
41+
throw new Error('Not Supported');
42+
}
43+
44+
getAllRefs(key: ResourceKey): Promise<string[]> {
45+
return this.channel.call('getAllRefs', [key]);
46+
}
47+
48+
resolveContent(key: ResourceKey, ref: string): Promise<string | null> {
49+
return this.channel.call('resolveContent', [key, ref]);
50+
}
51+
52+
delete(key: ResourceKey): Promise<void> {
53+
return this.channel.call('delete', [key]);
54+
}
55+
56+
}
57+
58+
registerSingleton(IUserDataSyncStoreService, UserDataSyncStoreService);

src/vs/workbench/workbench.desktop.main.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ import 'vs/workbench/services/workspaces/electron-browser/workspaceEditingServic
5252
import 'vs/workbench/services/userDataSync/electron-browser/userDataSyncService';
5353
import 'vs/workbench/services/userDataSync/electron-browser/settingsSyncService';
5454
import 'vs/workbench/services/userDataSync/electron-browser/userDataAutoSyncService';
55+
import 'vs/workbench/services/userDataSync/electron-browser/userDataSyncStoreService';
5556
import 'vs/workbench/services/authentication/electron-browser/authenticationTokenService';
5657
import 'vs/workbench/services/authentication/browser/authenticationService';
5758
import 'vs/workbench/services/host/electron-browser/desktopHostService';

0 commit comments

Comments
 (0)