using Avalonia.Platform;
using DodoSSH.Client.Terminal;
namespace DodoSSH.Client.Shell.Terminal;
///
/// Serves the renderer's files from the assembly's embedded resources.
///
///
/// Read once at startup and cached. The files are a few hundred kilobytes in total, dominated by the
/// xterm bundle, and a terminal that stalled on a resource stream read while output was arriving
/// would be a strange way to save a rounding error of memory.
///
internal sealed class AvaloniaTerminalAssetProvider : ITerminalAssetProvider
{
private const string ResourceRoot = "avares://DodoSSH.Client.Shell/WebAssets";
private static readonly (string Path, string File, string ContentType)[] Files =
[
(TerminalDataPlane.PagePath, "terminal.html", "text/html; charset=utf-8"),
("/terminal.js", "terminal.js", "text/javascript; charset=utf-8"),
("/terminal.css", "terminal.css", "text/css; charset=utf-8"),
("/vendor/xterm.js", "vendor/xterm.js", "text/javascript; charset=utf-8"),
("/vendor/xterm.css", "vendor/xterm.css", "text/css; charset=utf-8"),
("/vendor/addon-fit.js", "vendor/addon-fit.js", "text/javascript; charset=utf-8"),
("/vendor/addon-webgl.js", "vendor/addon-webgl.js", "text/javascript; charset=utf-8"),
];
private readonly Dictionary assets = new(StringComparer.Ordinal);
internal AvaloniaTerminalAssetProvider()
{
foreach (var (path, file, contentType) in Files)
{
using var stream = AssetLoader.Open(new Uri($"{ResourceRoot}/{file}", UriKind.Absolute));
using var buffer = new MemoryStream();
stream.CopyTo(buffer);
assets[path] = new TerminalAsset(contentType, buffer.ToArray());
}
}
///
public TerminalAsset? Find(string path) => assets.GetValueOrDefault(path);
}