public async Task PropagateChange(EmergencyObjectMessage data) { var access = data.header.Access; var owner = data.header.createdBy; Parallel.ForEach(activeWebsockets, async(ws) => { if (ws.ws.State == WebSocketState.Open) { if (ws.endpoint.uid == owner) { /* Owner will receive all data regardless of access control list */ var sendObject = data.Copy <EmergencyObjectMessage>(); await sendObjectToWebsocket(ws.ws, sendObject); } else { /* Get allowed Paths for this user and reduce object to allowed paths */ var paths = objectService.GetAccessPaths(Models.AccessLevelEnum.Read, data, ws.endpoint); if (paths != null && paths.Count > 0) { var sendObject = data.Copy <EmergencyObjectMessage>(); sendObject.data = objectService.RemoveUnallowedPaths <object>(paths, sendObject.data, data.partPath); await sendObjectToWebsocket(ws.ws, sendObject); } } } }); }
private void removeHeadersNotToBeSent(EmergencyObjectMessage sendObject) { sendObject.header.created = null; sendObject.header.createdBy = null; sendObject.header.lastUpdated = null; sendObject.header.lastUpdatedBy = null; sendObject.header.Access = null; }
private async Task sendObjectToWebsocket(WebSocket ws, EmergencyObjectMessage sendObject) { removeHeadersNotToBeSent(sendObject); var jsonData = JsonConvert.SerializeObject(sendObject); var jsonDataBinary = Encoding.UTF8.GetBytes(jsonData); await ws.SendAsync(new ArraySegment <byte>(jsonDataBinary), WebSocketMessageType.Text, true, CancellationToken.None); }
public void ObjectChanged(Guid uid, MessageSentTrigger trigger, EmergencyObject edxo, object subData, string subPath = null) { var eventMsg = new EmergencyObjectMessage() { uid = uid, header = edxo.header, messageTrigger = trigger, }; if (subPath != null) { eventMsg.isParted = true; eventMsg.partPath = subPath; eventMsg.data = subData; } else { eventMsg.isParted = false; eventMsg.data = edxo.data; } ws.PropagateChange(eventMsg); }