Graphql-ws:为每个订阅打开单独的WebSocket连接

v09wglhw  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(308)

我是一个websockets新手。我使用urqlgraphql-ws(从subscriptions-transport-ws移植而来)来获取graphql订阅。代码如下:

export const useUrqlClient = () => {
  const headers = useHeaders();
  const client = useMemo(() => createUrqlClient(headers), [headers]);
  return client;
};

const createUrqlClient = (headers: any = defaultHeaders) => {
  return createClient({
    url: GRAPHQL_ENDPOINT,
    fetchOptions: {
      headers
    },
    exchanges: [
      ...defaultExchanges,
      subscriptionExchange({
        forwardSubscription: (operation) => {
          return {
            subscribe: (sink) => ({
              unsubscribe: wsClient(headers).subscribe(operation, sink)
            })
          }
        }
      })
    ]
  });
};

const wsClient = (headers: any) => createWSClient({
  url: WS_GRAPHQL_ENDPOINT,
  connectionParams: () => ({
    headers
  })
});

const useHeaders = () => {
  const [authHeader, setAuthHeader] = useState<object>({});
  const { selectedToken } = useAuth();

  useEffect(() => {
    if (selectedToken) {
      setAuthHeader(selectedToken ? { authorization: `Bearer ${selectedToken}` } : {});
    }
  }, [selectedToken]);

  return {
    ...defaultHeaders,
    ...authHeader
  };
};

一切正常,但是否可以为每个订阅打开单独的WebSocket连接?x1c 0d1x
它们在离开页面时关闭,并创建另一个,但这是预期的吗?
注意:使用subscriptions-transport-ws的方法也有相同的行为。

3zwjbxry

3zwjbxry1#

您正在lazy模式下运行客户端,该模式按需建立WebSocket连接,这是默认设置。
请考虑以下两个选项之一:
1.在lazy = false模式下使用客户端,该模式将在创建时与服务器建立连接并使其保持活动状态
1.使用客户端的lazyCloseTimeout选项,在有新订阅的情况下,该选项将延迟关闭连接。

相关问题