From 0a2451a479008b3cc0c549cc41434c806a15a28d Mon Sep 17 00:00:00 2001 From: Felipe Cecagno Date: Tue, 21 Oct 2025 10:31:01 -0300 Subject: [PATCH 1/2] feat: emit transcript-updated event --- src/process/event.js | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/process/event.js b/src/process/event.js index 184eb18..a2fdd01 100644 --- a/src/process/event.js +++ b/src/process/event.js @@ -32,6 +32,7 @@ export default class WebhooksEvent { "user-presenter-unassigned", "user-emoji-changed", "user-raise-hand-changed", + "transcript-updated", "chat-group-message-sent", "rap-published", "rap-unpublished", @@ -113,6 +114,9 @@ export default class WebhooksEvent { "PollStartedEvtMsg", "UserRespondedToPollRespMsg", ], + TRANSCRIPT_EVENTS: [ + "TranscriptUpdatedEvtMsg" + ] } constructor(inputEvent) { @@ -137,6 +141,8 @@ export default class WebhooksEvent { this.padTemplate(this.inputEvent); } else if (this.mappedEvent(this.inputEvent, WebhooksEvent.RAW.POLL_EVENTS)) { this.pollTemplate(this.inputEvent); + } else if (this.mappedEvent(this.inputEvent, WebhooksEvent.RAW.TRANSCRIPT_EVENTS)) { + this.transcriptTemplate(this.inputEvent); } else if (this.mappedEvent(this.inputEvent, WebhooksEvent.OUTPUT_EVENTS)) { // Check if input is already a mapped event and return it this.outputEvent = this.inputEvent; @@ -594,6 +600,32 @@ export default class WebhooksEvent { } } + transcriptTemplate(messageObj) { + const { body } = messageObj.core; + const meetingId = this._extractIntMeetingID(messageObj); + this.outputEvent = { + data: { + "type": "event", + "id": this.mapInternalMessage(messageObj), + "attributes":{ + "meeting":{ + "internal-meeting-id": meetingId, + "external-meeting-id": IDMapping.get().getExternalMeetingID(meetingId) + }, + "transcript":{ + "id": body.transcriptId, + "transcript": body.transcript, + "locale": body.locale, + "final": body.result + } + }, + "event":{ + "ts": Date.now() + } + } + }; + } + mapInternalMessage(message) { const name = message?.envelope?.name || message?.header?.name; @@ -616,6 +648,7 @@ export default class WebhooksEvent { case "UserEmojiChangedEvtMsg": case "UserReactionEmojiChangedEvtMsg": return 'user-emoji-changed'; case "UserRaiseHandChangedEvtMsg": return "user-raise-hand-changed"; + case "TranscriptUpdatedEvtMsg": return "transcript-updated"; case "GroupChatMessageBroadcastEvtMsg": return "chat-group-message-sent"; case "PublishedRecordingSysMsg": return "rap-published"; case "UnpublishedRecordingSysMsg": return "rap-unpublished"; From abf819c7c2247d0829b675f3964bd801e3cf0259 Mon Sep 17 00:00:00 2001 From: Felipe Cecagno Date: Tue, 21 Oct 2025 10:32:48 -0300 Subject: [PATCH 2/2] fix: add user information to transcript-updated --- src/process/event.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/process/event.js b/src/process/event.js index a2fdd01..2155f57 100644 --- a/src/process/event.js +++ b/src/process/event.js @@ -602,7 +602,10 @@ export default class WebhooksEvent { transcriptTemplate(messageObj) { const { body } = messageObj.core; + const userId = this._extractIntUserID(messageObj); + const extId = UserMapping.get().getExternalUserID(userId) || body.extId || ""; const meetingId = this._extractIntMeetingID(messageObj); + this.outputEvent = { data: { "type": "event", @@ -612,6 +615,10 @@ export default class WebhooksEvent { "internal-meeting-id": meetingId, "external-meeting-id": IDMapping.get().getExternalMeetingID(meetingId) }, + "user":{ + "internal-user-id": userId, + "external-user-id": extId, + }, "transcript":{ "id": body.transcriptId, "transcript": body.transcript,