@mcp-use/inspector 0.6.1 → 0.7.0-canary.4
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/dist/cli.js +297 -20
- package/dist/client/assets/__vite-browser-external-CHS79mP1.js +8 -0
- package/dist/client/assets/browser-DMU1DNWH.js +38211 -0
- package/dist/client/assets/chunk-VL2OQCWN-BSt8dT5C.js +6475 -0
- package/dist/client/assets/display-YIYC6WJE-BffT78jn.js +44742 -0
- package/dist/client/assets/embeddings-DTFNzTmk.js +21 -0
- package/dist/client/assets/index-B1pgTXiT.js +94617 -0
- package/dist/client/assets/index-BANvZe0e.js +17535 -0
- package/dist/client/assets/index-BqRMxNFR.js +10699 -0
- package/dist/client/assets/index-DSsmOzZI.js +5371 -0
- package/dist/client/assets/index-DX0TIfSM.js +102 -0
- package/dist/client/assets/index-Dz-Y_VJx.js +1780 -0
- package/dist/client/assets/index-kVFYovMy.css +5752 -0
- package/dist/client/assets/path-QsnVvLoj.js +62 -0
- package/dist/client/assets/transport-wrapper-browser-ChPHVnHg.js +165 -0
- package/dist/client/assets/winston-BAYefLfc.js +12326 -0
- package/dist/client/index.html +3 -3
- package/dist/server/{chunk-WYBXXYSP.js → chunk-26WTIZ4S.js} +1 -1
- package/dist/server/{chunk-PYGYQT2G.js → chunk-6ZFXPXO4.js} +6 -6
- package/dist/server/chunk-CVECQ7BJ.js +78 -0
- package/dist/server/{chunk-DGUMOD7P.js → chunk-KW44WB52.js} +94 -11
- package/dist/server/chunk-PKBMQBKP.js +7 -0
- package/dist/server/{chunk-37X7HLUV.js → chunk-V5FEV5SU.js} +89 -14
- package/dist/server/{chunk-555LGZ3I.js → chunk-XU7SXB3C.js} +133 -10
- package/dist/server/cli.js +6 -4
- package/dist/server/index.js +7 -5
- package/dist/server/middleware.d.ts +5 -1
- package/dist/server/middleware.d.ts.map +1 -1
- package/dist/server/middleware.js +7 -5
- package/dist/server/rpc-log-bus.d.ts +17 -0
- package/dist/server/rpc-log-bus.d.ts.map +1 -0
- package/dist/server/rpc-log-bus.js +7 -0
- package/dist/server/server.js +6 -4
- package/dist/server/shared-routes.d.ts.map +1 -1
- package/dist/server/shared-routes.js +4 -2
- package/dist/server/shared-static.js +3 -2
- package/dist/server/shared-utils-browser.d.ts +2 -1
- package/dist/server/shared-utils-browser.d.ts.map +1 -1
- package/dist/server/shared-utils-browser.js +2 -1
- package/dist/server/shared-utils.d.ts +4 -1
- package/dist/server/shared-utils.d.ts.map +1 -1
- package/dist/server/shared-utils.js +2 -1
- package/dist/server/transport-wrapper.d.ts +6 -0
- package/dist/server/transport-wrapper.d.ts.map +1 -0
- package/dist/server/transport-wrapper.js +68 -0
- package/dist/server/utils.js +1 -0
- package/package.json +12 -3
- package/dist/client/assets/__vite-browser-external-DFygW7-s.js +0 -1
- package/dist/client/assets/chunk-VL2OQCWN-iRVOQjqe.js +0 -8
- package/dist/client/assets/display-LIYVTGEU-D2dm8q2H.js +0 -30
- package/dist/client/assets/embeddings-Dcyp0Vlp.js +0 -1
- package/dist/client/assets/index-6zrNEwtM.js +0 -4
- package/dist/client/assets/index-CAnbiFOL.css +0 -1
- package/dist/client/assets/index-CB1s6Wr6.js +0 -146
- package/dist/client/assets/index-CoMldIFv.js +0 -2
- package/dist/client/assets/index-DRz5BQNA.js +0 -1
- package/dist/client/assets/index-DUf1336L.js +0 -1559
- package/dist/client/assets/index-DmIKR5St.js +0 -1
- package/dist/client/assets/index-DpUpZFq2.js +0 -25
- package/dist/client/assets/index-DzegZXPW.js +0 -40
- package/dist/client/assets/langfuse-C4HKZ3NL-vCtAvQQV.js +0 -564
- package/dist/client/assets/path-C9FudP8b.js +0 -1
- package/dist/client/assets/winston-BVJ8PyEn.js +0 -37
package/dist/cli.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
4
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
2
5
|
|
|
3
6
|
// src/server/cli.ts
|
|
4
7
|
import { serve } from "@hono/node-server";
|
|
@@ -324,7 +327,16 @@ function generateWidgetContainerHtml(basePath, toolId) {
|
|
|
324
327
|
`;
|
|
325
328
|
}
|
|
326
329
|
function generateWidgetContentHtml(widgetData) {
|
|
327
|
-
const {
|
|
330
|
+
const {
|
|
331
|
+
serverId,
|
|
332
|
+
uri,
|
|
333
|
+
toolInput,
|
|
334
|
+
toolOutput,
|
|
335
|
+
resourceData,
|
|
336
|
+
toolId,
|
|
337
|
+
devServerBaseUrl,
|
|
338
|
+
theme
|
|
339
|
+
} = widgetData;
|
|
328
340
|
console.log("[Widget Content] Using pre-fetched resource for:", {
|
|
329
341
|
serverId,
|
|
330
342
|
uri
|
|
@@ -355,23 +367,31 @@ function generateWidgetContentHtml(widgetData) {
|
|
|
355
367
|
const safeToolOutput = JSON.stringify(toolOutput ?? null).replace(/</g, "\\u003c").replace(/>/g, "\\u003e");
|
|
356
368
|
const safeToolId = JSON.stringify(toolId);
|
|
357
369
|
const safeWidgetStateKey = JSON.stringify(widgetStateKey);
|
|
370
|
+
const safeTheme = JSON.stringify(theme === "dark" ? "dark" : "light");
|
|
358
371
|
const apiScript = `
|
|
359
372
|
<script>
|
|
360
373
|
(function() {
|
|
361
374
|
'use strict';
|
|
362
375
|
|
|
363
376
|
// Change URL to "/" for React Router compatibility
|
|
364
|
-
if
|
|
377
|
+
// Skip if running in Inspector dev-widget proxy to prevent redirecting iframe to Inspector home
|
|
378
|
+
if (window.location.pathname !== '/' && !window.location.pathname.includes('/dev-widget/')) {
|
|
365
379
|
history.replaceState(null, '', '/');
|
|
366
380
|
}
|
|
367
381
|
|
|
382
|
+
// Inject MCP widget utilities for Image component and file access
|
|
383
|
+
window.__mcpPublicUrl = ${devServerBaseUrl ? `"${devServerBaseUrl}/mcp-use/public"` : '""'};
|
|
384
|
+
window.__getFile = function(filename) {
|
|
385
|
+
return ${devServerBaseUrl ? `"${devServerBaseUrl}/mcp-use/widgets/"` : '""'} + filename;
|
|
386
|
+
};
|
|
387
|
+
|
|
368
388
|
const openaiAPI = {
|
|
369
389
|
toolInput: ${safeToolInput},
|
|
370
390
|
toolOutput: ${safeToolOutput},
|
|
371
391
|
toolResponseMetadata: null,
|
|
372
392
|
displayMode: 'inline',
|
|
373
393
|
maxHeight: 600,
|
|
374
|
-
theme:
|
|
394
|
+
theme: ${safeTheme},
|
|
375
395
|
locale: 'en-US',
|
|
376
396
|
safeArea: { insets: { top: 0, bottom: 0, left: 0, right: 0 } },
|
|
377
397
|
userAgent: {},
|
|
@@ -444,6 +464,20 @@ function generateWidgetContentHtml(widgetData) {
|
|
|
444
464
|
return this.sendFollowupTurn(prompt);
|
|
445
465
|
},
|
|
446
466
|
|
|
467
|
+
async notifyIntrinsicHeight(height) {
|
|
468
|
+
console.log('[OpenAI Widget] notifyIntrinsicHeight called with:', height);
|
|
469
|
+
if (typeof height !== 'number' || height < 0) {
|
|
470
|
+
console.error('[OpenAI Widget] Invalid height value:', height);
|
|
471
|
+
throw new Error('Height must be a non-negative number');
|
|
472
|
+
}
|
|
473
|
+
const message = {
|
|
474
|
+
type: 'openai:notifyIntrinsicHeight',
|
|
475
|
+
height
|
|
476
|
+
};
|
|
477
|
+
console.log('[OpenAI Widget] Sending postMessage to parent:', message);
|
|
478
|
+
window.parent.postMessage(message, '*');
|
|
479
|
+
},
|
|
480
|
+
|
|
447
481
|
openExternal(payload) {
|
|
448
482
|
const href = typeof payload === 'string' ? payload : payload?.href;
|
|
449
483
|
if (href) {
|
|
@@ -488,6 +522,18 @@ function generateWidgetContentHtml(widgetData) {
|
|
|
488
522
|
} catch (err) {}
|
|
489
523
|
}, 0);
|
|
490
524
|
|
|
525
|
+
// Listen for widget state requests from inspector
|
|
526
|
+
window.addEventListener('message', (event) => {
|
|
527
|
+
if (event.data?.type === 'mcp-inspector:getWidgetState') {
|
|
528
|
+
window.parent.postMessage({
|
|
529
|
+
type: 'mcp-inspector:widgetStateResponse',
|
|
530
|
+
toolId: event.data.toolId,
|
|
531
|
+
state: openaiAPI.widgetState
|
|
532
|
+
}, '*');
|
|
533
|
+
return;
|
|
534
|
+
}
|
|
535
|
+
});
|
|
536
|
+
|
|
491
537
|
// Listen for globals changes from parent (for displayMode, theme, etc.)
|
|
492
538
|
window.addEventListener('message', (event) => {
|
|
493
539
|
// Handle new general globalsChanged message
|
|
@@ -614,34 +660,58 @@ function generateWidgetContentHtml(widgetData) {
|
|
|
614
660
|
console.log("[Widget Content] Generated HTML length:", modifiedHtml.length);
|
|
615
661
|
return { html: modifiedHtml };
|
|
616
662
|
}
|
|
617
|
-
function getWidgetSecurityHeaders(widgetCSP) {
|
|
663
|
+
function getWidgetSecurityHeaders(widgetCSP, devServerBaseUrl) {
|
|
618
664
|
const trustedCdns = [
|
|
619
665
|
"https://persistent.oaistatic.com",
|
|
620
666
|
"https://*.oaistatic.com",
|
|
621
667
|
"https://unpkg.com",
|
|
622
668
|
"https://cdn.jsdelivr.net",
|
|
623
669
|
"https://cdnjs.cloudflare.com",
|
|
624
|
-
"https://cdn.skypack.dev"
|
|
670
|
+
"https://cdn.skypack.dev",
|
|
671
|
+
"https://*.openai.com"
|
|
625
672
|
];
|
|
626
|
-
const
|
|
673
|
+
const prodResourceDomains = [...trustedCdns];
|
|
627
674
|
if (widgetCSP?.resource_domains) {
|
|
628
|
-
|
|
675
|
+
prodResourceDomains.push(...widgetCSP.resource_domains);
|
|
676
|
+
}
|
|
677
|
+
const prodResourceDomainsStr = prodResourceDomains.join(" ");
|
|
678
|
+
let devServerOrigin = null;
|
|
679
|
+
const allResourceDomains = [...prodResourceDomains];
|
|
680
|
+
if (devServerBaseUrl) {
|
|
681
|
+
try {
|
|
682
|
+
devServerOrigin = new URL(devServerBaseUrl).origin;
|
|
683
|
+
allResourceDomains.push(devServerOrigin);
|
|
684
|
+
} catch (e) {
|
|
685
|
+
console.warn(`[CSP] Invalid devServerBaseUrl: ${devServerBaseUrl}`);
|
|
686
|
+
}
|
|
629
687
|
}
|
|
630
688
|
const resourceDomainsStr = allResourceDomains.join(" ");
|
|
689
|
+
let imgSrc = "'self' data: https: blob:";
|
|
690
|
+
if (devServerOrigin) {
|
|
691
|
+
imgSrc = `'self' data: https: blob: ${devServerOrigin}`;
|
|
692
|
+
}
|
|
693
|
+
let mediaSrc = "'self' data: https: blob:";
|
|
694
|
+
if (devServerOrigin) {
|
|
695
|
+
mediaSrc = `'self' data: https: blob: ${devServerOrigin}`;
|
|
696
|
+
}
|
|
697
|
+
let fontSrc = `'self' data: ${resourceDomainsStr}`;
|
|
698
|
+
if (devServerOrigin) {
|
|
699
|
+
fontSrc = `'self' data: https: http: ${resourceDomainsStr}`;
|
|
700
|
+
}
|
|
631
701
|
let connectSrc = "'self' https: wss: ws:";
|
|
632
702
|
if (widgetCSP?.connect_domains && widgetCSP.connect_domains.length > 0) {
|
|
633
703
|
connectSrc = `'self' ${widgetCSP.connect_domains.join(" ")} https: wss: ws:`;
|
|
634
704
|
}
|
|
635
|
-
|
|
705
|
+
const headers = {
|
|
636
706
|
"Content-Security-Policy": [
|
|
637
707
|
"default-src 'self'",
|
|
638
708
|
`script-src 'self' 'unsafe-inline' 'unsafe-eval' ${resourceDomainsStr}`,
|
|
639
709
|
"worker-src 'self' blob:",
|
|
640
710
|
"child-src 'self' blob:",
|
|
641
711
|
`style-src 'self' 'unsafe-inline' ${resourceDomainsStr}`,
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
`font-src
|
|
712
|
+
`img-src ${imgSrc}`,
|
|
713
|
+
`media-src ${mediaSrc}`,
|
|
714
|
+
`font-src ${fontSrc}`,
|
|
645
715
|
`connect-src ${connectSrc}`,
|
|
646
716
|
"frame-ancestors 'self'"
|
|
647
717
|
].join("; "),
|
|
@@ -651,6 +721,22 @@ function getWidgetSecurityHeaders(widgetCSP) {
|
|
|
651
721
|
Pragma: "no-cache",
|
|
652
722
|
Expires: "0"
|
|
653
723
|
};
|
|
724
|
+
if (devServerOrigin) {
|
|
725
|
+
const prodConnectSrc = "'self' https: wss: ws:";
|
|
726
|
+
headers["Content-Security-Policy-Report-Only"] = [
|
|
727
|
+
"default-src 'self'",
|
|
728
|
+
`script-src 'self' 'unsafe-inline' 'unsafe-eval' ${prodResourceDomainsStr}`,
|
|
729
|
+
"worker-src 'self' blob:",
|
|
730
|
+
"child-src 'self' blob:",
|
|
731
|
+
`style-src 'self' 'unsafe-inline' ${prodResourceDomainsStr}`,
|
|
732
|
+
"img-src 'self' data: https: blob:",
|
|
733
|
+
"media-src 'self' data: https: blob:",
|
|
734
|
+
`font-src 'self' data: ${prodResourceDomainsStr}`,
|
|
735
|
+
`connect-src ${prodConnectSrc}`,
|
|
736
|
+
"frame-ancestors 'self'"
|
|
737
|
+
].join("; ");
|
|
738
|
+
}
|
|
739
|
+
return headers;
|
|
654
740
|
}
|
|
655
741
|
|
|
656
742
|
// src/server/utils.ts
|
|
@@ -699,6 +785,77 @@ function formatErrorResponse(error, context) {
|
|
|
699
785
|
};
|
|
700
786
|
}
|
|
701
787
|
|
|
788
|
+
// src/server/rpc-log-bus.ts
|
|
789
|
+
var SimpleEventEmitter = class {
|
|
790
|
+
constructor() {
|
|
791
|
+
__publicField(this, "listeners", /* @__PURE__ */ new Map());
|
|
792
|
+
}
|
|
793
|
+
on(event, listener) {
|
|
794
|
+
if (!this.listeners.has(event)) {
|
|
795
|
+
this.listeners.set(event, /* @__PURE__ */ new Set());
|
|
796
|
+
}
|
|
797
|
+
this.listeners.get(event).add(listener);
|
|
798
|
+
}
|
|
799
|
+
off(event, listener) {
|
|
800
|
+
this.listeners.get(event)?.delete(listener);
|
|
801
|
+
}
|
|
802
|
+
emit(event, ...args2) {
|
|
803
|
+
this.listeners.get(event)?.forEach((listener) => {
|
|
804
|
+
try {
|
|
805
|
+
listener(...args2);
|
|
806
|
+
} catch (e) {
|
|
807
|
+
console.error("Error in event listener:", e);
|
|
808
|
+
}
|
|
809
|
+
});
|
|
810
|
+
}
|
|
811
|
+
};
|
|
812
|
+
var RpcLogBus = class {
|
|
813
|
+
constructor() {
|
|
814
|
+
__publicField(this, "emitter", new SimpleEventEmitter());
|
|
815
|
+
__publicField(this, "bufferByServer", /* @__PURE__ */ new Map());
|
|
816
|
+
}
|
|
817
|
+
publish(event) {
|
|
818
|
+
const buffer = this.bufferByServer.get(event.serverId) ?? [];
|
|
819
|
+
buffer.push(event);
|
|
820
|
+
if (buffer.length > 1e3) {
|
|
821
|
+
buffer.shift();
|
|
822
|
+
}
|
|
823
|
+
this.bufferByServer.set(event.serverId, buffer);
|
|
824
|
+
this.emitter.emit("event", event);
|
|
825
|
+
}
|
|
826
|
+
subscribe(serverIds, listener) {
|
|
827
|
+
const filter = new Set(serverIds);
|
|
828
|
+
const handler = (event) => {
|
|
829
|
+
if (filter.size === 0 || filter.has(event.serverId)) listener(event);
|
|
830
|
+
};
|
|
831
|
+
this.emitter.on("event", handler);
|
|
832
|
+
return () => this.emitter.off("event", handler);
|
|
833
|
+
}
|
|
834
|
+
getBuffer(serverIds, limit) {
|
|
835
|
+
const filter = new Set(serverIds);
|
|
836
|
+
const all = [];
|
|
837
|
+
for (const [serverId, buf] of this.bufferByServer.entries()) {
|
|
838
|
+
if (filter.size > 0 && !filter.has(serverId)) continue;
|
|
839
|
+
all.push(...buf);
|
|
840
|
+
}
|
|
841
|
+
all.sort((a, b) => b.timestamp.localeCompare(a.timestamp));
|
|
842
|
+
if (limit === 0) return [];
|
|
843
|
+
if (!Number.isFinite(limit) || limit < 0) return all;
|
|
844
|
+
return all.slice(0, limit);
|
|
845
|
+
}
|
|
846
|
+
clear(serverIds) {
|
|
847
|
+
if (serverIds && serverIds.length > 0) {
|
|
848
|
+
const filter = new Set(serverIds);
|
|
849
|
+
for (const serverId of filter) {
|
|
850
|
+
this.bufferByServer.delete(serverId);
|
|
851
|
+
}
|
|
852
|
+
} else {
|
|
853
|
+
this.bufferByServer.clear();
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
};
|
|
857
|
+
var rpcLogBus = new RpcLogBus();
|
|
858
|
+
|
|
702
859
|
// src/server/shared-routes.ts
|
|
703
860
|
function registerInspectorRoutes(app2, config) {
|
|
704
861
|
app2.get("/inspector/health", (c) => {
|
|
@@ -904,8 +1061,10 @@ function registerInspectorRoutes(app2, config) {
|
|
|
904
1061
|
}
|
|
905
1062
|
);
|
|
906
1063
|
html = html.replace(
|
|
907
|
-
/(src|href)="\/mcp-use\/widgets
|
|
908
|
-
|
|
1064
|
+
/(src|href)="(\/mcp-use\/widgets\/[^"]+)"/g,
|
|
1065
|
+
(_match, attr, path) => {
|
|
1066
|
+
return `${attr}="${widgetData.devServerBaseUrl}${path}"`;
|
|
1067
|
+
}
|
|
909
1068
|
);
|
|
910
1069
|
html = html.replace(/(src|href)="\.\/([^"]+)"/g, (match, attr, path) => {
|
|
911
1070
|
if (path.match(/\.(js|css|png|jpg|jpeg|gif|svg|woff|woff2|ttf|eot)$/i)) {
|
|
@@ -913,14 +1072,45 @@ function registerInspectorRoutes(app2, config) {
|
|
|
913
1072
|
}
|
|
914
1073
|
return match;
|
|
915
1074
|
});
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
const
|
|
921
|
-
|
|
1075
|
+
if (widgetData.devServerBaseUrl) {
|
|
1076
|
+
const devServerUrl = new URL(widgetData.devServerBaseUrl);
|
|
1077
|
+
const wsProtocol = devServerUrl.protocol === "https:" ? "wss" : "ws";
|
|
1078
|
+
const wsHost = devServerUrl.host;
|
|
1079
|
+
const directWsUrl = `${wsProtocol}://${wsHost}/mcp-use/widgets/`;
|
|
1080
|
+
const baseTag = `<base href="${widgetData.devServerBaseUrl}/mcp-use/widgets/${widgetName}/">`;
|
|
1081
|
+
const cspWarningScript = `
|
|
1082
|
+
<script>
|
|
1083
|
+
// Listen for CSP violations (from Report-Only policy)
|
|
1084
|
+
document.addEventListener('securitypolicyviolation', (e) => {
|
|
1085
|
+
// Only warn about report-only violations (not enforced ones)
|
|
1086
|
+
if (e.disposition === 'report') {
|
|
1087
|
+
console.warn(
|
|
1088
|
+
'%c\u26A0\uFE0F CSP Warning: Resource would be blocked in production',
|
|
1089
|
+
'color: orange; font-weight: bold',
|
|
1090
|
+
'\\n Blocked URL:', e.blockedURI,
|
|
1091
|
+
'\\n Directive:', e.violatedDirective,
|
|
1092
|
+
'\\n Policy:', e.originalPolicy,
|
|
1093
|
+
'\\n\\n\u2139\uFE0F To fix: Add this domain to your widget\\'s CSP configuration in appsSdkMetadata[\\'openai/widgetCSP\\']'
|
|
1094
|
+
);
|
|
1095
|
+
}
|
|
922
1096
|
});
|
|
923
|
-
|
|
1097
|
+
</script>`;
|
|
1098
|
+
const viteConfigScript = `
|
|
1099
|
+
<script>
|
|
1100
|
+
// Configure Vite HMR to connect directly to dev server
|
|
1101
|
+
window.__vite_ws_url__ = "${directWsUrl}";
|
|
1102
|
+
</script>`;
|
|
1103
|
+
html = html.replace(/<head>/i, `<head>
|
|
1104
|
+
${baseTag}`);
|
|
1105
|
+
html = html.replace(
|
|
1106
|
+
/<script/,
|
|
1107
|
+
cspWarningScript + viteConfigScript + "\n <script"
|
|
1108
|
+
);
|
|
1109
|
+
}
|
|
1110
|
+
const headers = getWidgetSecurityHeaders(
|
|
1111
|
+
widgetData.widgetCSP,
|
|
1112
|
+
widgetData.devServerBaseUrl
|
|
1113
|
+
);
|
|
924
1114
|
Object.entries(headers).forEach(([key, value]) => {
|
|
925
1115
|
c.header(key, value);
|
|
926
1116
|
});
|
|
@@ -1027,6 +1217,93 @@ function registerInspectorRoutes(app2, config) {
|
|
|
1027
1217
|
return c.json({ success: false });
|
|
1028
1218
|
}
|
|
1029
1219
|
});
|
|
1220
|
+
app2.post("/inspector/api/rpc/log", async (c) => {
|
|
1221
|
+
try {
|
|
1222
|
+
const event = await c.req.json();
|
|
1223
|
+
rpcLogBus.publish(event);
|
|
1224
|
+
return c.json({ success: true });
|
|
1225
|
+
} catch (error) {
|
|
1226
|
+
console.error("[RPC Log] Error receiving RPC event:", error);
|
|
1227
|
+
return c.json({ success: false });
|
|
1228
|
+
}
|
|
1229
|
+
});
|
|
1230
|
+
app2.delete("/inspector/api/rpc/log", async (c) => {
|
|
1231
|
+
try {
|
|
1232
|
+
const url = new URL(c.req.url);
|
|
1233
|
+
const serverIdsParam = url.searchParams.get("serverIds");
|
|
1234
|
+
const serverIds = serverIdsParam ? serverIdsParam.split(",").filter(Boolean) : void 0;
|
|
1235
|
+
rpcLogBus.clear(serverIds);
|
|
1236
|
+
return c.json({ success: true });
|
|
1237
|
+
} catch (error) {
|
|
1238
|
+
console.error("[RPC Log] Error clearing RPC log:", error);
|
|
1239
|
+
return c.json({ success: false });
|
|
1240
|
+
}
|
|
1241
|
+
});
|
|
1242
|
+
app2.get("/inspector/api/rpc/stream", async (c) => {
|
|
1243
|
+
const url = new URL(c.req.url);
|
|
1244
|
+
const replay = parseInt(url.searchParams.get("replay") || "3", 10);
|
|
1245
|
+
const serverIdsParam = url.searchParams.get("serverIds");
|
|
1246
|
+
const serverIds = serverIdsParam ? serverIdsParam.split(",").filter(Boolean) : [];
|
|
1247
|
+
const encoder = new TextEncoder();
|
|
1248
|
+
const stream = new ReadableStream({
|
|
1249
|
+
start(controller) {
|
|
1250
|
+
const send = (data) => {
|
|
1251
|
+
try {
|
|
1252
|
+
controller.enqueue(
|
|
1253
|
+
encoder.encode(`data: ${JSON.stringify(data)}
|
|
1254
|
+
|
|
1255
|
+
`)
|
|
1256
|
+
);
|
|
1257
|
+
} catch {
|
|
1258
|
+
}
|
|
1259
|
+
};
|
|
1260
|
+
try {
|
|
1261
|
+
const recent = rpcLogBus.getBuffer(
|
|
1262
|
+
serverIds,
|
|
1263
|
+
isNaN(replay) ? 3 : replay
|
|
1264
|
+
);
|
|
1265
|
+
for (const evt of recent) {
|
|
1266
|
+
send({ type: "rpc", ...evt });
|
|
1267
|
+
}
|
|
1268
|
+
} catch {
|
|
1269
|
+
}
|
|
1270
|
+
const unsubscribe = rpcLogBus.subscribe(
|
|
1271
|
+
serverIds,
|
|
1272
|
+
(evt) => {
|
|
1273
|
+
send({ type: "rpc", ...evt });
|
|
1274
|
+
}
|
|
1275
|
+
);
|
|
1276
|
+
const keepalive = setInterval(() => {
|
|
1277
|
+
try {
|
|
1278
|
+
controller.enqueue(encoder.encode(`: keepalive ${Date.now()}
|
|
1279
|
+
|
|
1280
|
+
`));
|
|
1281
|
+
} catch {
|
|
1282
|
+
}
|
|
1283
|
+
}, 15e3);
|
|
1284
|
+
c.req.raw.signal?.addEventListener("abort", () => {
|
|
1285
|
+
try {
|
|
1286
|
+
clearInterval(keepalive);
|
|
1287
|
+
unsubscribe();
|
|
1288
|
+
} catch {
|
|
1289
|
+
}
|
|
1290
|
+
try {
|
|
1291
|
+
controller.close();
|
|
1292
|
+
} catch {
|
|
1293
|
+
}
|
|
1294
|
+
});
|
|
1295
|
+
}
|
|
1296
|
+
});
|
|
1297
|
+
return new Response(stream, {
|
|
1298
|
+
headers: {
|
|
1299
|
+
"Content-Type": "text/event-stream",
|
|
1300
|
+
"Cache-Control": "no-cache",
|
|
1301
|
+
Connection: "keep-alive",
|
|
1302
|
+
"Access-Control-Allow-Origin": "*",
|
|
1303
|
+
"Access-Control-Expose-Headers": "*"
|
|
1304
|
+
}
|
|
1305
|
+
});
|
|
1306
|
+
});
|
|
1030
1307
|
}
|
|
1031
1308
|
|
|
1032
1309
|
// src/server/shared-static.ts
|