Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,58 @@ public partial class ApplicationInsightsInit : ComponentBase, IDisposable

private string script { get; set; } = string.Empty;

// Inlined from wwwroot/Imagile.Framework.Blazor.ApplicationInsights.lib.module.js
// Avoids dependency on _content/ static asset serving, which is unreliable for NuGet-distributed RCLs.
private const string BlazerApplicationInsightsJs = """
window.blazorApplicationInsights = {
addTelemetryInitializer: function (telemetryItem) {
var telemetryInitializer = (envelope) => {
if (telemetryItem.ver !== null) { envelope.ver = telemetryItem.ver; }
if (telemetryItem.name !== null) { envelope.name = telemetryItem.name; }
if (telemetryItem.time !== null) { envelope.time = telemetryItem.time; }
if (telemetryItem.iKey !== null) { envelope.iKey = telemetryItem.iKey; }
if (telemetryItem.ext !== null) { Object.assign(envelope.ext, telemetryItem.ext); }
if (telemetryItem.tags !== null) { Object.assign(envelope.tags, telemetryItem.tags); }
if (telemetryItem.data !== null) { Object.assign(envelope.data, telemetryItem.data); }
if (telemetryItem.baseType !== null) { envelope.baseType = telemetryItem.baseType; }
if (telemetryItem.baseData !== null) { Object.assign(envelope.baseData, telemetryItem.baseData); }
};
appInsights.addTelemetryInitializer(telemetryInitializer);
},
trackDependencyData: function (dependencyTelemetry) {
if (dependencyTelemetry.startTime !== null) {
dependencyTelemetry.startTime = new Date(dependencyTelemetry.startTime);
}
appInsights.trackDependencyData(dependencyTelemetry);
},
getContext: function () {
if (appInsights.context !== undefined) { return appInsights.context; }
},
cookieMgrSetCookiesEnabled: function (enabled) {
if (appInsights.getCookieMgr !== undefined) { appInsights.getCookieMgr().setEnabled(enabled); }
},
cookieMgrGetCookiesEnabled: function () {
if (appInsights.getCookieMgr !== undefined) { return appInsights.getCookieMgr().isEnabled(); }
return false;
},
cookieMgrSet: function (name, value, maxAgeSec, domain, path) {
if (appInsights.getCookieMgr !== undefined) { appInsights.getCookieMgr().set(name, value, maxAgeSec, domain, path); }
},
cookieMgrGet: function (name) {
if (appInsights.getCookieMgr !== undefined) { appInsights.getCookieMgr().get(name); }
},
cookieMgrDel: function (name, path) {
if (appInsights.getCookieMgr !== undefined) { appInsights.getCookieMgr().del(name, path); }
},
cookieMgrPurge: function (name, path) {
if (appInsights.getCookieMgr !== undefined) { appInsights.getCookieMgr().purge(name, path); }
},
cookieMgrUnload: function (isAsync) {
if (appInsights.getCookieMgr !== undefined) { appInsights.getCookieMgr().unload(isAsync); }
},
};
""";

