

























@@ -15,6 +15,7 @@ type NodeBridgeSession = {
1515id: string;
1616url?: string;
1717mode?: string;
18+outputCommand: { command: string; args: string[] };
1819input?: ChildProcess;
1920output?: ChildProcess;
2021chunks: Buffer[];
@@ -23,9 +24,11 @@ type NodeBridgeSession = {
2324createdAt: string;
2425lastInputAt?: string;
2526lastOutputAt?: string;
27+lastClearAt?: string;
2628lastInputBytes: number;
2729lastOutputBytes: number;
2830closedAt?: string;
31+clearCount: number;
2932};
30333134const sessions = new Map<string, NodeBridgeSession>();
@@ -110,6 +113,25 @@ function stopSession(session: NodeBridgeSession) {
110113wake(session);
111114}
112115116+function attachOutputProcessHandlers(session: NodeBridgeSession, outputProcess: ChildProcess) {
117+outputProcess.on("exit", () => {
118+if (session.output === outputProcess) {
119+stopSession(session);
120+}
121+});
122+outputProcess.on("error", () => {
123+if (session.output === outputProcess) {
124+stopSession(session);
125+}
126+});
127+}
128+129+function startOutputProcess(command: { command: string; args: string[] }) {
130+return spawn(command.command, command.args, {
131+stdio: ["pipe", "ignore", "pipe"],
132+});
133+}
134+113135function startCommandPair(params: {
114136inputCommand: string[];
115137outputCommand: string[];
@@ -122,16 +144,16 @@ function startCommandPair(params: {
122144id: `meet_node_${randomUUID()}`,
123145url: params.url,
124146mode: params.mode,
147+outputCommand: output,
125148chunks: [],
126149waiters: [],
127150closed: false,
128151createdAt: new Date().toISOString(),
129152lastInputBytes: 0,
130153lastOutputBytes: 0,
154+clearCount: 0,
131155};
132-const outputProcess = spawn(output.command, output.args, {
133-stdio: ["pipe", "ignore", "pipe"],
134-});
156+const outputProcess = startOutputProcess(output);
135157const inputProcess = spawn(input.command, input.args, {
136158stdio: ["ignore", "pipe", "pipe"],
137159});
@@ -148,9 +170,8 @@ function startCommandPair(params: {
148170wake(session);
149171});
150172inputProcess.on("exit", () => stopSession(session));
151-outputProcess.on("exit", () => stopSession(session));
173+attachOutputProcessHandlers(session, outputProcess);
152174inputProcess.on("error", () => stopSession(session));
153-outputProcess.on("error", () => stopSession(session));
154175sessions.set(session.id, session);
155176return session;
156177}
@@ -224,6 +245,25 @@ function pushAudio(params: Record<string, unknown>) {
224245return { bridgeId, ok: true };
225246}
226247248+function clearAudio(params: Record<string, unknown>) {
249+const bridgeId = readString(params.bridgeId);
250+if (!bridgeId) {
251+throw new Error("bridgeId required");
252+}
253+const session = sessions.get(bridgeId);
254+if (!session || session.closed) {
255+throw new Error(`bridge is not open: ${bridgeId}`);
256+}
257+const previousOutput = session.output;
258+const outputProcess = startOutputProcess(session.outputCommand);
259+session.output = outputProcess;
260+attachOutputProcessHandlers(session, outputProcess);
261+session.clearCount += 1;
262+session.lastClearAt = new Date().toISOString();
263+terminateChild(previousOutput);
264+return { bridgeId, ok: true, clearCount: session.clearCount };
265+}
266+227267function startChrome(params: Record<string, unknown>) {
228268const url = readString(params.url);
229269if (!url) {
@@ -317,8 +357,11 @@ function bridgeStatus(params: Record<string, unknown>) {
317357createdAt: session.createdAt,
318358lastInputAt: session.lastInputAt,
319359lastOutputAt: session.lastOutputAt,
360+lastClearAt: session.lastClearAt,
320361lastInputBytes: session.lastInputBytes,
321362lastOutputBytes: session.lastOutputBytes,
363+clearCount: session.clearCount,
364+queuedInputChunks: session.chunks.length,
322365}
323366 : bridgeId
324367 ? { bridgeId, closed: true }
@@ -438,6 +481,9 @@ export async function handleGoogleMeetNodeHostCommand(paramsJSON?: string | null
438481case "pushAudio":
439482result = pushAudio(params);
440483break;
484+case "clearAudio":
485+result = clearAudio(params);
486+break;
441487case "stop":
442488result = stopChrome(params);
443489break;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。