using Inspectron.Epson; using Inspectron.Epson.PrintServer; using Inspectron.Epson.PrintServer.ConfigurationSources; using Inspectron.Epson.PrintServer.JobSources; using Inspectron.Epson.PrintServer.JobStatusReporters; using Inspectron.Epson.PrintServer.PrinterAssinment; using Inspectron.Epson.PrintServer.Printers; using Inspectron.Epson.PrintServer.Printers.Utils; using Inspectron.Epson.PrintServer.PrintServices; using Inspectron.Epson.Queue; using Microsoft.Extensions.Logging; using Ninject; namespace EpsonPrintService; public class PrintServerBootstrapper { private readonly EpsonPrintServiceConfiguration _config; private readonly CancellationTokenSource _cts; private StandardKernel? _kernel; public bool IsRunning { get; private set; } public PrintServerBootstrapper(EpsonPrintServiceConfiguration config, CancellationTokenSource cts) { _config = config; _cts = cts; } public async Task StartAsync() { _kernel = new StandardKernel(); _kernel.Bind().To().InSingletonScope(); _kernel.Bind().ToConstant(new HttpClient { Timeout = TimeSpan.FromSeconds(30) }).InSingletonScope(); _kernel.Bind().ToConstant(_config); _kernel.Bind().To(); _kernel.Bind().To().InSingletonScope(); _kernel.Bind().To(); _kernel.Bind().ToMethod(ctx => { var loggerFactory = LoggerFactory.Create(builder => { builder.AddConsole(); builder.SetMinimumLevel(LogLevel.Trace); }); return loggerFactory.CreateLogger("EpsonPrintService"); }); _kernel.Bind().To().InSingletonScope(); _kernel.Bind().To(); _kernel.Bind().To().InSingletonScope(); _kernel.Bind().To(); _kernel.Bind().ToSelf().InSingletonScope(); _kernel.Bind().To().InSingletonScope(); _kernel.Bind().ToSelf().InSingletonScope(); _kernel.Bind().ToSelf().InSingletonScope(); var printLoop = _kernel.Get(); var discoveryTask = _kernel.Get(); var heartbeatTask = _kernel.Get(); var jobSourceTask = _kernel.Get(); // Start background tasks _ = discoveryTask.StartAsync(_cts.Token); _ = heartbeatTask.StartAsync(_cts.Token); // Delay for a moment to allow discovery to find printers Console.WriteLine("Waiting for printer discovery..."); await Task.Delay(3000); _ = jobSourceTask.StartAsync(); await printLoop.StartAsync(); IsRunning = true; Console.WriteLine("Print server started."); } }