Describe the Bug
@beamable/sdk@1.1.1 sends a nested device.language object in the browser WebSocket session-start frame:
{
"type": "session-start",
"device": {
"platform": "Chrome",
"model": "Desktop",
"locale": "en-us",
"language": {
"code": "en-US",
"context": "IETF"
}
}
}
The backend accepts this frame and produces session/install analytics payloads, but the Athena pipeline fails to flush those events because the CSV formatter does not support nested map/object values.
Datadog error:
java.lang.Exception: Unknown CSV type: {code=en-US, context=IETF}
at com.beamable.utils.CSV$.com$beamable$utils$CSV$$formatValue(CSV.scala:34)
at com.beamable.analytics.CoreEventNarrowCSV.lines(CoreEventOutput.scala:72)
at com.kickstand.tools.pipeline.handlers.AthenaPipelineHandler...
This causes Web SDK browser sessions to produce platform_session_session_end rows, but miss platform_session_session and platform_session_install.
To Reproduce
- Use @beamable/sdk@1.1.1 in a browser client.
- Run a clean Beam.init({ cid, pid, environment }) with no stored Beamable token.
- Observe the WebSocket connection to socket.beamable.com/connect?send-session-start=true.
- Confirm the first outgoing WebSocket message includes nested device.language.
- Let the browser stay connected for ~90 seconds, then close it.
- Query Athena/Portal for the captured DBID.
Expected Behavior
The Web SDK session should materialize all expected session lifecycle analytics:
- platform_session_install for first-known players.
- platform_session_session for session start.
- platform_session_session_end when the WebSocket-backed session ends.
The Web SDK should avoid sending session analytics payload shapes that are incompatible with the analytics pipeline.
Actual Behavior
In a 10-run WebSocket-only test using @beamable/sdk@1.1.1:
platform_session_session_end: 10/10 present.
platform_session_session: 0/10 present.
platform_session_install: 0/10 present.
Metadata
- SDK version: websdk v1.1.1
Additional Context
Suggested Fix
Change the Web SDK session-start frame payload so it does not send a nested language object.
Preferred shape:
{
"type": "session-start",
"device": {
"platform": "Chrome",
"model": "Desktop",
"locale": "en-us",
"language.code": "en-US",
"language.context": "IETF"
}
}
Alternatively, omit device.language from the WebSocket frame and keep only:
This should be coordinated with the backend SessionDeviceInfo parser so the flattened fields are accepted and still preserve the intended language metadata.
Describe the Bug
@beamable/sdk@1.1.1sends a nesteddevice.languageobject in the browser WebSocketsession-startframe:{ "type": "session-start", "device": { "platform": "Chrome", "model": "Desktop", "locale": "en-us", "language": { "code": "en-US", "context": "IETF" } } }The backend accepts this frame and produces session/install analytics payloads, but the Athena pipeline fails to flush those events because the CSV formatter does not support nested map/object values.
Datadog error:
This causes Web SDK browser sessions to produce platform_session_session_end rows, but miss platform_session_session and platform_session_install.
To Reproduce
Expected Behavior
The Web SDK session should materialize all expected session lifecycle analytics:
The Web SDK should avoid sending session analytics payload shapes that are incompatible with the analytics pipeline.
Actual Behavior
In a 10-run WebSocket-only test using @beamable/sdk@1.1.1:
platform_session_session_end: 10/10 present.
platform_session_session: 0/10 present.
platform_session_install: 0/10 present.
Metadata
Additional Context
Suggested Fix
Change the Web SDK session-start frame payload so it does not send a nested language object.
Preferred shape:
{ "type": "session-start", "device": { "platform": "Chrome", "model": "Desktop", "locale": "en-us", "language.code": "en-US", "language.context": "IETF" } }Alternatively, omit device.language from the WebSocket frame and keep only:
{ "locale": "en-us" }This should be coordinated with the backend SessionDeviceInfo parser so the flattened fields are accepted and still preserve the intended language metadata.