Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
emiMobile
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Mac Stephens
emiMobile
Commits
09ad9902
Commit
09ad9902
authored
Sep 08, 2026
by
Mac Stephens
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add client version to mismatch errors, server logs, and connected clients
parent
ca97cf69
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
60 additions
and
8 deletions
+60
-8
Api.Server.Module.dfm
emiMobileServer/Source/Api.Server.Module.dfm
+3
-0
Api.Server.Module.pas
emiMobileServer/Source/Api.Server.Module.pas
+10
-1
Auth.ServiceImpl.pas
emiMobileServer/Source/Auth.ServiceImpl.pas
+11
-4
Main.dfm
emiMobileServer/Source/Main.dfm
+12
-0
Main.pas
emiMobileServer/Source/Main.pas
+1
-0
WebSocket.Manager.pas
emiMobileServer/Source/WebSocket.Manager.pas
+16
-2
ConnectionModule.pas
webEMIMobile/ConnectionModule.pas
+3
-1
Module.Websocket.pas
webEMIMobile/Module.Websocket.pas
+4
-0
No files found.
emiMobileServer/Source/Api.Server.Module.dfm
View file @
09ad9902
...
...
@@ -26,5 +26,8 @@ object ApiServerModule: TApiServerModule
object XDataServer1JWT: TSparkleJwtMiddleware
OnGetSecret = XDataServer1JWTGetSecret
end
object XDataServer1Forward: TSparkleForwardMiddleware
OnAcceptProxy = XDataServer1ForwardAcceptProxy
end
end
end
emiMobileServer/Source/Api.Server.Module.pas
View file @
09ad9902
...
...
@@ -13,7 +13,7 @@ uses
Sparkle
.
HttpServer
.
Module
,
Sparkle
.
HttpServer
.
Context
,
Sparkle
.
Comp
.
CompressMiddleware
,
Sparkle
.
Comp
.
CorsMiddleware
,
Sparkle
.
Comp
.
GenericMiddleware
,
Aurelius
.
Drivers
.
UniDac
,
UniProvider
,
Data
.
DB
,
DBAccess
,
Uni
;
Data
.
DB
,
DBAccess
,
Uni
,
Sparkle
.
Comp
.
ForwardMiddleware
;
type
TApiServerModule
=
class
(
TDataModule
)
...
...
@@ -23,9 +23,12 @@ type
XDataServer1CORS
:
TSparkleCorsMiddleware
;
XDataServer1Compress
:
TSparkleCompressMiddleware
;
XDataServer1JWT
:
TSparkleJwtMiddleware
;
XDataServer1Forward
:
TSparkleForwardMiddleware
;
procedure
XDataServer1LoggingMiddlewareCreate
(
Sender
:
TObject
;
var
Middleware
:
IHttpServerMiddleware
);
procedure
XDataServer1JWTGetSecret
(
Sender
:
TObject
;
var
Secret
:
string
);
procedure
XDataServer1ForwardAcceptProxy
(
Sender
:
TObject
;
const
Value
:
string
;
var
Accept
:
Boolean
);
private
{ Private declarations }
public
...
...
@@ -89,6 +92,12 @@ begin
Middleware
:=
TLoggingMiddleware
.
Create
(
Logger
);
end
;
procedure
TApiServerModule
.
XDataServer1ForwardAcceptProxy
(
Sender
:
TObject
;
const
Value
:
string
;
var
Accept
:
Boolean
);
begin
Accept
:=
True
;
end
;
procedure
TApiServerModule
.
XDataServer1JWTGetSecret
(
Sender
:
TObject
;
var
Secret
:
string
);
begin
...
...
emiMobileServer/Source/Auth.ServiceImpl.pas
View file @
09ad9902
...
...
@@ -168,7 +168,8 @@ var
iniFile
:
TIniFile
;
webClientVersion
:
string
;
begin
Logger
.
Log
(
3
,
'AuthService.VerifyVersion called'
);
Logger
.
Log
(
1
,
Format
(
'Client version check started: client="%s"'
,
[
ClientVersion
]));
Result
:=
TJSONObject
.
Create
;
TXDataOperationContext
.
Current
.
Handler
.
ManagedObjects
.
Add
(
Result
);
...
...
@@ -180,20 +181,26 @@ begin
if
webClientVersion
=
''
then
begin
Logger
.
Log
(
2
,
'AuthService.VerifyVersion: webClientVersion not configured'
);
Logger
.
Log
(
2
,
Format
(
'Client version check failed: client="%s", required version is not configured'
,
[
ClientVersion
]));
Result
.
AddPair
(
'error'
,
'webClientVersion is not configured.'
);
Exit
;
end
;
if
clientVersion
<>
webClientVersion
then
begin
Logger
.
Log
(
2
,
'AuthService.VerifyVersion: client version mismatch'
);
Logger
.
Log
(
2
,
Format
(
'Client version check failed: client="%s", required="%s"'
,
[
ClientVersion
,
webClientVersion
]));
Result
.
AddPair
(
'error'
,
'Your browser is running an old version of the app.'
+
sLineBreak
+
'Please click below to reload.'
);
end
else
Logger
.
Log
(
3
,
'AuthService.VerifyVersion: version check passed'
);
Logger
.
Log
(
1
,
Format
(
'Client version check succeeded: client="%s", required="%s"'
,
[
ClientVersion
,
webClientVersion
]));
finally
iniFile
.
Free
;
end
;
...
...
emiMobileServer/Source/Main.dfm
View file @
09ad9902
...
...
@@ -68,6 +68,13 @@ object FMain: TFMain
end
item
Expanded = False
FieldName = 'ClientVersion'
Title.Caption = 'Version'
Width = 80
Visible = True
end
item
Expanded = False
FieldName = 'ConnectedAt'
Width = 150
Visible = True
...
...
@@ -162,6 +169,11 @@ object FMain: TFMain
Size = 30
end
item
Name = 'ClientVersion'
DataType = ftString
Size = 20
end
item
Name = 'ConnectedAt'
DataType = ftDateTime
end>
...
...
emiMobileServer/Source/Main.pas
View file @
09ad9902
...
...
@@ -241,6 +241,7 @@ begin
tblConnectedClients
.
Append
;
tblConnectedClients
.
FieldByName
(
'ConnectionId'
).
AsString
:=
client
.
ConnectionId
;
tblConnectedClients
.
FieldByName
(
'UserId'
).
AsString
:=
client
.
UserId
;
tblConnectedClients
.
FieldByName
(
'ClientVersion'
).
AsString
:=
client
.
ClientVersion
;
tblConnectedClients
.
FieldByName
(
'ConnectedAt'
).
AsDateTime
:=
client
.
ConnectedAt
;
tblConnectedClients
.
Post
;
end
;
...
...
emiMobileServer/Source/WebSocket.Manager.pas
View file @
09ad9902
...
...
@@ -20,6 +20,7 @@ type
TConnectedClientSnapshot
=
record
ConnectionId
:
string
;
UserId
:
string
;
ClientVersion
:
string
;
ConnectedAt
:
TDateTime
;
end
;
...
...
@@ -27,6 +28,7 @@ type
private
FConnectionId
:
string
;
FUserId
:
string
;
FClientVersion
:
string
;
FConnectedAt
:
TDateTime
;
FLastSeenAt
:
TDateTime
;
FHeartbeatSeen
:
Boolean
;
...
...
@@ -35,6 +37,7 @@ type
public
property
ConnectionId
:
string
read
FConnectionId
write
FConnectionId
;
property
UserId
:
string
read
FUserId
write
FUserId
;
property
ClientVersion
:
string
read
FClientVersion
write
FClientVersion
;
property
ConnectedAt
:
TDateTime
read
FConnectedAt
write
FConnectedAt
;
property
LastSeenAt
:
TDateTime
read
FLastSeenAt
write
FLastSeenAt
;
property
HeartbeatSeen
:
Boolean
read
FHeartbeatSeen
write
FHeartbeatSeen
;
...
...
@@ -330,6 +333,7 @@ var
json
:
TJSONValue
;
messageType
:
string
;
userId
:
string
;
clientVersion
:
string
;
connectionId
:
string
;
client
:
TConnectedClient
;
response
:
TJSONObject
;
...
...
@@ -350,6 +354,10 @@ begin
(
not
json
.
TryGetValue
<
string
>(
'userId'
,
userId
))
then
Exit
;
clientVersion
:=
''
;
if
SameText
(
messageType
,
'identify'
)
then
json
.
TryGetValue
<
string
>(
'clientVersion'
,
clientVersion
);
client
:=
TConnectedClient
(
TTMSFNCWebSocketServerConnection
(
AConnection
).
UserData
);
if
not
Assigned
(
client
)
then
...
...
@@ -364,7 +372,10 @@ begin
connectionId
:=
client
.
ConnectionId
;
if
SameText
(
messageType
,
'identify'
)
then
client
.
UserId
:=
userId
begin
client
.
UserId
:=
userId
;
client
.
ClientVersion
:=
clientVersion
;
end
else
client
.
HeartbeatSeen
:=
True
;
finally
...
...
@@ -373,7 +384,9 @@ begin
if
SameText
(
messageType
,
'identify'
)
then
begin
Logger
.
Log
(
1
,
'WebSocket client identified: '
+
connectionId
+
' - '
+
userId
);
Logger
.
Log
(
1
,
Format
(
'WebSocket client identified: %s - %s - version %s'
,
[
connectionId
,
userId
,
clientVersion
]));
NotifyClientsChanged
;
end
else
...
...
@@ -443,6 +456,7 @@ begin
begin
Result
[
i
].
ConnectionId
:=
FClients
[
i
].
ConnectionId
;
Result
[
i
].
UserId
:=
FClients
[
i
].
UserId
;
Result
[
i
].
ClientVersion
:=
FClients
[
i
].
ClientVersion
;
Result
[
i
].
ConnectedAt
:=
FClients
[
i
].
ConnectedAt
;
end
;
finally
...
...
webEMIMobile/ConnectionModule.pas
View file @
09ad9902
...
...
@@ -110,7 +110,9 @@ begin
error
:=
''
;
if
error
<>
''
then
TFViewErrorPage
.
Display
(
error
)
TFViewErrorPage
.
Display
(
error
+
sLineBreak
+
sLineBreak
+
'Current client version: v'
+
clientVersion
)
else
SuccessProc
;
end
,
...
...
webEMIMobile/Module.Websocket.pas
View file @
09ad9902
...
...
@@ -120,6 +120,9 @@ var
implementation
uses
ConnectionModule
;
{%CLASSGROUP 'Vcl.Controls.TControl'}
{$R *.dfm}
...
...
@@ -619,6 +622,7 @@ begin
msg
:=
TJSObject
.
new
;
msg
[
'message'
]
:=
'identify'
;
msg
[
'userId'
]
:=
userId
;
msg
[
'clientVersion'
]
:=
TDMConnection
.
clientVersion
;
EMiMobileWebSocketClient
.
Send
(
TJSJSON
.
stringify
(
msg
));
except
on
E
:
Exception
do
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment