mirror of
https://github.com/binaricat/Netcatty.git
synced 2026-11-12 09:24:24 +00:00
* Codex worktree snapshot: startup-cleanup Co-authored-by: Codex * fix(browser): close malformed proxy connections without a reply * feat(browser): embed host browsing in terminal side panels * style(browser): blend compact browser chrome into terminal panels * feat(browser): open terminal links internally with a system browser preference * fix(browser): retain the first terminal link during panel mount replay * fix(browser): release contexts when their split pane closes * style(browser): remove the downloads panel shadow * fix(browser): ignore late downloads after panel closure * fix(browser): mount browser content on terminal auto-open * fix(browser): preserve empty-vault recovery with bookmarks * fix(browser): expose actions for supported terminal types * fix(browser): retain open requests before the panel mounts * fix(browser): align vault actions with supported hosts * fix(browser): share download controls across host contexts * fix(browser): keep vault browser requests on visible sessions * fix(browser): release contexts after workspace detach * fix(browser): enforce WebRTC routing on page contents * fix(browser): skip unsupported sessions in open requests * style(browser): encode glyphs in ASCII-safe source
36 lines
1.3 KiB
TypeScript
36 lines
1.3 KiB
TypeScript
import type { Host } from '../../domain/models';
|
|
import { netcattyBridge } from '../../infrastructure/services/netcattyBridge';
|
|
|
|
export type HostBrowserPanelRequest = { host: Host; sessionId?: string; url?: string };
|
|
type Listener = (request: HostBrowserPanelRequest) => void;
|
|
const listeners = new Set<Listener>();
|
|
let pending: HostBrowserPanelRequest | null = null;
|
|
let unsubscribeNative: (() => void) | undefined;
|
|
|
|
export function requestHostBrowserPanel(request: HostBrowserPanelRequest): void {
|
|
if (!listeners.size) {
|
|
const forward = netcattyBridge.get()?.requestHostBrowserPanel;
|
|
if (forward) {
|
|
void forward(request).catch(() => { pending = request; });
|
|
} else pending = request;
|
|
return;
|
|
}
|
|
for (const listener of listeners) listener(request);
|
|
}
|
|
|
|
export function subscribeHostBrowserPanelRequests(listener: Listener): () => void {
|
|
listeners.add(listener);
|
|
if (!unsubscribeNative) unsubscribeNative = netcattyBridge.get()?.onHostBrowserPanelRequest?.((request) => {
|
|
for (const current of listeners) current(request);
|
|
});
|
|
if (pending) {
|
|
const request = pending;
|
|
pending = null;
|
|
listener(request);
|
|
}
|
|
return () => {
|
|
listeners.delete(listener);
|
|
if (!listeners.size) { unsubscribeNative?.(); unsubscribeNative = undefined; }
|
|
};
|
|
}
|