fix: avoid monaco memory leak

This commit is contained in:
Ruben Fiszel
2025-05-28 01:21:22 +02:00
parent feae9b0924
commit 0d459d5d22
5 changed files with 68 additions and 43 deletions
+4 -1
View File
@@ -115,7 +115,7 @@
import { workspaceStore } from '$lib/stores'
import { type Preview, ResourceService, UserService } from '$lib/gen'
import type { Text } from 'yjs'
import { initializeVscode } from '$lib/components/vscode'
import { initializeVscode, keepModelAroundToAvoidDisposalOfWorkers } from '$lib/components/vscode'
import { initializeMode } from 'monaco-graphql/esm/initializeMode.js'
import type { MonacoGraphQLAPI } from 'monaco-graphql/esm/api.js'
@@ -1266,6 +1266,8 @@
folding
})
keepModelAroundToAvoidDisposalOfWorkers()
// updateEditorKeybindingsMode(editor, 'vim', undefined)
let ataModel: NodeJS.Timeout | undefined = undefined
@@ -1355,6 +1357,7 @@
try {
closeWebsockets()
vimDisposable?.dispose()
console.log('disposing editor', editor, model)
model?.dispose()
editor && editor.dispose()
console.log('disposed editor')
+21 -10
View File
@@ -7,6 +7,16 @@
import '@codingame/monaco-vscode-standalone-css-language-features'
import '@codingame/monaco-vscode-standalone-typescript-language-features'
import '@codingame/monaco-vscode-standalone-html-language-features'
import {
editor as meditor,
KeyCode,
KeyMod,
Uri as mUri,
languages,
type IRange,
type IDisposable
} from 'monaco-editor'
languages.typescript.javascriptDefaults.setCompilerOptions({
target: languages.typescript.ScriptTarget.Latest,
allowNonTsExtensions: true,
@@ -44,15 +54,15 @@
import { BROWSER } from 'esm-env'
import { createHash, editorConfig, langToExt, updateOptions } from '$lib/editorUtils'
import {
editor as meditor,
KeyCode,
KeyMod,
Uri as mUri,
languages,
type IRange,
type IDisposable
} from 'monaco-editor'
// import {
// editor as meditor,
// KeyCode,
// KeyMod,
// Uri as mUri,
// languages,
// type IRange,
// type IDisposable
// } from 'monaco-editor'
import { allClasses } from './apps/editor/componentsPanel/cssUtils'
@@ -60,7 +70,7 @@
import libStdContent from '$lib/es6.d.ts.txt?raw'
import domContent from '$lib/dom.d.ts.txt?raw'
import { initializeVscode } from './vscode'
import { initializeVscode, keepModelAroundToAvoidDisposalOfWorkers } from './vscode'
import EditorTheme from './EditorTheme.svelte'
import { vimMode } from '$lib/stores'
import { initVim } from './monaco_keybindings'
@@ -348,6 +358,7 @@
snippetsPreventQuickSuggestions: disableSuggestions
}
})
keepModelAroundToAvoidDisposalOfWorkers()
let timeoutModel: NodeJS.Timeout | undefined = undefined
editor.onDidChangeModelContent((event) => {
@@ -1,3 +1,21 @@
<script module>
import '@codingame/monaco-vscode-standalone-typescript-language-features'
languages.typescript.javascriptDefaults.setCompilerOptions({
target: languages.typescript.ScriptTarget.Latest,
allowNonTsExtensions: true,
noSemanticValidation: false,
noLib: true,
moduleResolution: languages.typescript.ModuleResolutionKind.NodeJs
})
languages.typescript.javascriptDefaults.setDiagnosticsOptions({
noSemanticValidation: false,
noSyntaxValidation: false,
noSuggestionDiagnostics: false,
diagnosticCodesToIgnore: [1108]
})
</script>
<script lang="ts">
import { BROWSER } from 'esm-env'
import {
@@ -422,20 +440,6 @@
await initializeVscode('templateEditor')
console.log('initialized')
initialized = true
languages.typescript.javascriptDefaults.setCompilerOptions({
target: languages.typescript.ScriptTarget.Latest,
allowNonTsExtensions: true,
noSemanticValidation: false,
noLib: true,
moduleResolution: languages.typescript.ModuleResolutionKind.NodeJs
})
languages.typescript.javascriptDefaults.setDiagnosticsOptions({
noSemanticValidation: false,
noSyntaxValidation: false,
noSuggestionDiagnostics: false,
diagnosticCodesToIgnore: [1108]
})
languages.register({ id: 'template' })
@@ -161,15 +161,15 @@ export class Autocompletor {
modifiedCode: string = ''
applyZone:
| {
startLineNumber: number
endLineNumber: number
}
startLineNumber: number
endLineNumber: number
}
| undefined = undefined
lastChangePosition:
| {
lineNumber: number
column: number
}
lineNumber: number
column: number
}
| undefined = undefined
abortController: AbortController | undefined = undefined
@@ -180,12 +180,12 @@ export class Autocompletor {
predictedChange:
| {
position: {
lineNumber: number
column: number
}
distance: number
}
position: {
lineNumber: number
column: number
}
distance: number
}
| undefined = undefined
tabWidget: meditor.IContentWidget | undefined = undefined
@@ -240,18 +240,18 @@ export class Autocompletor {
let closestPosition:
| {
lineNumber: number
column: number
}
lineNumber: number
column: number
}
| undefined = undefined
let closestDistance = Infinity
for (const change of this.visualChanges) {
if (change.type === 'deleted') {
const distance = Math.min(
Math.abs(change.range.startLine - position.lineNumber) +
Math.abs(change.range.startColumn - position.column) / 10000,
Math.abs(change.range.startColumn - position.column) / 10000,
Math.abs(change.range.endLine - position.lineNumber) +
Math.abs(change.range.endColumn - position.column) / 10000
Math.abs(change.range.endColumn - position.column) / 10000
)
if (distance < closestDistance) {
closestDistance = distance
+8 -1
View File
@@ -4,7 +4,7 @@ import { initServices } from 'monaco-languageclient/vscode/services'
import getMonarchServiceOverride from '@codingame/monaco-vscode-monarch-service-override'
import '@codingame/monaco-vscode-standalone-typescript-language-features'
import getConfigurationServiceOverride from '@codingame/monaco-vscode-configuration-service-override'
import { editor as meditor } from 'monaco-editor/esm/vs/editor/editor.api'
import { editor as meditor, Uri as mUri } from 'monaco-editor'
export let isInitialized = false
export let isInitializing = false
@@ -267,3 +267,10 @@ export async function initializeVscode(caller?: string, htmlContainer?: HTMLElem
}
}
}
export function keepModelAroundToAvoidDisposalOfWorkers() {
const keepEditorUri = mUri.parse('file:///avoidDisposalOfWorkers')
if (!meditor?.getModel(keepEditorUri)) {
meditor.createModel('', 'typescript', keepEditorUri)
}
}