Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/editSessions/browser/editSessionsFileSystemProvider.ts
3296 views
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 { Disposable, IDisposable } from '../../../../base/common/lifecycle.js';
7
import { Event } from '../../../../base/common/event.js';
8
import { URI } from '../../../../base/common/uri.js';
9
import { FilePermission, FileSystemProviderCapabilities, FileSystemProviderErrorCode, FileType, IFileDeleteOptions, IFileOverwriteOptions, IFileSystemProviderWithFileReadWriteCapability, IStat, IWatchOptions } from '../../../../platform/files/common/files.js';
10
import { ChangeType, decodeEditSessionFileContent, EDIT_SESSIONS_SCHEME, EditSession, IEditSessionsStorageService } from '../common/editSessions.js';
11
import { NotSupportedError } from '../../../../base/common/errors.js';
12
13
export class EditSessionsFileSystemProvider implements IFileSystemProviderWithFileReadWriteCapability {
14
15
static readonly SCHEMA = EDIT_SESSIONS_SCHEME;
16
17
constructor(
18
@IEditSessionsStorageService private editSessionsStorageService: IEditSessionsStorageService,
19
) { }
20
21
readonly capabilities: FileSystemProviderCapabilities = FileSystemProviderCapabilities.Readonly + FileSystemProviderCapabilities.FileReadWrite;
22
23
async readFile(resource: URI): Promise<Uint8Array> {
24
const match = /(?<ref>[^/]+)\/(?<folderName>[^/]+)\/(?<filePath>.*)/.exec(resource.path.substring(1));
25
if (!match?.groups) {
26
throw FileSystemProviderErrorCode.FileNotFound;
27
}
28
const { ref, folderName, filePath } = match.groups;
29
const data = await this.editSessionsStorageService.read('editSessions', ref);
30
if (!data) {
31
throw FileSystemProviderErrorCode.FileNotFound;
32
}
33
const content: EditSession = JSON.parse(data.content);
34
const change = content.folders.find((f) => f.name === folderName)?.workingChanges.find((change) => change.relativeFilePath === filePath);
35
if (!change || change.type === ChangeType.Deletion) {
36
throw FileSystemProviderErrorCode.FileNotFound;
37
}
38
return decodeEditSessionFileContent(content.version, change.contents).buffer;
39
}
40
41
async stat(resource: URI): Promise<IStat> {
42
const content = await this.readFile(resource);
43
const currentTime = Date.now();
44
return {
45
type: FileType.File,
46
permissions: FilePermission.Readonly,
47
mtime: currentTime,
48
ctime: currentTime,
49
size: content.byteLength
50
};
51
}
52
53
//#region Unsupported file operations
54
readonly onDidChangeCapabilities = Event.None;
55
readonly onDidChangeFile = Event.None;
56
57
watch(resource: URI, opts: IWatchOptions): IDisposable { return Disposable.None; }
58
59
async mkdir(resource: URI): Promise<void> { }
60
async readdir(resource: URI): Promise<[string, FileType][]> { return []; }
61
62
async rename(from: URI, to: URI, opts: IFileOverwriteOptions): Promise<void> { }
63
async delete(resource: URI, opts: IFileDeleteOptions): Promise<void> { }
64
65
async writeFile() {
66
throw new NotSupportedError();
67
}
68
//#endregion
69
}
70
71