private void setup() { cache = new Dictionary <string, object>(); cacheKeys = new List <string>(); server.getStream((success, response) => { if (!success) { OnError?.Invoke(this, new SpeckleEventArgs("Failed to retrieve stream.")); return; } streamFound = true; streamLiveInstance = response; // this will fail!!! setupWebsocket(); }); // ready is defined as: streamId exists && wsSessionId && streamWas found. isReadyCheck = new System.Timers.Timer(150); isReadyCheck.AutoReset = false; isReadyCheck.Enabled = true; isReadyCheck.Elapsed += (sender, e) => { if (server.streamId == null) { isReadyCheck.Start(); return; } if (server.wsSessionId == null) { isReadyCheck.Start(); return; } if (!streamFound) { isReadyCheck.Start(); return; } getObjects(streamLiveInstance as ExpandoObject, (castObjects) => { dynamic eventData = new ExpandoObject(); eventData.objects = castObjects; eventData.layers = SpeckleLayer.fromExpandoList(streamLiveInstance.layers); eventData.name = streamLiveInstance.name; OnReady?.Invoke(this, new SpeckleEventArgs("receiver ready", eventData)); }); }; }
private void setup() { if (server.streamId == null) { server.createNewStream((success, data) => { if (!success) { OnError?.Invoke(this, new SpeckleEventArgs("Failed to create stream.")); return; } server.streamId = data.streamId; setupWebsocket(); }); } else { server.getStream((success, data) => { if (!success) { OnError?.Invoke(this, new SpeckleEventArgs("Failed to retrieve stream.")); return; } setupWebsocket(); }); } // start the is ready checker timer. // "ready" is defined as: // a) we have a valid stream id (means we've contacted the server sucessfully) // && b) we have a live wsSessionId (means sockets were correctly initialised) isReadyCheck = new System.Timers.Timer(150); isReadyCheck.AutoReset = false; isReadyCheck.Enabled = true; isReadyCheck.Elapsed += (sender, e) => { if (server.streamId == null) { isReadyCheck.Start(); return; } if (server.wsSessionId == null) { isReadyCheck.Start(); return; } dynamic data = new ExpandoObject(); data.streamId = server.streamId; data.wsSessionId = server.wsSessionId; OnReady?.Invoke(this, new SpeckleEventArgs("sender ready", data)); }; // data sender debouncer DataSender = new System.Timers.Timer(dataDebounceInterval); DataSender.AutoReset = false; DataSender.Enabled = false; DataSender.Elapsed += (sender, e) => { Debug.WriteLine("SPKSENDER: Sending data payload."); dynamic x = new ExpandoObject(); x.objects = converter.convert(this.objects); x.objectProperties = converter.getObjectProperties(this.objects); x.layers = layers; x.streamName = name; server.updateStream(x as ExpandoObject, (success, data) => { if (!success) { OnError?.Invoke(this, new SpeckleEventArgs("Failed to update stream.")); return; } converter.commitCache(); OnDataSent?.Invoke(this, new SpeckleEventArgs("Stream was updated.")); }); DataSender.Stop(); }; // metadata sender debouncer MetadataSender = new System.Timers.Timer(metaDebounceInterval); MetadataSender.AutoReset = false; MetadataSender.Enabled = false; MetadataSender.Elapsed += (sender, e) => { Debug.WriteLine("SPKSENDER: Sending meta payload."); dynamic payload = new ExpandoObject(); payload.layers = layers; payload.streamName = name; server.updateStreamMetadata(payload as ExpandoObject, (success, response) => { if (!success) { OnError?.Invoke(this, new SpeckleEventArgs("Failed to update stream metadata.")); return; } OnDataSent?.Invoke(this, new SpeckleEventArgs("Stream metadata was updated.")); }); }; }