@beignet/devtools 0.0.3 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +81 -0
- package/README.md +116 -71
- package/dist/events.d.ts +15 -3
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +1 -0
- package/dist/events.js.map +1 -1
- package/dist/index.d.ts +13 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -13
- package/dist/index.js.map +1 -1
- package/dist/persistence.d.ts +1 -1
- package/dist/persistence.d.ts.map +1 -1
- package/dist/provider-instrumentation.d.ts +1 -1
- package/dist/provider-instrumentation.d.ts.map +1 -1
- package/dist/provider.d.ts +5 -5
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +10 -5
- package/dist/provider.js.map +1 -1
- package/dist/redaction.d.ts +1 -1
- package/dist/redaction.d.ts.map +1 -1
- package/dist/redaction.js +1 -0
- package/dist/redaction.js.map +1 -1
- package/dist/routes.d.ts +2 -2
- package/dist/routes.d.ts.map +1 -1
- package/dist/routes.js +3 -3
- package/dist/routes.js.map +1 -1
- package/dist/ui-model.d.ts +38 -0
- package/dist/ui-model.d.ts.map +1 -0
- package/dist/ui-model.js +1039 -0
- package/dist/ui-model.js.map +1 -0
- package/dist/ui.d.ts +1 -1
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +310 -164
- package/dist/ui.js.map +1 -1
- package/dist/watchers.d.ts +2 -2
- package/dist/watchers.d.ts.map +1 -1
- package/dist/watchers.js +10 -2
- package/dist/watchers.js.map +1 -1
- package/package.json +22 -2
- package/src/events.ts +25 -1
- package/src/index.ts +13 -15
- package/src/persistence.ts +1 -1
- package/src/provider-instrumentation.ts +1 -1
- package/src/provider.ts +12 -7
- package/src/redaction.ts +2 -1
- package/src/routes.ts +4 -4
- package/src/ui-model.ts +1233 -0
- package/src/ui.ts +310 -164
- package/src/watchers.ts +12 -3
- package/dist/audit.d.ts +0 -31
- package/dist/audit.d.ts.map +0 -1
- package/dist/audit.js +0 -55
- package/dist/audit.js.map +0 -1
- package/dist/instrumentation.d.ts +0 -114
- package/dist/instrumentation.d.ts.map +0 -1
- package/dist/instrumentation.js +0 -303
- package/dist/instrumentation.js.map +0 -1
- package/dist/trace-context.d.ts +0 -80
- package/dist/trace-context.d.ts.map +0 -1
- package/dist/trace-context.js +0 -92
- package/dist/trace-context.js.map +0 -1
- package/src/audit.ts +0 -92
- package/src/instrumentation.ts +0 -491
- package/src/trace-context.ts +0 -166
package/dist/ui.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { devtoolsNotFoundResponse, isDevtoolsRouteEnabled, } from "./access";
|
|
1
|
+
import { devtoolsNotFoundResponse, isDevtoolsRouteEnabled, } from "./access.js";
|
|
2
|
+
import { devtoolsPanelModelBrowserSource } from "./ui-model.js";
|
|
2
3
|
/**
|
|
3
4
|
* Devtools UI handler
|
|
4
5
|
*
|
|
@@ -85,6 +86,22 @@ button.danger:hover{border-color:rgba(225,29,72,.24);background:#fff1f2}
|
|
|
85
86
|
.detail-title{color:var(--text);font-family:var(--font-sans);font-size:12px;font-weight:650;margin-bottom:6px}
|
|
86
87
|
.correlated{display:flex;flex-direction:column;gap:6px}
|
|
87
88
|
.correlated-row{display:flex;gap:7px;align-items:flex-start;color:var(--text-muted)}
|
|
89
|
+
.request-map{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;margin-bottom:12px}
|
|
90
|
+
.request-fact{border:1px solid var(--border);border-radius:7px;background:var(--surface);padding:9px 10px;min-width:0}
|
|
91
|
+
.request-fact-label{font-size:10px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.1em}
|
|
92
|
+
.request-fact-value{font-family:var(--font-mono);font-size:12px;color:var(--text);margin-top:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
93
|
+
.detail-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;margin-bottom:10px}
|
|
94
|
+
.lifecycle{display:flex;flex-direction:column;gap:7px}
|
|
95
|
+
.phase-row{display:grid;grid-template-columns:108px minmax(130px,.8fr) minmax(180px,1.2fr) 92px;gap:8px;align-items:start;border:1px solid var(--border);border-radius:7px;background:var(--bg);padding:8px}
|
|
96
|
+
.phase-name{font-family:var(--font-mono);font-size:11px;color:var(--text)}
|
|
97
|
+
.phase-summary{color:var(--text-muted);font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
98
|
+
.phase-meta{font-family:var(--font-mono);font-size:10px;color:var(--text-dim)}
|
|
99
|
+
.owner-pill{display:inline-block;border:1px solid var(--border);border-radius:999px;background:var(--surface-2);color:var(--text-muted);font-family:var(--font-mono);font-size:10px;padding:2px 6px;line-height:1.4}
|
|
100
|
+
.owner-framework,.owner-provider,.owner-devtools{color:var(--red);background:#fff1f2;border-color:#ffe4e6}
|
|
101
|
+
.owner-route{color:var(--green);background:#ecfdf5;border-color:#d1fae5}
|
|
102
|
+
.owner-transport,.owner-client{color:var(--blue);background:#eff6ff;border-color:#dbeafe}
|
|
103
|
+
.owner-job,.owner-schedule,.owner-outbox{color:var(--orange);background:#fff7ed;border-color:#fed7aa}
|
|
104
|
+
.redaction-note{border:1px solid var(--border);border-radius:7px;background:var(--surface);padding:8px 10px;color:var(--text-muted);font-size:12px;margin-top:8px}
|
|
88
105
|
.focus-panel{display:flex;flex-direction:column}
|
|
89
106
|
.focus-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:14px;border-bottom:1px solid var(--border);background:var(--bg)}
|
|
90
107
|
.focus-title{font-size:15px;line-height:1.2;font-weight:720;color:var(--text)}
|
|
@@ -94,7 +111,7 @@ button.danger:hover{border-color:rgba(225,29,72,.24);background:#fff1f2}
|
|
|
94
111
|
.focus-metric-label{font-size:10px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.1em}
|
|
95
112
|
.focus-metric-value{font-family:var(--font-mono);font-size:15px;color:var(--text);margin-top:3px}
|
|
96
113
|
.event-table{display:flex;flex-direction:column}
|
|
97
|
-
.table-row{display:grid;grid-template-columns:86px minmax(140px,.
|
|
114
|
+
.table-row{display:grid;grid-template-columns:86px minmax(140px,.8fr) minmax(210px,1.2fr) minmax(130px,.8fr) 78px 104px;gap:10px;align-items:start;padding:11px 14px;border-bottom:1px solid var(--border);cursor:pointer;transition:background .1s}
|
|
98
115
|
.table-row:last-child{border-bottom:0}
|
|
99
116
|
.table-row:hover{background:var(--surface)}
|
|
100
117
|
.table-row.open{background:#f8fafc}
|
|
@@ -102,8 +119,31 @@ button.danger:hover{border-color:rgba(225,29,72,.24);background:#fff1f2}
|
|
|
102
119
|
.table-cell strong{display:block;color:var(--text);font-size:13px;font-weight:650;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
103
120
|
.table-cell code{font-family:var(--font-mono);font-size:11px;color:var(--text-muted);background:var(--surface-2);border:1px solid var(--border);border-radius:4px;padding:1px 4px}
|
|
104
121
|
.table-summary{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
122
|
+
.table-correlation{display:flex;flex-wrap:wrap;gap:4px}
|
|
123
|
+
.table-empty{font-family:var(--font-mono);font-size:10px;color:var(--text-dim)}
|
|
105
124
|
.table-detail{display:none;grid-column:1/-1;margin-top:2px;padding-top:10px;border-top:1px solid var(--border);font-family:var(--font-mono);font-size:11px;color:var(--text-muted);line-height:1.7;white-space:pre-wrap;word-break:break-word}
|
|
106
125
|
.table-row.open .table-detail{display:block}
|
|
126
|
+
.table-detail-note{font-family:var(--font-sans);font-size:12px;color:var(--text-muted);margin-bottom:8px;white-space:normal}
|
|
127
|
+
.result-chip{display:inline-block;border:1px solid var(--border);border-radius:5px;background:var(--surface);font-family:var(--font-mono);font-size:10px;color:var(--text-muted);padding:2px 5px}
|
|
128
|
+
.result-failed,.result-blocked,.result-deadLettered{color:var(--red);background:#fff1f2;border-color:#ffe4e6}
|
|
129
|
+
.result-retryScheduled{color:var(--orange);background:#fff7ed;border-color:#fed7aa}
|
|
130
|
+
.result-delivered,.result-completed,.result-allowed,.result-hit,.result-signed_in{color:var(--green);background:#ecfdf5;border-color:#d1fae5}
|
|
131
|
+
.error-board{display:flex;flex-direction:column}
|
|
132
|
+
.error-owner-strip{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;padding:14px;border-bottom:1px solid var(--border);background:var(--bg)}
|
|
133
|
+
.error-owner-card{border:1px solid var(--border);border-radius:7px;background:var(--surface);padding:9px 10px;min-width:0}
|
|
134
|
+
.error-owner-card strong{display:block;font-family:var(--font-mono);font-size:15px;color:var(--text)}
|
|
135
|
+
.error-owner-card span{display:block;color:var(--text-muted);font-size:10px;text-transform:uppercase;letter-spacing:.1em;margin-top:2px}
|
|
136
|
+
.error-group{border-bottom:1px solid var(--border)}
|
|
137
|
+
.error-group:last-child{border-bottom:0}
|
|
138
|
+
.error-group-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 14px;background:var(--surface)}
|
|
139
|
+
.error-group-title{display:flex;align-items:center;gap:7px;font-size:13px;font-weight:700;color:var(--text)}
|
|
140
|
+
.error-group-count{font-family:var(--font-mono);font-size:11px;color:var(--text-muted)}
|
|
141
|
+
.error-row{display:grid;grid-template-columns:86px minmax(170px,1fr) 90px minmax(150px,.9fr) minmax(140px,.8fr);gap:10px;align-items:start;padding:11px 14px;border-top:1px solid var(--border);cursor:pointer;transition:background .1s}
|
|
142
|
+
.error-row:hover{background:var(--surface)}
|
|
143
|
+
.error-row.open{background:#f8fafc}
|
|
144
|
+
.error-message{min-width:0;color:var(--text);font-size:13px;font-weight:650;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
145
|
+
.error-context{font-family:var(--font-mono);font-size:11px;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
146
|
+
.error-related{display:flex;flex-direction:column;gap:5px;margin-top:8px}
|
|
107
147
|
.empty{text-align:center;padding:58px 16px;color:var(--text-dim);font-size:13px;background:var(--bg)}
|
|
108
148
|
.badge{display:inline-block;font-size:10px;font-weight:650;padding:2px 6px;border-radius:4px;text-transform:uppercase;letter-spacing:.06em;line-height:1.4;border:1px solid transparent}
|
|
109
149
|
.badge-request{background:#eff6ff;color:var(--blue);border-color:#dbeafe}
|
|
@@ -111,6 +151,7 @@ button.danger:hover{border-color:rgba(225,29,72,.24);background:#fff1f2}
|
|
|
111
151
|
.badge-usecase{background:#f5f3ff;color:var(--purple);border-color:#ede9fe}
|
|
112
152
|
.badge-eventBus{background:#ecfdf5;color:var(--green);border-color:#d1fae5}
|
|
113
153
|
.badge-job{background:#fff7ed;color:var(--orange);border-color:#fed7aa}
|
|
154
|
+
.badge-outbox{background:#fefce8;color:#a16207;border-color:#fef08a}
|
|
114
155
|
.badge-schedule{background:#f0f9ff;color:#0369a1;border-color:#bae6fd}
|
|
115
156
|
.badge-provider{background:#f8fafc;color:var(--gray);border-color:var(--border)}
|
|
116
157
|
.badge-custom{background:#f0fdfa;color:#0f766e;border-color:#ccfbf1}
|
|
@@ -137,9 +178,14 @@ button.danger:hover{border-color:rgba(225,29,72,.24);background:#fff1f2}
|
|
|
137
178
|
.event-time{min-width:0}
|
|
138
179
|
.event-summary{white-space:normal}
|
|
139
180
|
.request-detail{grid-template-columns:1fr}
|
|
181
|
+
.request-map{grid-template-columns:repeat(2,minmax(0,1fr))}
|
|
182
|
+
.detail-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
|
|
183
|
+
.phase-row{grid-template-columns:1fr;gap:5px}
|
|
140
184
|
.focus-head{flex-direction:column}
|
|
141
185
|
.focus-metrics{grid-template-columns:repeat(2,minmax(0,1fr));min-width:0;width:100%}
|
|
142
186
|
.table-row{grid-template-columns:1fr;gap:6px}
|
|
187
|
+
.error-owner-strip{grid-template-columns:repeat(2,minmax(0,1fr))}
|
|
188
|
+
.error-row{grid-template-columns:1fr;gap:6px}
|
|
143
189
|
.table-detail{grid-column:auto}
|
|
144
190
|
}
|
|
145
191
|
</style>
|
|
@@ -150,7 +196,7 @@ button.danger:hover{border-color:rgba(225,29,72,.24);background:#fff1f2}
|
|
|
150
196
|
<div>
|
|
151
197
|
<div class="brand"><span class="mark">B</span><span>Beignet</span></div>
|
|
152
198
|
<h1>Beignet <span>Devtools</span></h1>
|
|
153
|
-
<div class="subtitle">A local timeline for requests, use cases, errors, jobs, schedules, and provider activity.</div>
|
|
199
|
+
<div class="subtitle">A local timeline for requests, use cases, errors, jobs, outbox delivery, schedules, and provider activity.</div>
|
|
154
200
|
</div>
|
|
155
201
|
<div class="controls">
|
|
156
202
|
<span class="status"><span class="dot" id="statusDot"></span><span id="statusText">Connecting</span></span>
|
|
@@ -205,6 +251,7 @@ button.danger:hover{border-color:rgba(225,29,72,.24);background:#fff1f2}
|
|
|
205
251
|
{id:"errors",label:"Errors",type:"error",watcher:"errors"},
|
|
206
252
|
{id:"events",label:"Events",type:"eventBus",watcher:"eventBus"},
|
|
207
253
|
{id:"jobs",label:"Jobs",type:"job",watcher:"jobs"},
|
|
254
|
+
{id:"outbox",label:"Outbox",watcher:"outbox",watcherName:"outbox"},
|
|
208
255
|
{id:"schedules",label:"Schedules",type:"schedule",watcher:"schedules"},
|
|
209
256
|
{id:"providers",label:"Providers",type:"provider",watcher:"providers"},
|
|
210
257
|
{id:"db",label:"Database",type:"custom",watcher:"db",watcherName:"db"},
|
|
@@ -218,8 +265,9 @@ button.danger:hover{border-color:rgba(225,29,72,.24);background:#fff1f2}
|
|
|
218
265
|
{id:"rateLimit",label:"Rate limits",type:"custom",watcher:"rateLimit",watcherName:"rateLimit"},
|
|
219
266
|
{id:"custom",label:"Custom",type:"custom",watcher:"custom"}
|
|
220
267
|
];
|
|
221
|
-
const FOCUS_PANEL_TABS={events:true,jobs:true,schedules:true,db:true,cache:true,storage:true,uploads:true,mail:true,notifications:true,auth:true,audit:true,rateLimit:true};
|
|
222
|
-
const BUILT_IN_WATCHERS={requests:true,errors:true,useCases:true,eventBus:true,jobs:true,schedules:true,providers:true,db:true,cache:true,storage:true,uploads:true,mail:true,notifications:true,auth:true,audit:true,rateLimit:true,custom:true};
|
|
268
|
+
const FOCUS_PANEL_TABS={events:true,jobs:true,outbox:true,schedules:true,db:true,cache:true,storage:true,uploads:true,mail:true,notifications:true,auth:true,audit:true,rateLimit:true};
|
|
269
|
+
const BUILT_IN_WATCHERS={requests:true,errors:true,useCases:true,eventBus:true,jobs:true,outbox:true,schedules:true,providers:true,db:true,cache:true,storage:true,uploads:true,mail:true,notifications:true,auth:true,audit:true,rateLimit:true,custom:true};
|
|
270
|
+
const ERROR_OWNERS=["route","framework","provider","job","schedule","outbox","client","devtools","unknown"];
|
|
223
271
|
let events=[];
|
|
224
272
|
let watchers=[];
|
|
225
273
|
let activeTab=localStorage.getItem("beignet-devtools-tab")||"timeline";
|
|
@@ -286,6 +334,7 @@ button.danger:hover{border-color:rgba(225,29,72,.24);background:#fff1f2}
|
|
|
286
334
|
case "usecase": return e.name+" ("+e.phase+")"+(e.durationMs!==undefined?" "+e.durationMs+"ms":"");
|
|
287
335
|
case "eventBus": return e.eventName||"Domain event";
|
|
288
336
|
case "job": return e.jobName+" -> "+e.status;
|
|
337
|
+
case "outbox": return e.messageName+" ("+e.messageKind+") -> "+e.status;
|
|
289
338
|
case "schedule": return e.scheduleName+" -> "+e.status;
|
|
290
339
|
case "provider": return e.providerName+" -> "+e.action;
|
|
291
340
|
case "custom": return (e.label||e.name||"Custom event")+(e.summary?" - "+e.summary:"");
|
|
@@ -294,6 +343,7 @@ button.danger:hover{border-color:rgba(225,29,72,.24);background:#fff1f2}
|
|
|
294
343
|
}
|
|
295
344
|
|
|
296
345
|
function tabMatchesEvent(tab,event){
|
|
346
|
+
if(tab.id==="errors")return event.type==="error"||failureFor(event);
|
|
297
347
|
if(tab.type&&event.type!==tab.type)return false;
|
|
298
348
|
if(tab.watcherName&&event.watcher!==tab.watcherName)return false;
|
|
299
349
|
return true;
|
|
@@ -307,6 +357,7 @@ button.danger:hover{border-color:rgba(225,29,72,.24);background:#fff1f2}
|
|
|
307
357
|
case "usecase": return "useCases";
|
|
308
358
|
case "eventBus": return "eventBus";
|
|
309
359
|
case "job": return "jobs";
|
|
360
|
+
case "outbox": return "outbox";
|
|
310
361
|
case "schedule": return "schedules";
|
|
311
362
|
case "provider": return "providers";
|
|
312
363
|
case "custom": return "custom";
|
|
@@ -384,6 +435,9 @@ button.danger:hover{border-color:rgba(225,29,72,.24);background:#fff1f2}
|
|
|
384
435
|
event.summary,
|
|
385
436
|
event.eventName,
|
|
386
437
|
event.jobName,
|
|
438
|
+
event.messageId,
|
|
439
|
+
event.messageKind,
|
|
440
|
+
event.messageName,
|
|
387
441
|
event.providerName,
|
|
388
442
|
event.action,
|
|
389
443
|
jsonSearch(event.details)
|
|
@@ -419,6 +473,164 @@ button.danger:hover{border-color:rgba(225,29,72,.24);background:#fff1f2}
|
|
|
419
473
|
});
|
|
420
474
|
}
|
|
421
475
|
|
|
476
|
+
function eventTimeValue(event){
|
|
477
|
+
const time=Date.parse(event.timestamp||"");
|
|
478
|
+
return Number.isFinite(time)?time:0;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
function responseOwnerFor(event){
|
|
482
|
+
const details=detailsObject(event);
|
|
483
|
+
const response=details.response&&typeof details.response==="object"?details.response:{};
|
|
484
|
+
return event.responseOwner||event.owner||response.owner||"unknown";
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
function ownerClass(owner){
|
|
488
|
+
return "owner-"+String(owner||"unknown").replace(/[^a-zA-Z0-9_-]/g,"");
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
function ownerPill(owner){
|
|
492
|
+
const value=owner||"unknown";
|
|
493
|
+
return '<span class="owner-pill '+esc(ownerClass(value))+'">'+esc(value)+'</span>';
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
function categoryFor(event){
|
|
497
|
+
const watcher=inferredWatcher(event);
|
|
498
|
+
if(event.type==="request")return"HTTP";
|
|
499
|
+
if(event.type==="usecase")return"Use case";
|
|
500
|
+
if(event.type==="error")return"Error";
|
|
501
|
+
if(event.type==="provider")return"Provider";
|
|
502
|
+
if(event.type==="eventBus")return"Domain event";
|
|
503
|
+
if(event.type==="outbox")return"Outbox";
|
|
504
|
+
if(event.type==="job")return"Job";
|
|
505
|
+
if(event.type==="schedule")return"Schedule";
|
|
506
|
+
if(["db","cache","storage","uploads","mail","notifications","auth","audit","rateLimit"].indexOf(watcher)>=0)return"Provider work";
|
|
507
|
+
return watcher==="custom"?"Custom":"Provider work";
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
function ownerForEvent(event){
|
|
511
|
+
if(event.owner)return event.owner;
|
|
512
|
+
const watcher=inferredWatcher(event);
|
|
513
|
+
if(event.type==="error")return responseOwnerFor(event);
|
|
514
|
+
if(event.type==="provider")return"provider";
|
|
515
|
+
if(event.type==="job")return"job";
|
|
516
|
+
if(event.type==="schedule")return"schedule";
|
|
517
|
+
if(event.type==="outbox")return"outbox";
|
|
518
|
+
if(["db","cache","storage","uploads","mail","notifications","auth","audit","rateLimit"].indexOf(watcher)>=0)return"provider";
|
|
519
|
+
if(event.type==="request")return responseOwnerFor(event);
|
|
520
|
+
return"route";
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
function relatedEventsFor(event){
|
|
524
|
+
return events.filter(function(candidate){
|
|
525
|
+
if(candidate.id===event.id)return false;
|
|
526
|
+
if(event.traceId&&candidate.traceId===event.traceId)return true;
|
|
527
|
+
return Boolean(event.requestId)&&candidate.requestId===event.requestId;
|
|
528
|
+
});
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
function requestForEvent(event){
|
|
532
|
+
return relatedEventsFor(event).filter(function(candidate){return candidate.type==="request"}).sort(function(a,b){return eventTimeValue(b)-eventTimeValue(a)})[0];
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
function statusForEvent(event){
|
|
536
|
+
if(event.status!==undefined)return event.status;
|
|
537
|
+
const request=requestForEvent(event);
|
|
538
|
+
if(request&&request.status!==undefined)return request.status;
|
|
539
|
+
const details=detailsObject(event);
|
|
540
|
+
const response=details.response&&typeof details.response==="object"?details.response:{};
|
|
541
|
+
return response.status||"";
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
function contractForEvent(event){
|
|
545
|
+
const request=requestForEvent(event);
|
|
546
|
+
return event.contractName||event.useCaseName||(request&&request.contractName)||"";
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
function pathForEvent(event){
|
|
550
|
+
const request=requestForEvent(event);
|
|
551
|
+
return event.path||(request&&request.path)||"";
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
function correlationFor(event){
|
|
555
|
+
const rid=event.requestId?'<span class="request-id">'+esc(event.requestId)+'</span>':"";
|
|
556
|
+
const trace=event.traceId?'<span class="trace-id">trace '+esc(event.traceId.slice(0,8))+'</span>':"";
|
|
557
|
+
return rid+trace||'<span class="table-empty">n/a</span>';
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
function unsafeMetadataPaths(value,path){
|
|
561
|
+
if(!value||typeof value!=="object")return[];
|
|
562
|
+
return Object.entries(value).flatMap(function(entry){
|
|
563
|
+
const key=entry[0];
|
|
564
|
+
const nested=entry[1];
|
|
565
|
+
const next=path.concat(key);
|
|
566
|
+
const lower=key.toLowerCase();
|
|
567
|
+
const sensitive=lower==="authorization"||lower==="cookie"||lower==="set-cookie"||lower.indexOf("token")>=0||lower.indexOf("password")>=0||lower.indexOf("secret")>=0||lower.indexOf("credential")>=0;
|
|
568
|
+
if(sensitive&&nested!=="[redacted]")return[next.join(".")];
|
|
569
|
+
return unsafeMetadataPaths(nested,next);
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
function requestFact(label,value){
|
|
574
|
+
const display=value===undefined||value===null||value===""?"n/a":value;
|
|
575
|
+
return '<div class="request-fact"><div class="request-fact-label">'+esc(label)+'</div><div class="request-fact-value" title="'+esc(display)+'">'+esc(display)+'</div></div>';
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
function detailGrid(items){
|
|
579
|
+
return '<div class="detail-grid">'+items.map(function(item){return requestFact(item[0],item[1])}).join("")+'</div>';
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
function requestOverview(request,related){
|
|
583
|
+
return '<div class="request-map">'+
|
|
584
|
+
requestFact("Route",request.contractName||"unmatched")+
|
|
585
|
+
requestFact("Method",request.method||"")+
|
|
586
|
+
requestFact("Path",request.path||"")+
|
|
587
|
+
requestFact("Status",request.status||"")+
|
|
588
|
+
requestFact("Duration",request.durationMs!==undefined?request.durationMs+"ms":"")+
|
|
589
|
+
requestFact("Owner",responseOwnerFor(request))+
|
|
590
|
+
requestFact("Trace",request.traceId||"")+
|
|
591
|
+
requestFact("Related",related.length)+
|
|
592
|
+
'</div>';
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
function requestLifecycleRows(request,related){
|
|
596
|
+
const rows=[request].concat(related).sort(function(a,b){return eventTimeValue(a)-eventTimeValue(b)});
|
|
597
|
+
return rows.map(function(event){
|
|
598
|
+
const duration=durationFor(event);
|
|
599
|
+
const durationLabel=duration===undefined?"":duration+"ms";
|
|
600
|
+
return '<div class="phase-row">'+
|
|
601
|
+
'<div>'+eventBadge(event)+'</div>'+
|
|
602
|
+
'<div><strong class="phase-name">'+esc(categoryFor(event))+'</strong><div class="phase-meta">'+esc(durationLabel||inferredWatcher(event))+'</div></div>'+
|
|
603
|
+
'<div class="phase-summary" title="'+esc(summarize(event))+'">'+esc(summarize(event))+'</div>'+
|
|
604
|
+
'<div>'+ownerPill(ownerForEvent(event))+'</div>'+
|
|
605
|
+
'</div>';
|
|
606
|
+
}).join("");
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
function groupedRelatedRows(related){
|
|
610
|
+
const groups=["Use case","Provider work","Domain event","Outbox","Job","Schedule","Error","Provider","Custom"];
|
|
611
|
+
return groups.map(function(group){
|
|
612
|
+
const groupEvents=related.filter(function(event){return categoryFor(event)===group});
|
|
613
|
+
if(!groupEvents.length)return"";
|
|
614
|
+
const rows=groupEvents.slice().sort(function(a,b){return eventTimeValue(a)-eventTimeValue(b)}).map(function(event){
|
|
615
|
+
return '<div class="correlated-row">'+eventBadge(event)+'<span>'+esc(summarize(event))+'</span>'+ownerPill(ownerForEvent(event))+'</div>';
|
|
616
|
+
}).join("");
|
|
617
|
+
return '<section class="detail-section"><div class="detail-title">'+esc(group)+'</div><div class="correlated">'+rows+'</div></section>';
|
|
618
|
+
}).join("");
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
function redactionNote(request,related){
|
|
622
|
+
const all=[request].concat(related);
|
|
623
|
+
const redacted=all.some(function(event){return hasRedactedValue(event)});
|
|
624
|
+
const unsafe=Array.from(new Set(all.flatMap(function(event){return unsafeMetadataPaths(event,[])}))).slice(0,4);
|
|
625
|
+
if(unsafe.length){
|
|
626
|
+
return '<div class="redaction-note">Unsafe-looking metadata keys remain visible: '+esc(unsafe.join(", "))+'</div>';
|
|
627
|
+
}
|
|
628
|
+
if(redacted){
|
|
629
|
+
return '<div class="redaction-note">Sensitive metadata was redacted before storage.</div>';
|
|
630
|
+
}
|
|
631
|
+
return '<div class="redaction-note">No redacted fields detected in the stored events for this request.</div>';
|
|
632
|
+
}
|
|
633
|
+
|
|
422
634
|
function updateStats(){
|
|
423
635
|
$statTotal.textContent=String(events.length);
|
|
424
636
|
$statRequests.textContent=String(events.filter(function(event){return event.type==="request"}).length);
|
|
@@ -491,179 +703,49 @@ button.danger:hover{border-color:rgba(225,29,72,.24);background:#fff1f2}
|
|
|
491
703
|
function renderRequests(list){
|
|
492
704
|
return list.slice().reverse().map(function(request){
|
|
493
705
|
const related=correlatedEvents(request);
|
|
494
|
-
const relatedHtml=related.length
|
|
495
|
-
? related.slice().reverse().map(function(event){
|
|
496
|
-
return '<div class="correlated-row">'+eventBadge(event)+'<span>'+esc(summarize(event))+'</span></div>';
|
|
497
|
-
}).join("")
|
|
498
|
-
: '<div class="empty">No correlated events for this request.</div>';
|
|
499
706
|
const detail='<div class="request-detail">'+
|
|
500
|
-
'<section class="detail-section"><div class="detail-title">Request</div
|
|
501
|
-
'<section class="detail-section"><div class="detail-title">Correlated
|
|
707
|
+
'<section class="detail-section"><div class="detail-title">Request lifecycle</div>'+requestOverview(request,related)+'<div class="lifecycle">'+requestLifecycleRows(request,related)+'</div>'+redactionNote(request,related)+'</section>'+
|
|
708
|
+
'<section class="detail-section"><div class="detail-title">Correlated activity</div>'+(related.length?groupedRelatedRows(related):'<div class="empty">No correlated events for this request.</div>')+'<pre>'+json(request)+'</pre></section>'+
|
|
502
709
|
'</div>';
|
|
503
710
|
return eventRow(request,detail);
|
|
504
711
|
}).join("");
|
|
505
712
|
}
|
|
506
713
|
|
|
507
|
-
function detailsObject(event){
|
|
508
|
-
return event.details&&typeof event.details==="object"&&!Array.isArray(event.details)?event.details:{};
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
function detailValue(event,key){
|
|
512
|
-
return detailsObject(event)[key];
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
function durationFor(event){
|
|
516
|
-
const detailDuration=detailValue(event,"durationMs");
|
|
517
|
-
const duration=event.durationMs!==undefined?event.durationMs:detailDuration;
|
|
518
|
-
return typeof duration==="number"&&Number.isFinite(duration)?duration:undefined;
|
|
519
|
-
}
|
|
520
|
-
|
|
521
|
-
function providerFor(event){
|
|
522
|
-
const details=detailsObject(event);
|
|
523
|
-
return details.providerName||details.provider||details.portName||"";
|
|
524
|
-
}
|
|
525
|
-
|
|
526
|
-
function failureFor(event){
|
|
527
|
-
const details=detailsObject(event);
|
|
528
|
-
if(event.type==="error")return true;
|
|
529
|
-
if(typeof event.status==="string")return event.status==="failed";
|
|
530
|
-
if(typeof event.name==="string"&&event.name.indexOf("failed")>=0)return true;
|
|
531
|
-
return Boolean(details.error)||details.allowed===false;
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
function averageDuration(list){
|
|
535
|
-
const durations=list.map(durationFor).filter(function(value){return value!==undefined});
|
|
536
|
-
if(!durations.length)return "n/a";
|
|
537
|
-
const total=durations.reduce(function(sum,value){return sum+value},0);
|
|
538
|
-
return Math.round(total/durations.length)+"ms";
|
|
539
|
-
}
|
|
540
|
-
|
|
541
|
-
function distinctCount(list,selector){
|
|
542
|
-
const values=new Set();
|
|
543
|
-
list.forEach(function(event){
|
|
544
|
-
const value=selector(event);
|
|
545
|
-
if(value!==undefined&&value!==null&&String(value)!=="")values.add(String(value));
|
|
546
|
-
});
|
|
547
|
-
return values.size;
|
|
548
|
-
}
|
|
549
|
-
|
|
550
714
|
function metric(label,value){
|
|
551
715
|
return '<div class="focus-metric"><div class="focus-metric-label">'+esc(label)+'</div><div class="focus-metric-value">'+esc(value)+'</div></div>';
|
|
552
716
|
}
|
|
553
717
|
|
|
554
|
-
|
|
555
|
-
switch(tab.id){
|
|
556
|
-
case "events": return {title:"Domain events",subtitle:"Published facts and event bus activity"};
|
|
557
|
-
case "jobs": return {title:"Jobs",subtitle:"Background job lifecycle"};
|
|
558
|
-
case "schedules": return {title:"Schedules",subtitle:"Cron and scheduled task runs"};
|
|
559
|
-
case "db": return {title:"Database",subtitle:"Queries and database provider diagnostics"};
|
|
560
|
-
case "cache": return {title:"Cache",subtitle:"Reads, writes, deletes, and hit rates"};
|
|
561
|
-
case "storage": return {title:"Storage",subtitle:"Object storage operations"};
|
|
562
|
-
case "uploads": return {title:"Uploads",subtitle:"Upload preparation, signing, and completion"};
|
|
563
|
-
case "mail": return {title:"Mail",subtitle:"Delivery attempts and provider results"};
|
|
564
|
-
case "notifications": return {title:"Notifications",subtitle:"Notification intent and channel delivery"};
|
|
565
|
-
case "auth": return {title:"Auth",subtitle:"Session and authentication activity"};
|
|
566
|
-
case "audit": return {title:"Audit",subtitle:"Durable activity records emitted by application code"};
|
|
567
|
-
case "rateLimit": return {title:"Rate limits",subtitle:"Allowed, blocked, and failed checks"};
|
|
568
|
-
default: return {title:tab.label,subtitle:"Subsystem activity"};
|
|
569
|
-
}
|
|
570
|
-
}
|
|
718
|
+
${devtoolsPanelModelBrowserSource()}
|
|
571
719
|
|
|
720
|
+
function summarize(e){return summarizeDevtoolsEvent(e);}
|
|
721
|
+
function inferredWatcher(event){return inferDevtoolsWatcher(event);}
|
|
722
|
+
function eventBadgeLabel(event){return devtoolsEventBadgeLabel(event);}
|
|
723
|
+
function eventBadgeClass(event){return devtoolsEventBadgeClass(event);}
|
|
724
|
+
function durationFor(event){return devtoolsEventDuration(event);}
|
|
725
|
+
function providerFor(event){return devtoolsEventProvider(event);}
|
|
726
|
+
function failureFor(event){return devtoolsEventFailure(event);}
|
|
727
|
+
function hasRedactedValue(value){return hasDevtoolsRedactedValue(value);}
|
|
728
|
+
function panelMeta(tab){return devtoolsPanelMeta(tab.id,tab.label);}
|
|
572
729
|
function panelMetrics(tab,list){
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
metric("Events",list.length),
|
|
577
|
-
metric("Names",distinctCount(list,function(event){return event.eventName})),
|
|
578
|
-
metric("Traces",distinctCount(list,function(event){return event.traceId})),
|
|
579
|
-
metric("Requests",distinctCount(list,function(event){return event.requestId}))
|
|
580
|
-
].join("");
|
|
581
|
-
case "jobs":
|
|
582
|
-
return [
|
|
583
|
-
metric("Jobs",list.length),
|
|
584
|
-
metric("Failed",list.filter(failureFor).length),
|
|
585
|
-
metric("Names",distinctCount(list,function(event){return event.jobName})),
|
|
586
|
-
metric("Providers",distinctCount(list,providerFor))
|
|
587
|
-
].join("");
|
|
588
|
-
case "schedules":
|
|
589
|
-
return [
|
|
590
|
-
metric("Runs",list.length),
|
|
591
|
-
metric("Failed",list.filter(failureFor).length),
|
|
592
|
-
metric("Names",distinctCount(list,function(event){return event.scheduleName})),
|
|
593
|
-
metric("Cron",distinctCount(list,function(event){return event.cron}))
|
|
594
|
-
].join("");
|
|
595
|
-
case "cache":
|
|
596
|
-
return [
|
|
597
|
-
metric("Operations",list.length),
|
|
598
|
-
metric("Hits",list.filter(function(event){return detailValue(event,"hit")===true}).length),
|
|
599
|
-
metric("Failures",list.filter(failureFor).length),
|
|
600
|
-
metric("Avg",averageDuration(list))
|
|
601
|
-
].join("");
|
|
602
|
-
case "auth":
|
|
603
|
-
return [
|
|
604
|
-
metric("Events",list.length),
|
|
605
|
-
metric("Authenticated",list.filter(function(event){return detailValue(event,"authenticated")===true}).length),
|
|
606
|
-
metric("Failures",list.filter(failureFor).length),
|
|
607
|
-
metric("Avg",averageDuration(list))
|
|
608
|
-
].join("");
|
|
609
|
-
case "audit":
|
|
610
|
-
return [
|
|
611
|
-
metric("Entries",list.length),
|
|
612
|
-
metric("Failures",list.filter(function(event){return detailValue(event,"outcome")==="failure"}).length),
|
|
613
|
-
metric("Actors",distinctCount(list,function(event){const actor=detailValue(event,"actor");return actor&&actor.id})),
|
|
614
|
-
metric("Resources",distinctCount(list,function(event){const resource=detailValue(event,"resource");return resource&&resource.id}))
|
|
615
|
-
].join("");
|
|
616
|
-
case "rateLimit":
|
|
617
|
-
return [
|
|
618
|
-
metric("Checks",list.length),
|
|
619
|
-
metric("Allowed",list.filter(function(event){return detailValue(event,"allowed")===true}).length),
|
|
620
|
-
metric("Blocked",list.filter(function(event){return detailValue(event,"allowed")===false}).length),
|
|
621
|
-
metric("Avg",averageDuration(list))
|
|
622
|
-
].join("");
|
|
623
|
-
default:
|
|
624
|
-
return [
|
|
625
|
-
metric("Events",list.length),
|
|
626
|
-
metric("Failures",list.filter(failureFor).length),
|
|
627
|
-
metric("Providers",distinctCount(list,providerFor)),
|
|
628
|
-
metric("Avg",averageDuration(list))
|
|
629
|
-
].join("");
|
|
630
|
-
}
|
|
730
|
+
return devtoolsPanelMetrics(tab.id,list).map(function(item){
|
|
731
|
+
return metric(item.label,item.value);
|
|
732
|
+
}).join("");
|
|
631
733
|
}
|
|
632
|
-
|
|
633
|
-
function
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
default: return summarize(event);
|
|
640
|
-
}
|
|
734
|
+
function primaryFor(event){return devtoolsPanelPrimary(tabFor(activeTab).id,event);}
|
|
735
|
+
function secondaryFor(event){return devtoolsPanelSecondary(tabFor(activeTab).id,event);}
|
|
736
|
+
function resultFor(event){return devtoolsPanelResult(event);}
|
|
737
|
+
function tableDetailFor(tab,event){
|
|
738
|
+
const detail=devtoolsPanelDetail(tab.id,event);
|
|
739
|
+
return detailGrid(detail.fields.map(function(item){return [item.label,item.value]}))+
|
|
740
|
+
'<div class="table-detail-note">'+esc(detail.note)+'</div><pre>'+json(event)+'</pre>';
|
|
641
741
|
}
|
|
642
742
|
|
|
643
|
-
function
|
|
644
|
-
const
|
|
645
|
-
|
|
646
|
-
if(event.type==="job")return event.status;
|
|
647
|
-
if(event.type==="schedule")return event.status;
|
|
648
|
-
if(event.type==="eventBus")return event.requestId||event.traceId||"";
|
|
649
|
-
if(event.name)return event.name;
|
|
650
|
-
return inferredWatcher(event);
|
|
743
|
+
function resultChip(value){
|
|
744
|
+
const normalized=String(value||"").replace(/[^a-zA-Z0-9_-]/g,"_");
|
|
745
|
+
return '<span class="result-chip result-'+esc(normalized)+'">'+esc(value||"n/a")+'</span>';
|
|
651
746
|
}
|
|
652
747
|
|
|
653
|
-
function
|
|
654
|
-
const details=detailsObject(event);
|
|
655
|
-
if(details.allowed===true)return "allowed";
|
|
656
|
-
if(details.allowed===false)return "blocked";
|
|
657
|
-
if(details.hit===true)return "hit";
|
|
658
|
-
if(details.hit===false)return "miss";
|
|
659
|
-
if(details.authenticated===true)return "signed in";
|
|
660
|
-
if(details.authenticated===false)return "guest";
|
|
661
|
-
if(event.status)return event.status;
|
|
662
|
-
if(details.error)return "failed";
|
|
663
|
-
return providerFor(event)||inferredWatcher(event);
|
|
664
|
-
}
|
|
665
|
-
|
|
666
|
-
function tableRow(event){
|
|
748
|
+
function tableRow(tab,event){
|
|
667
749
|
const time=event.timestamp?new Date(event.timestamp).toLocaleTimeString():"";
|
|
668
750
|
const duration=durationFor(event);
|
|
669
751
|
const durationLabel=duration===undefined?"":duration+"ms";
|
|
@@ -672,15 +754,16 @@ button.danger:hover{border-color:rgba(225,29,72,.24);background:#fff1f2}
|
|
|
672
754
|
'<div class="table-cell">'+esc(time)+'</div>'+
|
|
673
755
|
'<div class="table-cell"><strong>'+esc(primaryFor(event))+'</strong><code>'+esc(secondaryFor(event))+'</code></div>'+
|
|
674
756
|
'<div class="table-cell table-summary">'+esc(summarize(event))+'</div>'+
|
|
757
|
+
'<div class="table-cell table-correlation">'+correlationFor(event)+'</div>'+
|
|
675
758
|
'<div class="table-cell">'+esc(durationLabel)+'</div>'+
|
|
676
|
-
'<div class="table-cell">'+
|
|
677
|
-
'<
|
|
759
|
+
'<div class="table-cell">'+resultChip(resultFor(event)||provider)+'</div>'+
|
|
760
|
+
'<div class="table-detail">'+tableDetailFor(tab,event)+'</div>'+
|
|
678
761
|
'</article>';
|
|
679
762
|
}
|
|
680
763
|
|
|
681
764
|
function renderFocusPanel(tab,list){
|
|
682
765
|
const meta=panelMeta(tab);
|
|
683
|
-
const rows=list.slice().reverse().map(tableRow).join("");
|
|
766
|
+
const rows=list.slice().reverse().map(function(event){return tableRow(tab,event)}).join("");
|
|
684
767
|
return '<section class="focus-panel">'+
|
|
685
768
|
'<div class="focus-head">'+
|
|
686
769
|
'<div><h2 class="focus-title">'+esc(meta.title)+'</h2><div class="focus-subtitle">'+esc(meta.subtitle)+'</div></div>'+
|
|
@@ -690,6 +773,65 @@ button.danger:hover{border-color:rgba(225,29,72,.24);background:#fff1f2}
|
|
|
690
773
|
'</section>';
|
|
691
774
|
}
|
|
692
775
|
|
|
776
|
+
function renderErrorOwners(list){
|
|
777
|
+
const owners=ERROR_OWNERS.map(function(owner){
|
|
778
|
+
return {owner:owner,count:list.filter(function(event){return ownerForEvent(event)===owner}).length};
|
|
779
|
+
}).filter(function(item){return item.count>0});
|
|
780
|
+
const cards=(owners.length?owners:[{owner:"none",count:0}]).map(function(item){
|
|
781
|
+
return '<div class="error-owner-card"><strong>'+esc(item.count)+'</strong><span>'+esc(item.owner)+'</span></div>';
|
|
782
|
+
}).join("");
|
|
783
|
+
return '<div class="error-owner-strip">'+cards+'</div>';
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
function renderErrorRelated(event){
|
|
787
|
+
const related=relatedEventsFor(event).filter(function(candidate){return candidate.type!=="error"}).slice().sort(function(a,b){return eventTimeValue(a)-eventTimeValue(b)}).slice(0,8);
|
|
788
|
+
if(!related.length)return '<div class="empty">No related request, provider, or side-effect events.</div>';
|
|
789
|
+
return '<div class="error-related">'+related.map(function(candidate){
|
|
790
|
+
return '<div class="correlated-row">'+eventBadge(candidate)+'<span>'+esc(summarize(candidate))+'</span>'+ownerPill(ownerForEvent(candidate))+'</div>';
|
|
791
|
+
}).join("")+'</div>';
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
function failureMessageFor(event){
|
|
795
|
+
if(event.message)return event.message;
|
|
796
|
+
const details=detailsObject(event);
|
|
797
|
+
const detailError=details.error;
|
|
798
|
+
if(typeof detailError==="string"&&detailError)return detailError;
|
|
799
|
+
if(detailError&&typeof detailError==="object"){
|
|
800
|
+
if(typeof detailError.message==="string")return detailError.message;
|
|
801
|
+
return jsonSearch(detailError);
|
|
802
|
+
}
|
|
803
|
+
return summarize(event)||"Unknown failure";
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
function renderErrorRow(event){
|
|
807
|
+
const time=event.timestamp?new Date(event.timestamp).toLocaleTimeString():"";
|
|
808
|
+
const status=statusForEvent(event);
|
|
809
|
+
const route=[contractForEvent(event),pathForEvent(event)].filter(Boolean).join(" ");
|
|
810
|
+
const relatedCount=relatedEventsFor(event).length;
|
|
811
|
+
const message=failureMessageFor(event);
|
|
812
|
+
return '<article class="error-row" onclick="this.classList.toggle(\\'open\\')">'+
|
|
813
|
+
'<div class="table-cell">'+esc(time)+'</div>'+
|
|
814
|
+
'<div><div class="error-message" title="'+esc(message)+'">'+esc(message)+'</div><div class="error-context">'+esc(route||event.useCaseName||primaryFor(event)||"unmatched")+'</div></div>'+
|
|
815
|
+
'<div>'+ownerPill(ownerForEvent(event))+'</div>'+
|
|
816
|
+
'<div class="table-cell table-correlation">'+correlationFor(event)+'</div>'+
|
|
817
|
+
'<div class="table-cell">'+resultChip(status||relatedCount+" related")+'</div>'+
|
|
818
|
+
'<div class="table-detail">'+renderErrorRelated(event)+'<pre>'+json(event)+'</pre></div>'+
|
|
819
|
+
'</article>';
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
function renderErrorsPanel(list){
|
|
823
|
+
const rowsByOwner=ERROR_OWNERS.map(function(owner){
|
|
824
|
+
const ownerEvents=list.filter(function(event){return ownerForEvent(event)===owner});
|
|
825
|
+
if(!ownerEvents.length)return"";
|
|
826
|
+
const rows=ownerEvents.slice().reverse().map(renderErrorRow).join("");
|
|
827
|
+
return '<section class="error-group">'+
|
|
828
|
+
'<div class="error-group-head"><div class="error-group-title">'+ownerPill(owner)+'<span>'+esc(owner)+' failures</span></div><div class="error-group-count">'+esc(ownerEvents.length)+' errors</div></div>'+
|
|
829
|
+
rows+
|
|
830
|
+
'</section>';
|
|
831
|
+
}).join("");
|
|
832
|
+
return '<section class="error-board">'+renderErrorOwners(list)+rowsByOwner+'</section>';
|
|
833
|
+
}
|
|
834
|
+
|
|
693
835
|
function render(){
|
|
694
836
|
updateStats();
|
|
695
837
|
renderTabs();
|
|
@@ -706,6 +848,10 @@ button.danger:hover{border-color:rgba(225,29,72,.24);background:#fff1f2}
|
|
|
706
848
|
$content.innerHTML=renderRequests(list);
|
|
707
849
|
return;
|
|
708
850
|
}
|
|
851
|
+
if(activeTab==="errors"){
|
|
852
|
+
$content.innerHTML=renderErrorsPanel(list);
|
|
853
|
+
return;
|
|
854
|
+
}
|
|
709
855
|
if(FOCUS_PANEL_TABS[tab.id]){
|
|
710
856
|
$content.innerHTML=renderFocusPanel(tab,list);
|
|
711
857
|
return;
|
package/dist/ui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,+BAA+B,EAAE,MAAM,eAAe,CAAC;AAEhE;;;;GAIG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CACrC,QAAgB,EAChB,UAAsC,EAAE;IAExC,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC;QACrC,OAAO,wBAAwB,EAAE,CAAC;IACpC,CAAC;IAED,MAAM,IAAI,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAE1C,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;QACxB,MAAM,EAAE,GAAG;QACX,OAAO,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE;KACxD,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAgB;IAC1C,MAAM,iBAAiB,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEvD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBA4NO,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAwd7B,+BAA+B,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAuO7B,CAAC;AACT,CAAC"}
|
package/dist/watchers.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { DevtoolsEvent } from "./events";
|
|
1
|
+
import type { DevtoolsEvent } from "./events.js";
|
|
2
2
|
/**
|
|
3
3
|
* Built-in devtools watcher names.
|
|
4
4
|
*/
|
|
5
|
-
export declare const BUILT_IN_DEVTOOLS_WATCHER_NAMES: readonly ["requests", "errors", "useCases", "eventBus", "jobs", "schedules", "providers", "db", "cache", "storage", "uploads", "mail", "notifications", "auth", "audit", "rateLimit", "custom"];
|
|
5
|
+
export declare const BUILT_IN_DEVTOOLS_WATCHER_NAMES: readonly ["requests", "errors", "useCases", "eventBus", "jobs", "outbox", "schedules", "providers", "db", "cache", "storage", "uploads", "mail", "notifications", "auth", "audit", "rateLimit", "custom"];
|
|
6
6
|
/**
|
|
7
7
|
* Name of a built-in devtools watcher.
|
|
8
8
|
*/
|