From cb7f168125f597e6ab12ace3b7b73b8544a12724 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Mangeonjean?= Date: Thu, 18 Jun 2026 19:25:51 +0200 Subject: [PATCH 1/4] fix: implement missing readFileStream --- src/service-override/files.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/service-override/files.ts b/src/service-override/files.ts index bcb1e9ed..ab50c51a 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) From 641f6929913889489d41ec8902c0254a7eb739d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Mangeonjean?= Date: Thu, 18 Jun 2026 19:26:13 +0200 Subject: [PATCH 2/4] feat: expose createHTMLFileSystemProvider --- src/service-override/files.ts | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/service-override/files.ts b/src/service-override/files.ts index ab50c51a..9a09d9d8 100644 --- a/src/service-override/files.ts +++ b/src/service-override/files.ts @@ -1303,11 +1303,7 @@ export async function createIndexedDBProviders(): Promise Date: Thu, 18 Jun 2026 19:27:56 +0200 Subject: [PATCH 3/4] refactor(demo): store the whole workspace --- demo/src/setup.common.ts | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/demo/src/setup.common.ts b/demo/src/setup.common.ts index a34eb8c2..478ac8e4 100644 --- a/demo/src/setup.common.ts +++ b/demo/src/setup.common.ts @@ -18,7 +18,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 +105,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 +123,9 @@ if (useHtmlFileSystemProvider) { 2 ) ) - + workspace = { + workspaceUri: workspaceFile + } registerHTMLFileSystemProvider() } else { const fileSystemProvider = new RegisteredFileSystemProvider(false) @@ -235,6 +240,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 +258,9 @@ h1 { ) ) ) + workspace = { + workspaceUri: workspaceFile + } fileSystemProvider.registerFile( new RegisteredMemoryFile( @@ -336,9 +345,7 @@ export const constructOptions: IWorkbenchConstructionOptions = { }, workspace: remotePath == null - ? { - workspaceUri: workspaceFile - } + ? workspace : { folderUri: monaco.Uri.from({ scheme: 'vscode-remote', From 928fe97a0f403b15fe7b5dff103a79726eecdeb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Mangeonjean?= Date: Thu, 18 Jun 2026 19:28:42 +0200 Subject: [PATCH 4/4] feat(demo): add persistent filesystem overlay base on the HTMLFileSystemProvider --- demo/src/setup.common.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/demo/src/setup.common.ts b/demo/src/setup.common.ts index 478ac8e4..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' @@ -276,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