Log undecryptable to-device events

Listen for the new undecryptable to-device event event and log
events for it in Posthog & Sentry, and make it visible in the
call flow diagram.
This commit is contained in:
David Baker 2023-01-13 18:27:22 +00:00
parent be1db442d9
commit abd909c03a
3 changed files with 47 additions and 15 deletions

View file

@ -28,6 +28,7 @@ import {
SignupTracker, SignupTracker,
MuteCameraTracker, MuteCameraTracker,
MuteMicrophoneTracker, MuteMicrophoneTracker,
UndecryptableToDeviceEventTracker,
} from "./PosthogEvents"; } from "./PosthogEvents";
import { Config } from "./config/Config"; import { Config } from "./config/Config";
import { getUrlParams } from "./UrlParams"; import { getUrlParams } from "./UrlParams";
@ -415,4 +416,5 @@ export class PosthogAnalytics {
public eventLogin = new LoginTracker(); public eventLogin = new LoginTracker();
public eventMuteMicrophone = new MuteMicrophoneTracker(); public eventMuteMicrophone = new MuteMicrophoneTracker();
public eventMuteCamera = new MuteCameraTracker(); public eventMuteCamera = new MuteCameraTracker();
public eventUndecryptableToDevice = new UndecryptableToDeviceEventTracker();
} }

View file

@ -149,3 +149,17 @@ export class MuteCameraTracker {
}); });
} }
} }
interface UndecryptableToDeviceEvent {
eventName: "UndecryptableToDeviceEvent";
callId: string;
}
export class UndecryptableToDeviceEventTracker {
track(callId: string) {
PosthogAnalytics.instance.trackEvent<UndecryptableToDeviceEvent>({
eventName: "UndecryptableToDeviceEvent",
callId,
});
}
}

View file

@ -14,6 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
import * as Sentry from "@sentry/react";
import { Resizable } from "re-resizable"; import { Resizable } from "re-resizable";
import React, { import React, {
useEffect, useEffect,
@ -34,6 +35,7 @@ import { CallEvent } from "matrix-js-sdk/src/webrtc/call";
import styles from "./GroupCallInspector.module.css"; import styles from "./GroupCallInspector.module.css";
import { SelectInput } from "../input/SelectInput"; import { SelectInput } from "../input/SelectInput";
import { PosthogAnalytics } from "../PosthogAnalytics";
interface InspectorContextState { interface InspectorContextState {
eventsByUserId?: { [userId: string]: SequenceDiagramMatrixEvent[] }; eventsByUserId?: { [userId: string]: SequenceDiagramMatrixEvent[] };
@ -108,6 +110,19 @@ function formatTimestamp(timestamp: number | Date) {
return dateFormatter.format(timestamp); return dateFormatter.format(timestamp);
} }
function formatType(event: SequenceDiagramMatrixEvent): string {
if (event.content.msgtype === "m.bad.encrypted") return "Undecryptable";
return event.type;
}
function lineForEvent(event: SequenceDiagramMatrixEvent): string {
return `${getUserName(event.from)} ${
event.ignored ? "-x" : "->>"
} ${getUserName(event.to)}: ${formatTimestamp(event.timestamp)} ${formatType(
event
)} ${formatContent(event.type, event.content)}`;
}
export const InspectorContext = export const InspectorContext =
createContext< createContext<
[ [
@ -187,21 +202,7 @@ export function SequenceDiagramViewer({
participant ${getUserName(localUserId)} participant ${getUserName(localUserId)}
participant Room participant Room
participant ${selectedUserId ? getUserName(selectedUserId) : "unknown"} participant ${selectedUserId ? getUserName(selectedUserId) : "unknown"}
${ ${events ? events.map(lineForEvent).join("\n ") : ""}
events
? events
.map(
({ to, from, timestamp, type, content, ignored }) =>
`${getUserName(from)} ${ignored ? "-x" : "->>"} ${getUserName(
to
)}: ${formatTimestamp(timestamp)} ${type} ${formatContent(
type,
content
)}`
)
.join("\n ")
: ""
}
`; `;
mermaid.mermaidAPI.render("mermaid", graphDefinition, (svgCode: string) => { mermaid.mermaidAPI.render("mermaid", graphDefinition, (svgCode: string) => {
@ -389,12 +390,23 @@ function useGroupCallState(
function onSendVoipEvent(event: Record<string, unknown>) { function onSendVoipEvent(event: Record<string, unknown>) {
dispatch({ type: CallEvent.SendVoipEvent, rawEvent: event }); dispatch({ type: CallEvent.SendVoipEvent, rawEvent: event });
} }
function onUndecryptableToDevice(event: MatrixEvent) {
dispatch({ type: ClientEvent.ReceivedVoipEvent, event });
Sentry.captureMessage("Undecryptable to-device Event");
PosthogAnalytics.instance.eventUndecryptableToDevice.track(
groupCall.groupCallId
);
}
client.on(RoomStateEvent.Events, onUpdateRoomState); client.on(RoomStateEvent.Events, onUpdateRoomState);
//groupCall.on("calls_changed", onCallsChanged); //groupCall.on("calls_changed", onCallsChanged);
groupCall.on(CallEvent.SendVoipEvent, onSendVoipEvent); groupCall.on(CallEvent.SendVoipEvent, onSendVoipEvent);
//client.on("state", onCallsChanged); //client.on("state", onCallsChanged);
//client.on("hangup", onCallHangup); //client.on("hangup", onCallHangup);
client.on(ClientEvent.ReceivedVoipEvent, onReceivedVoipEvent); client.on(ClientEvent.ReceivedVoipEvent, onReceivedVoipEvent);
client.on(ClientEvent.UndecryptableToDeviceEvent, onUndecryptableToDevice);
onUpdateRoomState(); onUpdateRoomState();
@ -405,6 +417,10 @@ function useGroupCallState(
//client.removeListener("state", onCallsChanged); //client.removeListener("state", onCallsChanged);
//client.removeListener("hangup", onCallHangup); //client.removeListener("hangup", onCallHangup);
client.removeListener(ClientEvent.ReceivedVoipEvent, onReceivedVoipEvent); client.removeListener(ClientEvent.ReceivedVoipEvent, onReceivedVoipEvent);
client.removeListener(
ClientEvent.UndecryptableToDeviceEvent,
onUndecryptableToDevice
);
}; };
}, [client, groupCall]); }, [client, groupCall]);