| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- using System.Text.Json;
- using Microsoft.AspNetCore.Builder;
- using Microsoft.AspNetCore.Hosting;
- using Microsoft.AspNetCore.Http;
- using Microsoft.Extensions.DependencyInjection;
- using Microsoft.Extensions.Logging;
- using SkiaSharp;
- namespace QuestPDF.Previewer;
- class CommunicationService
- {
- public static CommunicationService Instance { get; } = new ();
-
- public event Action<ICollection<PreviewPage>>? OnDocumentRefreshed;
- private WebApplication? Application { get; set; }
- private readonly JsonSerializerOptions JsonSerializerOptions = new()
- {
- PropertyNameCaseInsensitive = true
- };
- private CommunicationService()
- {
-
- }
-
- public Task Start(int port)
- {
- var builder = WebApplication.CreateBuilder();
- builder.Services.AddLogging(x => x.ClearProviders());
- builder.WebHost.UseKestrel(options => options.Limits.MaxRequestBodySize = null);
- Application = builder.Build();
- Application.MapGet("ping", HandlePing);
- Application.MapGet("version", HandleVersion);
- Application.MapPost("update/preview", HandleUpdatePreview);
-
- return Application.RunAsync($"http://localhost:{port}/");
- }
- public async Task Stop()
- {
- await Application.StopAsync();
- await Application.DisposeAsync();
- }
- private async Task<IResult> HandlePing()
- {
- return OnDocumentRefreshed == null
- ? Results.StatusCode(StatusCodes.Status503ServiceUnavailable)
- : Results.Ok();
- }
-
- private async Task<IResult> HandleVersion()
- {
- return Results.Json(GetType().Assembly.GetName().Version);
- }
-
- private async Task<IResult> HandleUpdatePreview(HttpRequest request)
- {
- var command = JsonSerializer.Deserialize<DocumentSnapshot>(request.Form["command"], JsonSerializerOptions);
- var pages = command
- .Pages
- .Select(page =>
- {
- using var stream = request.Form.Files[page.Id].OpenReadStream();
- var picture = SKPicture.Deserialize(stream);
-
- return new PreviewPage(picture, page.Width, page.Height);
- })
- .ToList();
- Task.Run(() => OnDocumentRefreshed(pages));
- return Results.Ok();
- }
- }
|