Path: blob/main/src/vs/workbench/contrib/editSessions/browser/editSessionsFileSystemProvider.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { Disposable, IDisposable } from '../../../../base/common/lifecycle.js';6import { Event } from '../../../../base/common/event.js';7import { URI } from '../../../../base/common/uri.js';8import { FilePermission, FileSystemProviderCapabilities, FileSystemProviderErrorCode, FileType, IFileDeleteOptions, IFileOverwriteOptions, IFileSystemProviderWithFileReadWriteCapability, IStat, IWatchOptions } from '../../../../platform/files/common/files.js';9import { ChangeType, decodeEditSessionFileContent, EDIT_SESSIONS_SCHEME, EditSession, IEditSessionsStorageService } from '../common/editSessions.js';10import { NotSupportedError } from '../../../../base/common/errors.js';1112export class EditSessionsFileSystemProvider implements IFileSystemProviderWithFileReadWriteCapability {1314static readonly SCHEMA = EDIT_SESSIONS_SCHEME;1516constructor(17@IEditSessionsStorageService private editSessionsStorageService: IEditSessionsStorageService,18) { }1920readonly capabilities: FileSystemProviderCapabilities = FileSystemProviderCapabilities.Readonly + FileSystemProviderCapabilities.FileReadWrite;2122async readFile(resource: URI): Promise<Uint8Array> {23const match = /(?<ref>[^/]+)\/(?<folderName>[^/]+)\/(?<filePath>.*)/.exec(resource.path.substring(1));24if (!match?.groups) {25throw FileSystemProviderErrorCode.FileNotFound;26}27const { ref, folderName, filePath } = match.groups;28const data = await this.editSessionsStorageService.read('editSessions', ref);29if (!data) {30throw FileSystemProviderErrorCode.FileNotFound;31}32const content: EditSession = JSON.parse(data.content);33const change = content.folders.find((f) => f.name === folderName)?.workingChanges.find((change) => change.relativeFilePath === filePath);34if (!change || change.type === ChangeType.Deletion) {35throw FileSystemProviderErrorCode.FileNotFound;36}37return decodeEditSessionFileContent(content.version, change.contents).buffer;38}3940async stat(resource: URI): Promise<IStat> {41const content = await this.readFile(resource);42const currentTime = Date.now();43return {44type: FileType.File,45permissions: FilePermission.Readonly,46mtime: currentTime,47ctime: currentTime,48size: content.byteLength49};50}5152//#region Unsupported file operations53readonly onDidChangeCapabilities = Event.None;54readonly onDidChangeFile = Event.None;5556watch(resource: URI, opts: IWatchOptions): IDisposable { return Disposable.None; }5758async mkdir(resource: URI): Promise<void> { }59async readdir(resource: URI): Promise<[string, FileType][]> { return []; }6061async rename(from: URI, to: URI, opts: IFileOverwriteOptions): Promise<void> { }62async delete(resource: URI, opts: IFileDeleteOptions): Promise<void> { }6364async writeFile() {65throw new NotSupportedError();66}67//#endregion68}697071