/// <inheritdoc/>
protected override void OnInitialized()
{
Expand All @@ -52,6 +104,11 @@ protected override void OnInitialized()
// Application Insights Snippet
// https://github.com/microsoft/ApplicationInsights-JS#snippet-setup-ignore-if-using-npm-setup
script = $$$"""<script type="text/javascript">!(function (cfg){function e(){cfg.onInit&&cfg.onInit(i)}var S,u,D,t,n,i,C=window,x=document,w=C.location,I="script",b="ingestionendpoint",E="disableExceptionTracking",A="ai.device.";"instrumentationKey"[S="toLowerCase"](),u="crossOrigin",D="POST",t="appInsightsSDK",n=cfg.name||"appInsights",(cfg.name||C[t])&&(C[t]=n),i=C[n]||function(l){var d=!1,g=!1,f={initialize:!0,queue:[],sv:"7",version:2,config:l};function m(e,t){var n={},i="Browser";function a(e){e=""+e;return 1===e.length?"0"+e:e}return n[A+"id"]=i[S](),n[A+"type"]=i,n["ai.operation.name"]=w&&w.pathname||"_unknown_",n["ai.internal.sdkVersion"]="javascript:snippet_"+(f.sv||f.version),{time:(i=new Date).getUTCFullYear()+"-"+a(1+i.getUTCMonth())+"-"+a(i.getUTCDate())+"T"+a(i.getUTCHours())+":"+a(i.getUTCMinutes())+":"+a(i.getUTCSeconds())+"."+(i.getUTCMilliseconds()/1e3).toFixed(3).slice(2,5)+"Z",iKey:e,name:"Microsoft.ApplicationInsights."+e.replace(/-/g,"")+"."+t,sampleRate:100,tags:n,data:{baseData:{ver:2}},ver:4,seq:"1",aiDataContract:undefined}}var h=-1,v=0,y=["js.monitor.azure.com","js.cdn.applicationinsights.io","js.cdn.monitor.azure.com","js0.cdn.applicationinsights.io","js0.cdn.monitor.azure.com","js2.cdn.applicationinsights.io","js2.cdn.monitor.azure.com","az416426.vo.msecnd.net"],k=l.url||cfg.src;if(k){if((n=navigator)&&(~(n=(n.userAgent||"").toLowerCase()).indexOf("msie")||~n.indexOf("trident/"))&&~k.indexOf("ai.3")&&(k=k.replace(/(\/)(ai\.3\.)([^\d]*)$/,function(e,t,n){return t+"ai.2"+n})),!1!==cfg.cr)for(var e=0;e<y.length;e++)if(0<k.indexOf(y[e])){h=e;break}var i=function(e){var a,t,n,i,o,r,s,c,p,u;f.queue=[],g||(0<=h&&v+1<y.length?(a=(h+v+1)%y.length,T(k.replace(/^(.*\/\/)([\w\.]*)(\/.*)$/,function(e,t,n,i){return t+y[a]+i})),v+=1):(d=g=!0,o=k,c=(p=function(){var e,t={},n=l.connectionString;if(n)for(var i=n.split(";"),a=0;a<i.length;a++){var o=i[a].split("=");2===o.length&&(t[o[0][S]()]=o[1])}return t[b]||(e=(n=t.endpointsuffix)?t.location:null,t[b]="https://"+(e?e+".":"")+"dc."+(n||"services.visualstudio.com")),t}()).instrumentationkey||l.instrumentationKey||"",p=(p=p[b])?p+"/v2/track":l.endpointUrl,(u=[]).push((t="SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)",n=o,r=p,(s=(i=m(c,"Exception")).data).baseType="ExceptionData",s.baseData.exceptions=[{typeName:"SDKLoadFailed",message:t.replace(/\./g,"-"),hasFullStack:!1,stack:t+"\nSnippet failed to load ["+n+"] -- Telemetry is disabled\nHelp Link: https://go.microsoft.com/fwlink/?linkid=2128109\nHost: "+(w&&w.pathname||"_unknown_")+"\nEndpoint: "+r,parsedStack:[]}],i)),u.push((s=o,t=p,(r=(n=m(c,"Message")).data).baseType="MessageData",(i=r.baseData).message='AI (Internal): 99 message:"'+("SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details) ("+s+")").replace(/\"/g,"")+'"',i.properties={endpoint:t},n)),o=u,c=p,JSON&&((r=C.fetch)&&!cfg.useXhr?r(c,{method:D,body:JSON.stringify(o),mode:"cors"}):XMLHttpRequest&&((s=new XMLHttpRequest).open(D,c),s.setRequestHeader("Content-type","application/json"),s.send(JSON.stringify(o))))))},a=function(e,t){g||setTimeout(function(){!t&&f.core||i()},500),d=!1},T=function(e){var n=x.createElement(I),e=(n.src=e,cfg[u]);return!e&&""!==e||"undefined"==n[u]||(n[u]=e),n.onload=a,n.onerror=i,n.onreadystatechange=function(e,t){"loaded"!==n.readyState&&"complete"!==n.readyState||a(0,t)},cfg.ld&&cfg.ld<0?x.getElementsByTagName("head")[0].appendChild(n):setTimeout(function(){x.getElementsByTagName(I)[0].parentNode.appendChild(n)},cfg.ld||0),n};T(k)}try{f.cookie=x.cookie}catch(p){}function t(e){for(;e.length;)!function(t){f[t]=function(){var e=arguments;d||f.queue.push(function(){f[t].apply(f,e)})}}(e.pop())}var r,s,n="track",o="TrackPage",c="TrackEvent",n=(t([n+"Event",n+"PageView",n+"Exception",n+"Trace",n+"DependencyData",n+"Metric",n+"PageViewPerformance","start"+o,"stop"+o,"start"+c,"stop"+c,"addTelemetryInitializer","setAuthenticatedUserContext","clearAuthenticatedUserContext","flush"]),f.SeverityLevel={Verbose:0,Information:1,Warning:2,Error:3,Critical:4},(l.extensionConfig||{}).ApplicationInsightsAnalytics||{});return!0!==l[E]&&!0!==n[E]&&(t(["_"+(r="onerror")]),s=C[r],C[r]=function(e,t,n,i,a){var o=s&&s(e,t,n,i,a);return!0!==o&&f["_"+r]({message:e,url:t,lineNumber:n,columnNumber:i,error:a,evt:C.event}),o},l.autoExceptionInstrumented=!0),f}(cfg.cfg),(C[n]=i).queue&&0===i.queue.length?(i.queue.push(e),i.trackPageView({})):e();})({src: "https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js",crossOrigin: "anonymous",cfg: {{{JsonSerializer.Serialize(Config.Config)}}}})</script>""";

// Append blazorApplicationInsights setup as a second inline script.
// This avoids any dependency on _content/ static asset serving, which doesn't work
// reliably for .lib.module.js files in NuGet-distributed Razor class libraries.
script += $"<script type=\"text/javascript\">{BlazerApplicationInsightsJs}</script>";
}

/// <inheritdoc/>
Expand All @@ -62,13 +119,6 @@ protected override async Task OnAfterRenderAsync(bool firstRender)

ApplicationInsights.InitJSRuntime(JSRuntime);

// Explicitly import the JS module to ensure window.blazorApplicationInsights is defined.
// The .lib.module.js auto-loading mechanism is not reliable for NuGet-distributed RCLs,
// so we import it explicitly here before making any interop calls.
await JSRuntime.InvokeAsync<IJSObjectReference>(
"import",
"./_content/Imagile.Framework.Blazor.ApplicationInsights/Imagile.Framework.Blazor.ApplicationInsights.lib.module.js");

if (Config.Config != null)
{
try
Expand Down
Loading