Add dispose flag
This commit is contained in:
parent
624911d6ec
commit
84912bac46
|
@ -10,11 +10,13 @@ namespace Ooui.AspNetCore
|
||||||
{
|
{
|
||||||
readonly Element element;
|
readonly Element element;
|
||||||
readonly string title;
|
readonly string title;
|
||||||
|
readonly bool disposeWhenDone;
|
||||||
|
|
||||||
public ElementResult (Element element, string title = "")
|
public ElementResult (Element element, string title = "", bool disposeWhenDone = true)
|
||||||
{
|
{
|
||||||
this.element = element;
|
this.element = element;
|
||||||
this.title = title;
|
this.title = title;
|
||||||
|
this.disposeWhenDone = disposeWhenDone;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task ExecuteResultAsync (ActionContext context)
|
public override async Task ExecuteResultAsync (ActionContext context)
|
||||||
|
@ -29,7 +31,7 @@ namespace Ooui.AspNetCore
|
||||||
element.Style.Height = GetCookieDouble (context.HttpContext.Request.Cookies, "oouiWindowHeight", 24, 480, 10000);
|
element.Style.Height = GetCookieDouble (context.HttpContext.Request.Cookies, "oouiWindowHeight", 24, 480, 10000);
|
||||||
}
|
}
|
||||||
|
|
||||||
var sessionId = WebSocketHandler.BeginSession (context.HttpContext, element);
|
var sessionId = WebSocketHandler.BeginSession (context.HttpContext, element, disposeWhenDone);
|
||||||
var initialHtml = element.OuterHtml;
|
var initialHtml = element.OuterHtml;
|
||||||
var html = UI.RenderTemplate (WebSocketHandler.WebSocketPath + "?id=" + sessionId, title: title, initialHtml: initialHtml);
|
var html = UI.RenderTemplate (WebSocketHandler.WebSocketPath + "?id=" + sessionId, title: title, initialHtml: initialHtml);
|
||||||
var htmlBytes = Encoding.UTF8.GetBytes (html);
|
var htmlBytes = Encoding.UTF8.GetBytes (html);
|
||||||
|
|
|
@ -16,13 +16,14 @@ namespace Ooui.AspNetCore
|
||||||
static readonly ConcurrentDictionary<string, PendingSession> pendingSessions =
|
static readonly ConcurrentDictionary<string, PendingSession> pendingSessions =
|
||||||
new ConcurrentDictionary<string, PendingSession> ();
|
new ConcurrentDictionary<string, PendingSession> ();
|
||||||
|
|
||||||
public static string BeginSession (HttpContext context, Element element)
|
public static string BeginSession (HttpContext context, Element element, bool disposeElementWhenDone)
|
||||||
{
|
{
|
||||||
var id = Guid.NewGuid ().ToString ("N");
|
var id = Guid.NewGuid ().ToString ("N");
|
||||||
|
|
||||||
var s = new PendingSession {
|
var s = new PendingSession {
|
||||||
Element = element,
|
Element = element,
|
||||||
CreateTimeUtc = DateTime.UtcNow,
|
CreateTimeUtc = DateTime.UtcNow,
|
||||||
|
DisposeElementWhenDone = disposeElementWhenDone,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!pendingSessions.TryAdd (id, s)) {
|
if (!pendingSessions.TryAdd (id, s)) {
|
||||||
|
@ -97,7 +98,7 @@ namespace Ooui.AspNetCore
|
||||||
//
|
//
|
||||||
var token = CancellationToken.None;
|
var token = CancellationToken.None;
|
||||||
var webSocket = await context.WebSockets.AcceptWebSocketAsync ("ooui");
|
var webSocket = await context.WebSockets.AcceptWebSocketAsync ("ooui");
|
||||||
var session = new Ooui.WebSocketSession (webSocket, activeSession.Element, w, h, token);
|
var session = new Ooui.WebSocketSession (webSocket, activeSession.Element, activeSession.DisposeElementWhenDone, w, h, token);
|
||||||
await session.RunAsync ().ConfigureAwait (false);
|
await session.RunAsync ().ConfigureAwait (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,6 +106,7 @@ namespace Ooui.AspNetCore
|
||||||
{
|
{
|
||||||
public Element Element;
|
public Element Element;
|
||||||
public DateTime CreateTimeUtc;
|
public DateTime CreateTimeUtc;
|
||||||
|
public bool DisposeElementWhenDone;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
21
Ooui/UI.cs
21
Ooui/UI.cs
|
@ -95,14 +95,14 @@ namespace Ooui
|
||||||
Start ();
|
Start ();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Publish (string path, Func<Element> elementCtor)
|
public static void Publish (string path, Func<Element> elementCtor, bool disposeElementWhenDone = true)
|
||||||
{
|
{
|
||||||
Publish (path, new ElementHandler (elementCtor));
|
Publish (path, new ElementHandler (elementCtor, disposeElementWhenDone));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Publish (string path, Element element)
|
public static void Publish (string path, Element element, bool disposeElementWhenDone = true)
|
||||||
{
|
{
|
||||||
Publish (path, () => element);
|
Publish (path, () => element, disposeElementWhenDone);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void PublishFile (string filePath)
|
public static void PublishFile (string filePath)
|
||||||
|
@ -334,9 +334,12 @@ namespace Ooui
|
||||||
{
|
{
|
||||||
readonly Lazy<Element> element;
|
readonly Lazy<Element> element;
|
||||||
|
|
||||||
public ElementHandler (Func<Element> ctor)
|
public bool DisposeElementWhenDone { get; }
|
||||||
|
|
||||||
|
public ElementHandler (Func<Element> ctor, bool disposeElementWhenDone)
|
||||||
{
|
{
|
||||||
element = new Lazy<Element> (ctor);
|
element = new Lazy<Element> (ctor);
|
||||||
|
DisposeElementWhenDone = disposeElementWhenDone;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Element GetElement () => element.Value;
|
public Element GetElement () => element.Value;
|
||||||
|
@ -513,8 +516,10 @@ namespace Ooui
|
||||||
}
|
}
|
||||||
|
|
||||||
Element element = null;
|
Element element = null;
|
||||||
|
bool disposeElementWhenDone = true;
|
||||||
try {
|
try {
|
||||||
element = elementHandler.GetElement ();
|
element = elementHandler.GetElement ();
|
||||||
|
disposeElementWhenDone = elementHandler.DisposeElementWhenDone;
|
||||||
|
|
||||||
if (element == null)
|
if (element == null)
|
||||||
throw new Exception ("Handler returned a null element");
|
throw new Exception ("Handler returned a null element");
|
||||||
|
@ -568,7 +573,7 @@ namespace Ooui
|
||||||
// Create a new session and let it handle everything from here
|
// Create a new session and let it handle everything from here
|
||||||
//
|
//
|
||||||
try {
|
try {
|
||||||
var session = new WebSocketSession (webSocket, element, w, h, serverToken);
|
var session = new WebSocketSession (webSocket, element, disposeElementWhenDone, w, h, serverToken);
|
||||||
await session.RunAsync ().ConfigureAwait (false);
|
await session.RunAsync ().ConfigureAwait (false);
|
||||||
}
|
}
|
||||||
catch (System.Net.WebSockets.WebSocketException ex) when (ex.WebSocketErrorCode == System.Net.WebSockets.WebSocketError.ConnectionClosedPrematurely) {
|
catch (System.Net.WebSockets.WebSocketException ex) when (ex.WebSocketErrorCode == System.Net.WebSockets.WebSocketError.ConnectionClosedPrematurely) {
|
||||||
|
@ -599,8 +604,10 @@ namespace Ooui
|
||||||
lock (publishedPaths) {
|
lock (publishedPaths) {
|
||||||
publishedPaths.TryGetValue (elementPath, out handler);
|
publishedPaths.TryGetValue (elementPath, out handler);
|
||||||
}
|
}
|
||||||
|
var disposeElementWhenDone = true;
|
||||||
if (handler is ElementHandler eh) {
|
if (handler is ElementHandler eh) {
|
||||||
element = eh.GetElement ();
|
element = eh.GetElement ();
|
||||||
|
disposeElementWhenDone = eh.DisposeElementWhenDone;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
element = new Div ();
|
element = new Div ();
|
||||||
|
@ -609,7 +616,7 @@ namespace Ooui
|
||||||
var ops = initialSize.Split (' ');
|
var ops = initialSize.Split (' ');
|
||||||
var initialWidth = double.Parse (ops[0]);
|
var initialWidth = double.Parse (ops[0]);
|
||||||
var initialHeight = double.Parse (ops[1]);
|
var initialHeight = double.Parse (ops[1]);
|
||||||
var g = new WebAssemblySession (sessionId, element, initialWidth, initialHeight);
|
var g = new WebAssemblySession (sessionId, element, disposeElementWhenDone, initialWidth, initialHeight);
|
||||||
lock (globalElementSessions) {
|
lock (globalElementSessions) {
|
||||||
globalElementSessions[sessionId] = g;
|
globalElementSessions[sessionId] = g;
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@ namespace Ooui
|
||||||
readonly string id;
|
readonly string id;
|
||||||
readonly Action<Message> handleElementMessageSent;
|
readonly Action<Message> handleElementMessageSent;
|
||||||
|
|
||||||
public WebAssemblySession (string id, Element element, double initialWidth, double initialHeight)
|
public WebAssemblySession (string id, Element element, bool disposeElementWhenDone, double initialWidth, double initialHeight)
|
||||||
: base (element, initialWidth, initialHeight)
|
: base (element, initialWidth, initialHeight)
|
||||||
{
|
{
|
||||||
this.id = id;
|
this.id = id;
|
||||||
|
|
|
@ -23,7 +23,7 @@ namespace Ooui
|
||||||
DateTime lastTransmitTime = DateTime.MinValue;
|
DateTime lastTransmitTime = DateTime.MinValue;
|
||||||
readonly TimeSpan throttleInterval = TimeSpan.FromSeconds (1.0 / UI.MaxFps);
|
readonly TimeSpan throttleInterval = TimeSpan.FromSeconds (1.0 / UI.MaxFps);
|
||||||
|
|
||||||
public WebSocketSession (WebSocket webSocket, Element element, double initialWidth, double initialHeight, CancellationToken serverToken)
|
public WebSocketSession (WebSocket webSocket, Element element, bool disposeElementWhenDone, double initialWidth, double initialHeight, CancellationToken serverToken)
|
||||||
: base (element, initialWidth, initialHeight)
|
: base (element, initialWidth, initialHeight)
|
||||||
{
|
{
|
||||||
this.webSocket = webSocket;
|
this.webSocket = webSocket;
|
||||||
|
|
Loading…
Reference in New Issue