function _extractPartAExtensions()

in channels/applicationinsights-channel-js/src/EnvelopeCreator.ts [29:124]


function _extractPartAExtensions(logger: IDiagnosticLogger, item: ITelemetryItem, env: IEnvelope) {
    // todo: switch to keys from common in this method
    let envTags = env.tags = env.tags || {};
    let itmExt = item.ext = item.ext || {};
    let itmTags = item.tags = item.tags || [];

    let extUser = itmExt.user;
    if (extUser) {
        _setValueIf(envTags, CtxTagKeys.userAuthUserId, extUser.authId);
        _setValueIf(envTags, CtxTagKeys.userId, extUser.id || extUser.localId);
    }

    let extApp = itmExt.app;
    if (extApp) {
        _setValueIf(envTags, CtxTagKeys.sessionId, extApp.sesId);
    }

    let extDevice = itmExt.device;
    if (extDevice) {
        _setValueIf(envTags, CtxTagKeys.deviceId, extDevice.id || extDevice.localId);
        _setValueIf(envTags, CtxTagKeys.deviceType, extDevice.deviceClass);
        _setValueIf(envTags, CtxTagKeys.deviceIp, extDevice.ip);
        _setValueIf(envTags, CtxTagKeys.deviceModel, extDevice.model);
        _setValueIf(envTags, CtxTagKeys.deviceType, extDevice.deviceType);
    }

    const web: IWeb = item.ext.web as IWeb;
    if (web) {
        _setValueIf(envTags, CtxTagKeys.deviceLanguage, web.browserLang);
        _setValueIf(envTags, CtxTagKeys.deviceBrowserVersion, web.browserVer);
        _setValueIf(envTags, CtxTagKeys.deviceBrowser, web.browser);

        let envData = env.data = env.data || {};
        let envBaseData = envData[strBaseData] = envData[strBaseData] || {};
        let envProps = envBaseData[strProperties] = envBaseData[strProperties] || {};

        _setValueIf(envProps, "domain", web.domain);
        _setValueIf(envProps, "isManual", web.isManual ? strTrue : null);
        _setValueIf(envProps, "screenRes", web.screenRes);
        _setValueIf(envProps, "userConsent", web.userConsent ? strTrue : null);
    }

    let extOs = itmExt.os;
    if (extOs) {
        _setValueIf(envTags, CtxTagKeys.deviceOS, extOs.name);
    }

    // No support for mapping Trace.traceState to 2.0 as it is currently empty

    let extTrace = itmExt.trace;
    if (extTrace) {
        _setValueIf(envTags, CtxTagKeys.operationParentId, extTrace.parentID);
        _setValueIf(envTags, CtxTagKeys.operationName, dataSanitizeString(logger, extTrace.name));
        _setValueIf(envTags, CtxTagKeys.operationId, extTrace.traceID);
    }

    // Sample 4.0 schema
    //  {
    //     "time" : "2018-09-05T22:51:22.4936Z",
    //     "name" : "MetricWithNamespace",
    //     "iKey" : "ABC-5a4cbd20-e601-4ef5-a3c6-5d6577e4398e",
    //     "ext": {  "cloud": {
    //          "role": "WATSON3",
    //          "roleInstance": "CO4AEAP00000260"
    //      },
    //      "device": {}, "correlation": {} },
    //      "tags": [
    //        { "amazon.region" : "east2" },
    //        { "os.expid" : "wp:02df239" }
    //     ]
    //   }

    const tgs = {};
    // deals with tags.push({object})
    for(let i = itmTags.length - 1; i >= 0; i--){
        const tg = itmTags[i];
        objForEachKey(tg, (key, value) => {
            tgs[key] = value;
        });

        itmTags.splice(i, 1);
    }

    // deals with tags[key]=value (and handles hasOwnProperty)
    objForEachKey(itmTags, (tg, value) => {
        tgs[tg] = value;
    });

    let theTags = { ...envTags, ...tgs };
    if(!theTags[CtxTagKeys.internalSdkVersion]) {
        // Append a version in case it is not already set
        theTags[CtxTagKeys.internalSdkVersion] = `javascript:${EnvelopeCreator.Version}`;
    }
    
    env.tags = optimizeObject(theTags);
}