使 WebRtc 应用程序的用户能够通过 javascript 下载 webrtc 日志

Posted

技术标签:

【中文标题】使 WebRtc 应用程序的用户能够通过 javascript 下载 webrtc 日志【英文标题】:Enable users of a WebRtc app to download webrtc logs via javascript 【发布时间】:2017-12-09 16:37:17 【问题描述】:

我看过以下内容:

chrome://webrtc-internals 

但是,我正在寻找一种方法,让用户从 Web 应用程序中单击一个按钮以下载或 - 最好 - POST WebRtc 将日志记录到应用程序中的端点。我的想法是,我可以让非技术用户通过单击 UI 按钮与我共享技术日志。

如何做到这一点?

注意:这不应该依赖于 Chrome; Chromium 也将被使用,因为应用程序将被封装在 Electron 中。

【问题讨论】:

也许这个答案应该有所帮助:Is there an API for the chrome://webrtc-internals/ variables in javascript? @DheerajV.S.谢谢 - 我使用它构建了一个小统计数据提取器,贴在下面。 【参考方案1】:

您需要编写一个等效的 javascript 来捕获所有 RTCPeerConnection API 调用。 rtcstats.js 会这样做,但会将所有数据发送到服务器。如果您将该行为替换为将其存储在内存中,您应该会很好。

【讨论】:

您对我发布的解决方案有何看法?这是否会提供调试大多数 WebRTC 问题所需的见解? 在大多数情况下,我发现 API 跟踪比 getStats 结果更有帮助——请参阅testrtc.com/webrtc-api-trace。此外,您正在使用应避免使用的旧版 chrome stats api。 您是否有一个示例来演示如何在客户端转储这些日志(或者甚至根本如何使用它 - 我没有看到太多关于配置的文档)?我认为这对未来的读者最有帮助。 我推送了一个提交 here——本质上是使用 npm run dist 构建捆绑版本,然后在包含的测试页面上创建一个 peerconnection 并检查 window.rtcstats.connections 我讨厌痛苦——但我还是不清楚。我认为有一个独立的例子来说明如何require 这个并在不依赖于构建节点(或某些外部服务器)的情况下使用它会帮助更多的人;就像在答案中有任何相关代码一样。如果您没有时间,请完全理解它-如果是这种情况,我可以尝试弄清楚并张贴。我认为这里最常见的用例是“允许我在客户端记录这些(或访问这些)日志,以便我可以决定如何处理它们。”一个明确的设置示例肯定会帮助其他正在寻找它的人。【参考方案2】:

这就是我最终使用的(用下划线或其他代替敲除):

            connectionReport.signalingState = connection.signalingState;
            connectionReport.stats = [];
            connection.getStats(function (stats) 
                const reportCollection = stats.result();
                ko.utils.arrayForEach(reportCollection, function (innerReport) 
                    const statReport = ;
                    statReport.id = innerReport.id;
                    statReport.type = innerReport.type;
                    const keys = innerReport.names();
                    ko.utils.arrayForEach(keys, function (reportKey) 
                        statReport[reportKey] = innerReport.stat(reportKey);
                    )
                    connectionReport.stats.push(statReport);
                );
                connectionStats.push(connectionReport);
            );

更新:

这种getStats 机制似乎即将被弃用。

【讨论】:

【参考方案3】:

阅读chrome://webrtc-internals的js源码,发现网页使用chrome.send()的方法发送chrome.send('enableEventLogRecordings');之类的消息,执行日志命令。 根据here:

chrome.send() 是一个私有函数,只对内部 chrome 可用 页面。

所以该函数是沙盒化的,因此无法访问它

【讨论】:

以上是关于使 WebRtc 应用程序的用户能够通过 javascript 下载 webrtc 日志的主要内容,如果未能解决你的问题,请参考以下文章

WebRTC Java 服务器? [关闭]

使用 WebRTC 使 node.js 应用程序成为 PEER

PHP棘轮和WebRTC

WebRTC java服务器问题

使 Java 客户端等待直到收到来自服务器的响应的程序

如何使用 webrtc 让我的用户保持匿名?