> ## Documentation Index
> Fetch the complete documentation index at: https://docs-unity.molca.id/llms.txt
> Use this file to discover all available pages before exploring further.

# DT network and mapping

> NetworkManager pipelines, token renewal, and JsonMapping evaluation in _MolcaDT.

**Scripts:**

* `Assets/_MolcaDT/Code/Scripts/Network/NetworkManager.cs`
* `Assets/_MolcaDT/Code/Scripts/Network/TokenRenewalManager.cs`
* `Assets/_MolcaDT/Code/Scripts/JsonMapping/JsonMappingEvaluator.cs`

## When to use

Use this page when integrating machine data endpoints/streams and binding JSON payloads to DT panel data models.

## Request pipeline (high-level)

`NetworkManager` exposes coroutine-based HTTP helpers (`PostDataCoroutine`, `PutDataCoroutine`, etc.) and attaches auth headers from DT dynamic module setup. It also retries through token-renewal flow when expiration is detected.

```mermaid theme={null}
flowchart TD
  request[RequestCoroutine] --> auth[AttachAuthHeader]
  auth --> send[UnityWebRequest.SendWebRequest]
  send --> expired{TokenExpired}
  expired -->|yes| renew[TokenRenewalManager retry]
  expired -->|no| result[SetDataEvent callback]
```

## Mapping flow

`JsonMappingEvaluator.BuildWrapper(JsonMappingAsset mapping, Dictionary<string, object> flat)` walks **`mapping.fields`**. For each **`FieldMapping`**, it looks up **`flat[f.displayName]`** (not the JSON path alone unless your flatten step uses the same string as **`displayName`**). It fills **`allData`**, then **`categoryData`** / **`uniqueCategoryData`** for panel consumers.

**`APIMapperInvokerBase`** (and machine-specific invokers) resolve URLs from **`DigitalTwinDynamicModule.UrlDatum`**, call **`NetworkManager`** coroutines, parse JSON into a flat dictionary, then run **`JsonMappingEvaluator`** and raise **`onDataReceived`** (**full**, **raw**, **per-`FieldCategory`**, **per unique key**).

## Code

**Manual POST** (matches **`NetworkManager.PostDataCoroutine`** contract: success → `(url, responseBody, true)`, failure → `(url, errorMessage, false)`):

```csharp theme={null}
using MolcaDT.Network;
using UnityEngine;

public class DtPing : MonoBehaviour
{
    private void Start()
    {
        string url = "https://api.example.com/v1/ping";
        string json = "{}";
        StartCoroutine(NetworkManager.instance.PostDataCoroutine(url, json, OnResponse));
    }

    private void OnResponse(string url, string bodyOrError, bool ok)
    {
        if (!ok) Debug.LogError(bodyOrError);
    }
}
```

**Mapping-only** (after you already have a `Dictionary<string, object>` aligned to **`FieldMapping.displayName`** keys):

```csharp theme={null}
var wrapper = JsonMappingEvaluator.BuildWrapper(mappingAsset, flatDictionary);
// wrapper.allData, wrapper.categoryData, wrapper.uniqueCategoryData, wrapper.rawData
```

**SSE** — **`NetworkManager.ConnectToSSE(url, onChunk, filterEvent)`** streams lines; token refresh can abort and retry the stream when **`TokenRenewalManager`** detects expiry patterns.

## Troubleshooting

* **401 / auth errors** — Ensure login populated **`NetworkManager.instance.CurrentAuth`**; **`DigitalTwinDynamicModule.SetupAuth()`** returns a bearer header; configure **`TokenRenewalManager.tokenExpiredKeyword`** so **`IsTokenExpired`** matches your API’s error body. Use **`bypassRefreshToken`** only for isolated tests.
* **SSL / certificate errors in dev** — Requests use **`BypassCertificate`** (always validates **true**); prefer proper certs for production builds.
* **Mapping rows missing or null** — Flatten JSON so keys equal **`FieldMapping.displayName`** in the **`JsonMappingAsset`**; empty slots mean **`TryGetValue`** missed that key.
* **Panel callbacks silent** — In **`OnDataReceived`**, wire **`onFullDataReceived`**, **`categoryEvents`**, or **`uniqueCategoryEvents`**; **`APIMapperInvokerBase`** caches category hooks from **`FieldCategory`** during **`SyncConfiguration`**.
* **POST body ignored** — Set **`httpMethod`** to POST on the invoker and fill **`postBodyData`** (see **`APIMapperInvokerBase`**).

## Related

* [DT startup flow](/dt/startup-flow)
* [DT POI and panels](/dt/poi-and-panels)
* [HttpClient](/core/http-client) (only if your DT fork shares Core networking for some paths)
