Skip to content

Web SDK session-start frame sends nested language object that breaks analytics CSV materialization #4617

Description

@mhijaziB

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:

{
  "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.

Metadata

Metadata

Labels

bugSomething isn't working

Type

Fields

No fields configured for Bug.

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions