public static async Task Publish(Packet pack) { var ap = new TcpCPublish(pack); byte[] reply = new byte[0]; try { using (SHA1 sha1 = SHA1.Create()) { byte[] apByt = Encoding.UTF8.GetBytes(ap.Description); byte[] appId = sha1.ComputeHash(apByt).Take(10).ToArray(); byte[] instByt = Encoding.UTF8.GetBytes(pack.Connection.Socket.RemoteEndPoint + "-" + ap); byte[] instId = sha1.ComputeHash(instByt).Take(10).ToArray(); var pa = new AppManager.PublishedApp() { AppId = appId, Connection = pack.Connection, InstanceId = instId, Description = ap.Description }; AppManager.PublishedApps.Add(pa); TcpManager.AppsByConnection[pack.Connection.Socket].Add(pa); reply = new TcpSPublishReply(true, appId, instId, pack.Nonce).Build(); } } catch (Exception e) { Log.Error(e, "Error while publishing an app"); reply = new TcpSPublishReply(false, new byte[10], new byte[10], pack.Nonce).Build(); } await pack.Connection.Stream.WriteAsync(reply); }
/// <summary> /// Publishes a new app to the entry point /// </summary> /// <param name="description">The app description</param> /// <param name="callback">A callback for when connections become established</param> /// <returns>A task</returns> public async Task Publish(string description, ConnectionEstablishCallback callback) { if (_tcp == null || !_tcp.Connected) { return; } uint n = Packet.WatchNonce(async packet => { await Task.Run(() => { TcpSPublishReply repl = new TcpSPublishReply(packet); _registeredApps.Add(new StoredApp() { AppId = repl.AppId, Callback = callback, Description = description, InstanceId = repl.InstanceId }); Log.Debug("App {Description} ({AppId}) registered as instance {InstanceId}", description, repl.ReadableAppId, repl.ReadableInstanceId); }); }); var pub = new TcpCPublish(description, n); TransmitRaw(pub); }