diff --git a/demo/src/setup.common.ts b/demo/src/setup.common.ts index a34eb8c2..732ccfe3 100644 --- a/demo/src/setup.common.ts +++ b/demo/src/setup.common.ts @@ -11,6 +11,7 @@ import { RegisteredReadOnlyFile, createIndexedDBProviders, registerHTMLFileSystemProvider, + createHTMLFileSystemProvider, registerFileSystemOverlay, initFile } from '@codingame/monaco-vscode-files-service-override' @@ -18,7 +19,8 @@ import * as monaco from 'monaco-editor' import { IWorkbenchConstructionOptions, LogLevel, - IEditorOverrideServices + IEditorOverrideServices, + IWorkspace } from '@codingame/monaco-vscode-api' import * as vscode from 'vscode' import getModelServiceOverride from '@codingame/monaco-vscode-model-service-override' @@ -104,12 +106,14 @@ params.delete('resetLayout') window.history.replaceState({}, document.title, url.href) -export let workspaceFile = monaco.Uri.file('/workspace.code-workspace') +let workspace: IWorkspace = { + workspaceUri: monaco.Uri.file('/workspace.code-workspace') +} export const userDataProvider = await createIndexedDBProviders() if (useHtmlFileSystemProvider) { - workspaceFile = monaco.Uri.from({ scheme: 'tmp', path: '/test.code-workspace' }) + const workspaceFile = monaco.Uri.from({ scheme: 'tmp', path: '/test.code-workspace' }) await initFile( workspaceFile, JSON.stringify( @@ -120,7 +124,9 @@ if (useHtmlFileSystemProvider) { 2 ) ) - + workspace = { + workspaceUri: workspaceFile + } registerHTMLFileSystemProvider() } else { const fileSystemProvider = new RegisteredFileSystemProvider(false) @@ -235,6 +241,7 @@ h1 { ) ) + const workspaceFile = monaco.Uri.file('/workspace.code-workspace') // Use a workspace file to be able to add another folder later (for the "Attach filesystem" button) fileSystemProvider.registerFile( new RegisteredMemoryFile( @@ -252,6 +259,9 @@ h1 { ) ) ) + workspace = { + workspaceUri: workspaceFile + } fileSystemProvider.registerFile( new RegisteredMemoryFile( @@ -267,6 +277,12 @@ h1 { ) registerFileSystemOverlay(1, fileSystemProvider) + + const htmlFileProvider = createHTMLFileSystemProvider() + htmlFileProvider.registerDirectoryHandle( + await (await navigator.storage.getDirectory()).getDirectoryHandle('workspace', { create: true }) + ) + registerFileSystemOverlay(2, htmlFileProvider) } // Workers @@ -336,9 +352,7 @@ export const constructOptions: IWorkbenchConstructionOptions = { }, workspace: remotePath == null - ? { - workspaceUri: workspaceFile - } + ? workspace : { folderUri: monaco.Uri.from({ scheme: 'vscode-remote', diff --git a/src/service-override/files.ts b/src/service-override/files.ts index bcb1e9ed..9a09d9d8 100644 --- a/src/service-override/files.ts +++ b/src/service-override/files.ts @@ -1014,6 +1014,26 @@ class DelegateFileSystemProvider implements IFileSystemProviderWithFileReadWrite ) } + readFileStream = + this.options.delegate.readFileStream != null + ? ( + resource: URI, + opts: IFileReadStreamOptions, + token: CancellationToken + ): ReadableStreamEvents => { + return this.options.delegate.readFileStream!( + this.options.toDelegate(resource), + opts, + token + ) + } + : () => { + throw createFileSystemProviderError( + 'No delegate', + FileSystemProviderErrorCode.Unavailable + ) + } + watch(resource: URI, opts: IWatchOptions): IDisposable { try { return this.options.delegate.watch(this.options.toDelegate(resource), opts) @@ -1283,11 +1303,7 @@ export async function createIndexedDBProviders(): Promise