From 5e90c3b8ba0eb9fa0ba17c5f73568de817dcaf45 Mon Sep 17 00:00:00 2001 From: Markus Thielker Date: Wed, 30 Jul 2025 13:11:19 +0200 Subject: [PATCH 1/3] HL7-3: add new message type --- packages/shared/types.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/shared/types.ts b/packages/shared/types.ts index 12a45fb..55a912a 100644 --- a/packages/shared/types.ts +++ b/packages/shared/types.ts @@ -11,6 +11,7 @@ export enum MessageType { assign_id = 'assign_id', send_hl7v2 = 'send_hl7v2', receive_hl7v2 = 'receive_hl7v2', + delivery_success = 'delivery_success', delivery_error = 'delivery_error', } @@ -19,7 +20,9 @@ export type Message = | { type: MessageType.assign_id, payload: { stationId: string }} | { type: MessageType.send_hl7v2, payload: { message: string }} | { type: MessageType.receive_hl7v2, payload: { message: string, timestamp: string }} + | { type: MessageType.delivery_success, payload: { message: string, timestamp: string }} | { type: MessageType.delivery_error, payload: { error: string }} // required to define list of this message type export type ReceiveHl7v2Message = Extract; +export type DeliverySuccessMessage = Extract; From a892cbba46d6da77df55933dd42f912f4f486410 Mon Sep 17 00:00:00 2001 From: Markus Thielker Date: Wed, 30 Jul 2025 13:12:06 +0200 Subject: [PATCH 2/3] HL7-3: send ack-message to sending client on delivery --- packages/server/index.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/server/index.ts b/packages/server/index.ts index acbf484..5955eb1 100644 --- a/packages/server/index.ts +++ b/packages/server/index.ts @@ -39,7 +39,7 @@ const clients = new Map(); console.log(`Starting WebSocket server ...`); -console.log("Server configuration:", config); +console.log('Server configuration:', config); wss.on('connection', (ws) => { @@ -105,17 +105,29 @@ wss.on('connection', (ws) => { // check if recipient exists and is connected if (recipientWs && recipientWs.readyState === WebSocket.OPEN) { + const timestamp = new Date().toISOString(); + // The recipient is connected. Forward the message. const forwardMessage = { type: MessageType.receive_hl7v2, payload: { message: message, - timestamp: new Date().toISOString(), + timestamp: timestamp, }, } as Message; recipientWs.send(JSON.stringify(forwardMessage)); console.log(`Forwarded message to ${recipientId}`); + const ackMessage = { + type: MessageType.delivery_success, + payload: { + message: message, + timestamp: timestamp, + }, + }; + ws.send(JSON.stringify(ackMessage)); + console.log(`Sent acknowledgment to ${stationId}`); + } else { // The recipient is not connected or not found. From fec77b73c3d1db5e63182cda2129e0c6fe2cf0f8 Mon Sep 17 00:00:00 2001 From: Markus Thielker Date: Wed, 30 Jul 2025 13:15:56 +0200 Subject: [PATCH 3/3] HL7-3: remove optimistic updates and react to delivery-success --- packages/client/src/routes/+page.svelte | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/packages/client/src/routes/+page.svelte b/packages/client/src/routes/+page.svelte index 585b194..43ca8ee 100644 --- a/packages/client/src/routes/+page.svelte +++ b/packages/client/src/routes/+page.svelte @@ -9,7 +9,13 @@ UnplugIcon, UserIcon, } from '@lucide/svelte'; - import { ConnectionState, type Message, MessageType, type ReceiveHl7v2Message } from '@hnu.de/hl7v2-shared'; + import { + ConnectionState, + type DeliverySuccessMessage, + type Message, + MessageType, + type ReceiveHl7v2Message, + } from '@hnu.de/hl7v2-shared'; import { Button } from '$lib/components/ui/button'; import { Card, CardContent, CardHeader } from '$lib/components/ui/card'; import { Input } from '$lib/components/ui/input'; @@ -25,7 +31,7 @@ // client state let composedMessage = $state(''); // content of text-box - let sentMessages = $state([]); // sent messages stored as type ReceiveHl7v2Message because of the timestamp + let sentMessages = $state([]); let receivedMessages = $state([]); let isSending = $state(false); let copySuccess = $state(false); @@ -96,6 +102,12 @@ receivedMessages = [message, ...receivedMessages]; break; + // our message was successfully delivered + case MessageType.delivery_success: + sentMessages = [message, ...sentMessages]; + isSending = false + break; + // message from server due to delivery error case MessageType.delivery_error: deliveryError = message.payload.error; @@ -154,15 +166,6 @@ payload: { message }, } as Message; ws.send(JSON.stringify(messageToSend)); - - sentMessages = [{ - type: MessageType.receive_hl7v2, - payload: { message, timestamp: new Date().toISOString() }, - } as ReceiveHl7v2Message, ...sentMessages]; - composedMessage = segmentTemplates.MSH.template(); - - // reset UI state - isSending = false; } // copies the stationId to the clipboard and handles UI state