summaryrefslogtreecommitdiffstats
path: root/dom/webgpu/tests/cts/checkout/src/common/internal/websocket_logger.ts
diff options
context:
space:
mode:
Diffstat (limited to 'dom/webgpu/tests/cts/checkout/src/common/internal/websocket_logger.ts')
-rw-r--r--dom/webgpu/tests/cts/checkout/src/common/internal/websocket_logger.ts52
1 files changed, 52 insertions, 0 deletions
diff --git a/dom/webgpu/tests/cts/checkout/src/common/internal/websocket_logger.ts b/dom/webgpu/tests/cts/checkout/src/common/internal/websocket_logger.ts
new file mode 100644
index 0000000000..30246df843
--- /dev/null
+++ b/dom/webgpu/tests/cts/checkout/src/common/internal/websocket_logger.ts
@@ -0,0 +1,52 @@
+/**
+ * - 'uninitialized' means we haven't tried to connect yet
+ * - Promise means it's pending
+ * - 'failed' means it failed (this is the most common case, where the logger isn't running)
+ * - WebSocket means it succeeded
+ */
+let connection: Promise<WebSocket | 'failed'> | WebSocket | 'failed' | 'uninitialized' =
+ 'uninitialized';
+
+/**
+ * Log a string to a websocket at `localhost:59497`. See `tools/websocket-logger`.
+ *
+ * This does nothing if a connection couldn't be established on the first call.
+ */
+export function logToWebsocket(msg: string) {
+ if (connection === 'failed') {
+ return;
+ }
+
+ if (connection === 'uninitialized') {
+ connection = new Promise(resolve => {
+ if (typeof WebSocket === 'undefined') {
+ resolve('failed');
+ return;
+ }
+
+ const ws = new WebSocket('ws://localhost:59497/optional_cts_websocket_logger');
+ ws.onopen = () => {
+ resolve(ws);
+ };
+ ws.onerror = () => {
+ connection = 'failed';
+ resolve('failed');
+ };
+ ws.onclose = () => {
+ connection = 'failed';
+ resolve('failed');
+ };
+ });
+ void connection.then(resolved => {
+ connection = resolved;
+ });
+ }
+
+ void (async () => {
+ // connection may be a promise or a value here. Either is OK to await.
+ const ws = await connection;
+ if (ws !== 'failed') {
+ ws.send(msg);
+ }
+ })();
+}