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:
parent
be1db442d9
commit
abd909c03a
3 changed files with 47 additions and 15 deletions
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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]);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue