Forge
csharpdeeb25a2
1#nullable enable
2
3using CascadeIDE.Features.MagicLink;
4using CascadeIDE.Services;
5
6namespace CascadeIDE.ViewModels;
7
8/// <summary>Magic link: pipe-сервер single-instance и обработка URI.</summary>
9public partial class MainWindowViewModel
10{
11 private readonly object _magicLinkGate = new();
12 private readonly Queue<string> _pendingMagicLinks = new();
13 private CancellationTokenSource? _magicLinkCts;
14
15 internal void StartMagicLinkListener()
16 {
17 _magicLinkCts?.Cancel();
18 _magicLinkCts?.Dispose();
19 _magicLinkCts = new CancellationTokenSource();
20 var token = _magicLinkCts.Token;
21
22 CideMagicLinkSingleInstance.RunPipeServerLoop(
23 uri => UiScheduler.Default.InvokeAsync(() => ProcessMagicLinkAsync(uri)),
24 token);
25 }
26
27 internal void StopMagicLinkListener()
28 {
29 _magicLinkCts?.Cancel();
30 _magicLinkCts?.Dispose();
31 _magicLinkCts = null;
32 }
33
34 public void EnqueueMagicLink(string uri)
35 {
36 lock (_magicLinkGate)
37 {
38 _pendingMagicLinks.Enqueue(uri);
39 }
40 }
41
42 internal async Task FlushPendingMagicLinksAsync()
43 {
44 while (true)
45 {
46 string? uri;
47 lock (_magicLinkGate)
48 {
49 if (_pendingMagicLinks.Count == 0)
50 return;
51 uri = _pendingMagicLinks.Dequeue();
52 }
53
54 await ProcessMagicLinkAsync(uri).ConfigureAwait(false);
55 }
56 }
57
58 private async Task ProcessMagicLinkAsync(string uri)
59 {
60 if (!CideMagicLinkUri.TryParse(uri, out var request, out _))
61 return;
62
63 await CideMagicLinkExecutor.TryExecuteAsync(this, request).ConfigureAwait(false);
64 }
65}
66
View only · write via MCP/CIDE