diff --git a/Esiur/Data/Codec.cs b/Esiur/Data/Codec.cs index 419fc2a..b5763aa 100644 --- a/Esiur/Data/Codec.cs +++ b/Esiur/Data/Codec.cs @@ -257,9 +257,9 @@ public static class Codec { var genericType = type.GetGenericTypeDefinition(); - if (genericType == typeof(DistributedPropertyContext<>)) + if (genericType == typeof(PropertyContext<>)) { - valueOrSource = ((IDistributedPropertyContext)valueOrSource).GetValue(connection); + valueOrSource = ((IPropertyContext)valueOrSource).GetValue(connection); } else if (genericType == typeof(Func<>)) { diff --git a/Esiur/Data/UUID.cs b/Esiur/Data/UUID.cs index 0b75029..7458d50 100644 --- a/Esiur/Data/UUID.cs +++ b/Esiur/Data/UUID.cs @@ -34,7 +34,7 @@ namespace Esiur.Data public UUID(byte[] data, uint offset) { - if (offset + 16 < data.Length) + if (offset + 16 > data.Length) throw new Exception("UUID data size must be at least 16 bytes"); Data = DC.Clip(data, offset, 16); diff --git a/Esiur/Net/IIP/DistributedConnectionProtocol.cs b/Esiur/Net/IIP/DistributedConnectionProtocol.cs index ae820b4..7a2420d 100644 --- a/Esiur/Net/IIP/DistributedConnectionProtocol.cs +++ b/Esiur/Net/IIP/DistributedConnectionProtocol.cs @@ -1909,7 +1909,7 @@ partial class DistributedConnection if (pi.PropertyType.IsGenericType && pi.PropertyType.GetGenericTypeDefinition() - == typeof(DistributedPropertyContext<>)) + == typeof(PropertyContext<>)) { value = Activator.CreateInstance(pi.PropertyType, this, value); //value = new DistributedPropertyContext(this, value); diff --git a/Esiur/Net/IIP/DistributedPropertyContext.cs b/Esiur/Net/IIP/PropertyContext.cs similarity index 55% rename from Esiur/Net/IIP/DistributedPropertyContext.cs rename to Esiur/Net/IIP/PropertyContext.cs index ddd800e..5532ea0 100644 --- a/Esiur/Net/IIP/DistributedPropertyContext.cs +++ b/Esiur/Net/IIP/PropertyContext.cs @@ -4,30 +4,30 @@ using System.Text; namespace Esiur.Net.IIP; -public interface IDistributedPropertyContext +public interface IPropertyContext { object GetValue(DistributedConnection connection); } -public class DistributedPropertyContext : IDistributedPropertyContext +public class PropertyContext : IPropertyContext { public T Value { get; private set; } public DistributedConnection Connection { get; private set; } public Func Method { get; private set; } - public DistributedPropertyContext(DistributedConnection connection, T value) + public PropertyContext(DistributedConnection connection, T value) { this.Value = value; this.Connection = connection; } - public DistributedPropertyContext(Func method) + public PropertyContext(Func method) { this.Method = method; } - public static implicit operator DistributedPropertyContext(Func method) - => new DistributedPropertyContext(method); + public static implicit operator PropertyContext(Func method) + => new PropertyContext(method); public object GetValue(DistributedConnection connection) { diff --git a/Esiur/Resource/Instance.cs b/Esiur/Resource/Instance.cs index b4d2e6a..333fb4d 100644 --- a/Esiur/Resource/Instance.cs +++ b/Esiur/Resource/Instance.cs @@ -352,7 +352,7 @@ public class Instance */ if (pt.PropertyInfo.PropertyType.IsGenericType - && pt.PropertyInfo.PropertyType.GetGenericTypeDefinition() == typeof(DistributedPropertyContext<>)) + && pt.PropertyInfo.PropertyType.GetGenericTypeDefinition() == typeof(PropertyContext<>)) return false; diff --git a/Esiur/Resource/Template/PropertyTemplate.cs b/Esiur/Resource/Template/PropertyTemplate.cs index 2a74636..ac73361 100644 --- a/Esiur/Resource/Template/PropertyTemplate.cs +++ b/Esiur/Resource/Template/PropertyTemplate.cs @@ -151,7 +151,7 @@ public class PropertyTemplate : MemberTemplate { var genericPropType = pi.PropertyType.IsGenericType ? pi.PropertyType.GetGenericTypeDefinition() : null; - var propType = genericPropType == typeof(DistributedPropertyContext<>) ? + var propType = genericPropType == typeof(PropertyContext<>) ? RepresentationType.FromType(pi.PropertyType.GetGenericArguments()[0]) : RepresentationType.FromType(pi.PropertyType); @@ -174,7 +174,7 @@ public class PropertyTemplate : MemberTemplate //var nullableAttr = pi.GetCustomAttribute(true); //var flags = ((byte[]) nullableAttr?.NullableFlags ?? new byte[0]).ToList(); - if (nullableAttrFlags.Count > 0 && genericPropType == typeof(DistributedPropertyContext<>)) + if (nullableAttrFlags.Count > 0 && genericPropType == typeof(PropertyContext<>)) nullableAttrFlags.RemoveAt(0); if (nullableContextAttrFlag == 2) diff --git a/Esiur/Resource/Template/TypeTemplate.cs b/Esiur/Resource/Template/TypeTemplate.cs index f450a0d..c1fd00f 100644 --- a/Esiur/Resource/Template/TypeTemplate.cs +++ b/Esiur/Resource/Template/TypeTemplate.cs @@ -191,7 +191,7 @@ public class TypeTemplate var genericTypeArgs = type.GetGenericArguments(); if (genericType == typeof(List<>) - || genericType == typeof(DistributedPropertyContext<>)) + || genericType == typeof(PropertyContext<>)) { return GetDistributedTypes(genericTypeArgs[0]); } diff --git a/Test/MyResource.cs b/Test/MyResource.cs index 5eab3bb..d05436d 100644 --- a/Test/MyResource.cs +++ b/Test/MyResource.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using static System.Runtime.InteropServices.JavaScript.JSType; namespace Test { @@ -19,5 +20,13 @@ namespace Test [Export] public string HelloParent() => "Hi from Parent"; + [Export] + [Annotation("This function computes the standard deviation of a list")] + public double StDev(double[] values) + { + double avg = values.Average(); + return Math.Sqrt(values.Average(v => Math.Pow(v - avg, 2))); + } + } } diff --git a/Test/MyService.cs b/Test/MyService.cs index c5aed4c..0df3d03 100644 --- a/Test/MyService.cs +++ b/Test/MyService.cs @@ -106,15 +106,28 @@ public partial class MyService [Export] object[] objectArray = new object[] { 1, 1.2f, Math.PI, "Hello World" }; [Export] - public DistributedPropertyContext PropertyContext + public PropertyContext PropertyContext { - get => new DistributedPropertyContext((sender) => sender.RemoteEndPoint.Port); + get => new PropertyContext((sender) => sender.RemoteEndPoint.Port); set { Console.WriteLine($"PropertyContext Set: {value.Value} {value.Connection.RemoteEndPoint.Port}"); } } + + int MyPasscode = 2025; + public PropertyContext Passcode + { + get => new ((sender) => sender.Session.AuthorizedAccount == "alice" ? MyPasscode : 0); + set + { + if (value.Connection.Session.AuthorizedAccount != "alice") + throw new Exception("Only Alice is allowed."); + MyPasscode = value.Value; + } + } + [Export] public SizeEnum Enum => SizeEnum.Medium; @@ -144,8 +157,11 @@ public partial class MyService Console.WriteLine("Void()"); [Export] - public void InvokeEvents(string msg) + public void InvokeEvents(string msg, InvocationContext context) { + if (context.Connection.Session.AuthorizedAccount != "Alice") + throw new Exception("Only Alice is allowed."); + StringEvent?.Invoke(msg); ArrayEvent?.Invoke(new object[] { DateTime.UtcNow, "Event", msg }); } diff --git a/Test/Program.cs b/Test/Program.cs index 3585aca..dd24691 100644 --- a/Test/Program.cs +++ b/Test/Program.cs @@ -82,29 +82,29 @@ namespace Test static async Task Main(string[] args) { - var x = LogLevel.Warning; + //var x = LogLevel.Warning; - TestSerialization(LogLevel.Warning); + //TestSerialization(LogLevel.Warning); - TestSerialization(new Map - { - ["C++"] = 1, - ["C#"] = 2, - ["JS"] = null - }); + //TestSerialization(new Map + //{ + // ["C++"] = 1, + // ["C#"] = 2, + // ["JS"] = null + //}); - TestSerialization(new StudentRecord() { Name = "Ali", Grade = 90 }); + //TestSerialization(new StudentRecord() { Name = "Ali", Grade = 90 }); - var tn = Encoding.UTF8.GetBytes("Test.StudentRecord"); - var hash = System.Security.Cryptography.SHA256.Create().ComputeHash(tn).Clip(0, 16); - hash[6] = (byte)((hash[6] & 0xF) | 0x80); - hash[8] = (byte)((hash[8] & 0xF) | 0x80); + //var tn = Encoding.UTF8.GetBytes("Test.StudentRecord"); + //var hash = System.Security.Cryptography.SHA256.Create().ComputeHash(tn).Clip(0, 16); + //hash[6] = (byte)((hash[6] & 0xF) | 0x80); + //hash[8] = (byte)((hash[8] & 0xF) | 0x80); - var g = new UUID(hash); + //var g = new UUID(hash); - Console.WriteLine(g); + //Console.WriteLine(g); var hhhh = Warehouse.GetTemplateByType(typeof(IMyRecord)); @@ -148,7 +148,7 @@ namespace Test var res3 = await Warehouse.Put("sys/service/c1", new MyChildResource() { ChildName = "Child 1", Description = "Child Testing 3", CategoryId = 12 }); var res4 = await Warehouse.Put("sys/service/c2", new MyChildResource() { ChildName = "Child 2 Destroy", Description = "Testing Destroy Handler", CategoryId = 12 }); - TestSerialization(res1); + //TestSerialization(res1); server.MapCall("Hello", (string msg, DateTime time, DistributedConnection sender) => {