瀏覽代碼

chore(lazer-sdk-js): responded to PR feedback about how the URL for the connection is constructed and fixed a websocket constructor bug

benduran 1 月之前
父節點
當前提交
20e664aab4

+ 2 - 2
lazer/sdk/js/src/socket/resilient-websocket.ts

@@ -6,7 +6,7 @@ import type { Logger } from "ts-log";
 import { dummyLogger } from "ts-log";
 
 import { CustomSocketClosureCodes } from "../protocol.js";
-import { envIsServiceOrWebWorker } from "../util/env-util.js";
+import { envIsBrowserOrWorker } from "../util/env-util.js";
 
 const DEFAULT_HEARTBEAT_TIMEOUT_DURATION_MS = 5000; // 5 seconds
 const DEFAULT_MAX_RETRY_DELAY_MS = 1000; // 1 second'
@@ -128,7 +128,7 @@ export class ResilientWebSocket {
     // https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/WebSocket#protocols
     this.wsClient = new WebSocket(
       this.endpoint,
-      envIsServiceOrWebWorker() ? undefined : this.wsOptions,
+      envIsBrowserOrWorker() ? undefined : this.wsOptions,
     );
 
     this.wsClient.addEventListener("open", () => {

+ 5 - 16
lazer/sdk/js/src/socket/websocket-pool.ts

@@ -11,7 +11,7 @@ import {
   DEFAULT_STREAM_SERVICE_0_URL,
   DEFAULT_STREAM_SERVICE_1_URL,
 } from "../constants.js";
-import { envIsBrowserOrWorker, IsomorphicBuffer } from "../util/index.js";
+import { addAuthTokenToWebSocketUrl, envIsBrowserOrWorker, IsomorphicBuffer } from "../util/index.js";
 
 const DEFAULT_NUM_CONNECTIONS = 4;
 
@@ -70,28 +70,17 @@ export class WebSocketPool {
     const numConnections = config.numConnections ?? DEFAULT_NUM_CONNECTIONS;
 
     for (let i = 0; i < numConnections; i++) {
-      let url = urls[i % urls.length];
+      const baseUrl = urls[i % urls.length];
+      const isBrowser = envIsBrowserOrWorker();
+      const url = isBrowser ? addAuthTokenToWebSocketUrl(baseUrl, token) : baseUrl;
       if (!url) {
         throw new Error(`URLs must not be null or empty`);
       }
       const wsOptions: ResilientWebSocketConfig["wsOptions"] = {
         ...config.rwsConfig?.wsOptions,
+        headers: isBrowser ? undefined : { Authorization: `Bearer ${token}` },
       };
 
-      if (envIsBrowserOrWorker()) {
-        // we are in a browser environment where the websocket protocol
-        // doesn't support sending headers in the initial upgrade request,
-        // so we add the token as a query param, which the server already supports
-        const parsedUrl = new URL(url);
-        parsedUrl.searchParams.set("ACCESS_TOKEN", token);
-        url = parsedUrl.toString();
-      } else {
-        // we are in a server-side javascript runtime context
-        wsOptions.headers = {
-          Authorization: `Bearer ${token}`,
-        };
-      }
-
       const rws = new ResilientWebSocket({
         ...config.rwsConfig,
         endpoint: url,

+ 1 - 0
lazer/sdk/js/src/util/index.ts

@@ -1,2 +1,3 @@
 export * from "./buffer-util.js";
 export * from "./env-util.js";
+export * from "./url-util.js";

+ 16 - 0
lazer/sdk/js/src/util/url-util.ts

@@ -0,0 +1,16 @@
+const ACCESS_TOKEN_QUERY_PARAM_KEY = 'ACCESS_TOKEN';
+
+/**
+ * Given a URL to a hosted lazer stream service and a possible auth token,
+ * appends the auth token as a query parameter and returns the URL with the token
+ * contained within.
+ * If the URL provided is nullish, it is returned as-is (in the same nullish format).
+ * If the token is nullish, the baseUrl given is returned, instead.
+ */
+export function addAuthTokenToWebSocketUrl(baseUrl: string | null | undefined, authToken: string | null | undefined) {
+  if (!baseUrl || !authToken) return baseUrl;
+  const parsedUrl = new URL(baseUrl);
+  parsedUrl.searchParams.set(ACCESS_TOKEN_QUERY_PARAM_KEY, authToken);
+
+  return parsedUrl.toString();
+}