Skip to content

Commit c88b9fb

Browse files
authored
Merge pull request #812 from CodinGame/demo-persistent-files
Demo persistent files
2 parents dc3fa6c + 928fe97 commit c88b9fb

2 files changed

Lines changed: 53 additions & 16 deletions

File tree

demo/src/setup.common.ts

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,16 @@ import {
1111
RegisteredReadOnlyFile,
1212
createIndexedDBProviders,
1313
registerHTMLFileSystemProvider,
14+
createHTMLFileSystemProvider,
1415
registerFileSystemOverlay,
1516
initFile
1617
} from '@codingame/monaco-vscode-files-service-override'
1718
import * as monaco from 'monaco-editor'
1819
import {
1920
IWorkbenchConstructionOptions,
2021
LogLevel,
21-
IEditorOverrideServices
22+
IEditorOverrideServices,
23+
IWorkspace
2224
} from '@codingame/monaco-vscode-api'
2325
import * as vscode from 'vscode'
2426
import getModelServiceOverride from '@codingame/monaco-vscode-model-service-override'
@@ -104,12 +106,14 @@ params.delete('resetLayout')
104106

105107
window.history.replaceState({}, document.title, url.href)
106108

107-
export let workspaceFile = monaco.Uri.file('/workspace.code-workspace')
109+
let workspace: IWorkspace = {
110+
workspaceUri: monaco.Uri.file('/workspace.code-workspace')
111+
}
108112

109113
export const userDataProvider = await createIndexedDBProviders()
110114

111115
if (useHtmlFileSystemProvider) {
112-
workspaceFile = monaco.Uri.from({ scheme: 'tmp', path: '/test.code-workspace' })
116+
const workspaceFile = monaco.Uri.from({ scheme: 'tmp', path: '/test.code-workspace' })
113117
await initFile(
114118
workspaceFile,
115119
JSON.stringify(
@@ -120,7 +124,9 @@ if (useHtmlFileSystemProvider) {
120124
2
121125
)
122126
)
123-
127+
workspace = {
128+
workspaceUri: workspaceFile
129+
}
124130
registerHTMLFileSystemProvider()
125131
} else {
126132
const fileSystemProvider = new RegisteredFileSystemProvider(false)
@@ -235,6 +241,7 @@ h1 {
235241
)
236242
)
237243

244+
const workspaceFile = monaco.Uri.file('/workspace.code-workspace')
238245
// Use a workspace file to be able to add another folder later (for the "Attach filesystem" button)
239246
fileSystemProvider.registerFile(
240247
new RegisteredMemoryFile(
@@ -252,6 +259,9 @@ h1 {
252259
)
253260
)
254261
)
262+
workspace = {
263+
workspaceUri: workspaceFile
264+
}
255265

256266
fileSystemProvider.registerFile(
257267
new RegisteredMemoryFile(
@@ -267,6 +277,12 @@ h1 {
267277
)
268278

269279
registerFileSystemOverlay(1, fileSystemProvider)
280+
281+
const htmlFileProvider = createHTMLFileSystemProvider()
282+
htmlFileProvider.registerDirectoryHandle(
283+
await (await navigator.storage.getDirectory()).getDirectoryHandle('workspace', { create: true })
284+
)
285+
registerFileSystemOverlay(2, htmlFileProvider)
270286
}
271287

272288
// Workers
@@ -336,9 +352,7 @@ export const constructOptions: IWorkbenchConstructionOptions = {
336352
},
337353
workspace:
338354
remotePath == null
339-
? {
340-
workspaceUri: workspaceFile
341-
}
355+
? workspace
342356
: {
343357
folderUri: monaco.Uri.from({
344358
scheme: 'vscode-remote',

src/service-override/files.ts

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1014,6 +1014,26 @@ class DelegateFileSystemProvider implements IFileSystemProviderWithFileReadWrite
10141014
)
10151015
}
10161016

1017+
readFileStream =
1018+
this.options.delegate.readFileStream != null
1019+
? (
1020+
resource: URI,
1021+
opts: IFileReadStreamOptions,
1022+
token: CancellationToken
1023+
): ReadableStreamEvents<Uint8Array> => {
1024+
return this.options.delegate.readFileStream!(
1025+
this.options.toDelegate(resource),
1026+
opts,
1027+
token
1028+
)
1029+
}
1030+
: () => {
1031+
throw createFileSystemProviderError(
1032+
'No delegate',
1033+
FileSystemProviderErrorCode.Unavailable
1034+
)
1035+
}
1036+
10171037
watch(resource: URI, opts: IWatchOptions): IDisposable {
10181038
try {
10191039
return this.options.delegate.watch(this.options.toDelegate(resource), opts)
@@ -1283,11 +1303,7 @@ export async function createIndexedDBProviders(): Promise<IndexedDBFileSystemPro
12831303
return userDataProvider
12841304
}
12851305

1286-
/**
1287-
* Can be used to replace the default filesystem provider by the HTMLFileSystemProvider before the fileService is initialized
1288-
* Should be called "after" createIndexedDBProviders if used
1289-
*/
1290-
export function registerHTMLFileSystemProvider(): void {
1306+
export function createHTMLFileSystemProvider(): HTMLFileSystemProvider {
12911307
class LazyLogService implements ILogService {
12921308
_serviceBrand: undefined
12931309
get onDidChangeLogLevel() {
@@ -1330,10 +1346,17 @@ export function registerHTMLFileSystemProvider(): void {
13301346
StandaloneServices.get(ILogService).dispose()
13311347
}
13321348
}
1333-
registerCustomProvider(
1334-
Schemas.file,
1335-
new HTMLFileSystemProvider(indexedDB, handlesStore, new LazyLogService())
1336-
)
1349+
return new HTMLFileSystemProvider(indexedDB, handlesStore, new LazyLogService())
1350+
}
1351+
1352+
/**
1353+
* Can be used to replace the default filesystem provider by the HTMLFileSystemProvider before the fileService is initialized
1354+
* Should be called "after" createIndexedDBProviders if used
1355+
*/
1356+
export function registerHTMLFileSystemProvider(): HTMLFileSystemProvider {
1357+
const provider = createHTMLFileSystemProvider()
1358+
registerCustomProvider(Schemas.file, provider)
1359+
return provider
13371360
}
13381361

13391362
/**

0 commit comments

Comments
 (0)