internal LauncherClient(Finsemble bridge) { this.bridge = bridge; routerClient = bridge.RouterClient; windowClient = bridge.WindowClient; // Window Groups windowClient.GetComponentState(new JObject { ["field"] = "finsemble:windowGroups" }, (err, groups) => { if (groups.response != null) { AddToGroups(new JObject { ["groupNames"] = groups.response }, SubscribeToGroupUpdates); } }); // Heartbeat timer.Interval = 1000; timer.Elapsed += (sender, e) => { routerClient.Transmit("Finsemble.heartbeat", new JObject { ["type"] = "component", ["componentType"] = "finsemble", ["windowName"] = bridge.windowName }); }; timer.Enabled = true; }
internal Docking(Finsemble _bridge, string channel) { Application.Current.Dispatcher.Invoke(delegate //main thread { this.bridge = _bridge; routerClient = bridge.RouterClient; this.dockingChannel = channel; this.dockingWindow = bridge.window; this.dockingWindowName = bridge.windowName; dockingWindow.Loaded += Window_Loaded; dockingWindow.Closing += Window_Closing; dockingWindow.Activated += Window_Activated; dockingWindow.StateChanged += DockingWindow_StateChanged; bridge.Subscribe(dockingChannel, Got_Docking_Message); // Finsemble 2.3 routerClient.AddListener("FinsembleNativeActions." + bridge.windowName, Got_Docking_Message_Over_Router); // Finsemble 2.5+ //dockingWindow.GotMouseCapture += DockingWindow_GotMouseCapture; //dockingWindow.LostMouseCapture += DockingWindow_LostMouseCapture; //MouseWatcher.OnMouseInput += MouseWatcher_OnMouseInput; /*routerClient.AddListener("LauncherService.shutdownRequest", (s, e) => * { * sendCloseToFinsemble = false; * });*/ }); }
public Logger(Finsemble bridge) { routerClient = bridge.RouterClient; this.bridge = bridge; routerClient.Query("logger.service.register", new JObject { ["clientName"] = bridge.windowName, ["clientChannel"] = "finsemble.logger.client." + bridge.windowName, ["uuid"] = bridge.uuid, ["windowName"] = bridge.windowName }, new JObject { }, (s, a) => { }); }
internal StoreModel(JObject parameters, Finsemble bridge) { //store, name, global, values, clients if (parameters != null) { this.name = (string)parameters["name"]; this.global = (bool)parameters["global"]; this.values = parameters["values"] as JObject; // these come back but are currently not used for global stores. this.clients = parameters["clients"] as JObject; } routerClient = bridge.RouterClient; }
internal ConfigClient(Finsemble bridge) { this.bridge = bridge; this.routerClient = bridge.RouterClient; }
internal AuthenticationClient(Finsemble bridge) { this.bridge = bridge; routerClient = bridge.RouterClient; }
internal StorageClient(Finsemble bridge) { this.routerClient = bridge.RouterClient; }
public void ShutdownApplication() { RouterClient.Transmit("Application.shutdown", new JObject { }); }
private void Disconnect() { if (disconnecting) { return; } disconnecting = true; Logger.Info("Disconnect called"); // Clean up clients that require disposing try { if (logger != null) { logger.Dispose(); } } catch { } finally { logger = null; } try { if (LauncherClient != null) { LauncherClient.Dispose(); } } catch { } finally { LauncherClient = null; } try { if (RouterClient != null) { RouterClient.Transmit("Finsemble.Assimilation.closed." + this.windowName, true); RouterClient.Dispose(); } } catch { } finally { } // Close appropriate connection if (socket != null) { socket.Close(); socket = null; } // Notify listeners bridge is disconnected from OpenFin Disconnected?.Invoke(this, EventArgs.Empty); }
private void RPC(string endpoint, List <JToken> args, EventHandler <FinsembleEventArgs> cb) { switch (endpoint) { case "RouterClient.transmit": RouterClient.Transmit((string)args[0], args[1]); break; case "RouterClient.addListener": RouterClient.AddListener((string)args[0], cb); break; case "RouterClient.removeListener": RouterClient.RemoveListener((string)args[0], cb); break; case "RouterClient.publish": RouterClient.Publish((string)args[0], args[1]); break; case "RouterClient.subscribe": RouterClient.Subscribe((string)args[0], cb); break; case "RouterClient.unsubscribe": RouterClient.Unsubscribe((string)args[0], cb); break; case "RouterClient.query": RouterClient.Query((string)args[0], args[1], args[2] as JObject, cb); break; case "LinkerClient.publish": LinkerClient.Publish(args[0] as JObject); break; case "LinkerClient.subscribe": LinkerClient.Subscribe((string)args[0], cb); break; case "LauncherClient.spawn": LauncherClient.Spawn((string)args[0], args[1] as JObject, cb); break; case "LauncherClient.showWindow": LauncherClient.ShowWindow(args[0] as JObject, args[1] as JObject, cb); break; case "ConfigClient.getValue": ConfigClient.GetValue(args[0] as JObject, cb); break; case "AuthenticationClient.publishAuthorization": authenticationClient.PublishAuthorization <JObject>((string)args[0], args[1] as JObject); break; case "AuthenticationClient.getCurrentCredentials": authenticationClient.GetCurrentCredentials <JObject>((s, a) => { cb(this, new FinsembleEventArgs(null, a)); }); break; case "Logger.error": JToken[] argsArray = args.ToArray(); logger.Error(argsArray); break; case "Logger.warn": logger.Warn(args.ToArray()); break; case "Logger.log": logger.Log(args.ToArray()); break; case "Logger.info": logger.Info(args.ToArray()); break; case "Logger.debug": logger.Debug(args.ToArray()); break; case "Logger.verbose": logger.Verbose(args.ToArray()); break; default: throw new Exception("This API does not exist or is not yet supported"); } }
private void ElectronConnect() { if (socket != null && socket.State != WebSocketState.Closed) { Logger.Warn("Multiple attempts to connect web socket"); return; } if (socket != null && socket.State == WebSocketState.Connecting) { return; } if (string.IsNullOrWhiteSpace(serverAddress)) { throw new ArgumentException("IAC is enabled, but no server address was specified."); } socket = new WebSocket(serverAddress + "/router"); socket.Opened += (sender, args) => { Logger.Info("Web socket connection opened"); RouterClient = new RouterClient(this, Connect); RouterClient.Init(); }; socket.Error += (sender, args) => { var retryAfter = 100; if (socketRetryAttempts >= 20) { Logger.Warn("Socket Connection Still Failing after 20 attempts"); retryAfter = 500; } // Keep trying to connect. When large numbers of socket connections are made simultaneously, the connection fails and we get here. socketRetryAttempts++; isFinsembleConnected = false; Disconnected?.Invoke(this, EventArgs.Empty); Thread.Sleep(retryAfter); ElectronConnect(); }; if (socket.State == WebSocketState.Connecting) { return; } socket.Open(); socket.Closed += (s, e) => { var retryAfter = 100; if (socketRetryAttempts >= 20) { Logger.Warn("Socket Connection Still Failing after 20 attempts"); retryAfter = 500; } // Keep trying to connect. When large numbers of socket connections are made simultaneously, the connection fails and we get here. socketRetryAttempts++; isFinsembleConnected = false; Disconnected?.Invoke(this, EventArgs.Empty); Thread.Sleep(retryAfter); ElectronConnect(); Console.WriteLine("Web socket connection disconnected."); }; }
public DragAndDropClient(Finsemble bridge) { this.bridge = bridge; routerClient = bridge.RouterClient; routerClient.AddListener(DRAG_START_CHANNEL, (s, args) => { if (scrim == null) { return; } var dataBeingShared = (args.response?["data"] as JArray).ToObject <List <string> >(); dynamic a = scrim; if ((string)args.response["header"]["origin"] != "RouterClient." + bridge.windowName && CanReceiveData(dataBeingShared)) { Application.Current.Dispatcher.Invoke(delegate { scrim.AllowDrop = true; try { a.Text = "*"; } catch { try { a.Content = "*"; } catch { } } scrim.Background = new SolidColorBrush(Color.FromArgb(237, 32, 104, 195)); scrim.Visibility = Visibility.Visible; }); } else { Application.Current.Dispatcher.Invoke(delegate { scrim.AllowDrop = false; try { a.Text = "D"; } catch { try { a.Content = "D"; } catch { } } scrim.Background = new SolidColorBrush(Color.FromArgb(237, 150, 10, 5)); scrim.Visibility = Visibility.Visible; }); } }); routerClient.AddListener(DRAG_END_CHANNEL, (s, args) => { if (scrim == null) { return; } Application.Current.Dispatcher.Invoke(delegate { scrim.Visibility = Visibility.Hidden; }); }); }
//private bool _useExplicitChannels = false; internal LinkerClient(Finsemble bridge, EventHandler <bool> readyCallback) { this.bridge = bridge; windowClient = bridge.WindowClient; routerClient = bridge.RouterClient; launcherClient = bridge.LauncherClient; key = (bridge.windowName + "::" + bridge.uuid).Replace('.', '_'); var storehandler = (EventHandler <StoreModel>) delegate(object sender, StoreModel store) { linkerStore = store; linkerStore.GetValue(new JObject { ["field"] = "channels" }, delegate(object sender2, FinsembleEventArgs args) { allChannels = args.response?["data"] as JArray; var linkerStateHandler = (EventHandler <FinsembleEventArgs>) delegate(object sender3, FinsembleEventArgs args3) { //MessageBox.Show(args3?.response.ToString()); if (args3.response != null && args3.response.HasValues) { channels = args3.response as JArray; } else { channels = new JArray { }; } //MessageBox.Show(bridge.window, channels.ToString(), "", MessageBoxButton.YesNo); //if (channels == null) var clientsInStore = new JObject { }; foreach (var item in channels) { clientsInStore[(string)item] = true; } clients[key] = new JObject { ["client"] = windowClient.windowIdentifier, ["active"] = true, ["channels"] = clientsInStore }; readyToPersistState = true; UpdateClientInStore(key); stateChangeListeners?.Invoke(this, new FinsembleEventArgs ( null, new JObject { ["channels"] = channels, ["allChannels"] = allChannels } )); readyCallback(this, true); }; bridge.WindowClient.GetComponentState(new JObject { ["field"] = "Finsemble_Linker" }, linkerStateHandler); }); linkerStore.AddListener(new JObject { ["field"] = "clients." + key }, delegate(object sender4, FinsembleEventArgs args4) { var newChannelsObject = args4.response?["data"]?["value"]?["channels"] as JObject; var newChannelsArray = new JArray { }; if (newChannelsObject != null) { foreach (var item in newChannelsObject) { newChannelsArray.Add(item.Key); } } channels = newChannelsArray; stateChangeListeners?.Invoke(this, new FinsembleEventArgs ( null, new JObject { ["channels"] = channels, ["allChannels"] = allChannels } )); if (readyToPersistState) { PersistState(); } UpdateListeners(); }); linkerStore.AddListener(null, delegate(object sender4, FinsembleEventArgs args4) { var newAllChannels = args4.response?["data"]?["storeData"]?["values"]?["channels"] as JArray; if (newAllChannels != null) { allChannels = newAllChannels; } clients = args4.response?["data"]?["storeData"]?["values"]?["clients"] as JObject; if (clients == null) { clients = new JObject { } } ; }); }; bridge.distributedStoreClient.GetStore(new JObject { ["store"] = "Finsemble_Linker", ["global"] = true }, storehandler); }