From 87c64a17a0388d10d6d1f5f553d790427077df00 Mon Sep 17 00:00:00 2001 From: Bruno Gabriel Curbani de Mello Date: Sat, 13 Sep 2025 18:41:21 -0300 Subject: [PATCH] feat: add hubProtocol support to SignalR --- src/signalr/context.ts | 4 +++- src/signalr/provider/index.ts | 1 + src/signalr/provider/providerNativeFactory.ts | 1 + src/signalr/types.ts | 3 ++- src/signalr/utils.ts | 6 ++++++ src/socket/provider/index.ts | 4 ++-- 6 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/signalr/context.ts b/src/signalr/context.ts index 11b56a1..3851089 100644 --- a/src/signalr/context.ts +++ b/src/signalr/context.ts @@ -1,4 +1,4 @@ -import { HubConnectionState } from "@microsoft/signalr"; +import { HubConnectionState, IHubProtocol } from "@microsoft/signalr"; import hermes from "hermes-channel"; import { removeDuplicates, sendWithHermes } from "../utils"; import { createUseSignalREffect } from "./hooks"; @@ -10,12 +10,14 @@ import { providerNativeFactory } from "./provider/providerNativeFactory"; const SIGNAL_R_INVOKE = "SIGNAL_R_INVOKE"; function createSignalRContext(options?: { shareConnectionBetweenTab?: boolean; + hubProtocol?: IHubProtocol; }) { const events: (keyof T["callbacks"])[] = []; const context: Context = { connection: null, useSignalREffect: null as any, // Assigned after context shareConnectionBetweenTab: options?.shareConnectionBetweenTab || false, + hubProtocol: options?.hubProtocol, invoke(methodName, ...args: any[]): Promise | undefined { if (!context.shareConnectionBetweenTab) { return context.connection?.invoke(methodName as string, ...args); diff --git a/src/signalr/provider/index.ts b/src/signalr/provider/index.ts index ac5cb90..f3c4a0e 100644 --- a/src/signalr/provider/index.ts +++ b/src/signalr/provider/index.ts @@ -43,6 +43,7 @@ function providerFactory(Context: Context) { ...rest, }, automaticReconnect, + Context.hubProtocol, ); connection.onreconnecting((error) => onErrorRef?.(error)); diff --git a/src/signalr/provider/providerNativeFactory.ts b/src/signalr/provider/providerNativeFactory.ts index fdce516..b2af47f 100644 --- a/src/signalr/provider/providerNativeFactory.ts +++ b/src/signalr/provider/providerNativeFactory.ts @@ -36,6 +36,7 @@ function providerNativeFactory(Context: Context) { ...rest, }, automaticReconnect, + Context.hubProtocol, ); connection.onreconnecting((error) => onErrorRef?.(error)); connection.onreconnected(() => onReconnect?.(connection)); diff --git a/src/signalr/types.ts b/src/signalr/types.ts index e3d3075..4f757ec 100644 --- a/src/signalr/types.ts +++ b/src/signalr/types.ts @@ -1,4 +1,4 @@ -import { HubConnection } from "@microsoft/signalr"; +import { HubConnection, IHubProtocol } from "@microsoft/signalr"; import { DependencyList } from "react"; import { ProviderProps } from "./provider"; @@ -6,6 +6,7 @@ export interface Context { Provider: (Props: ProviderProps) => JSX.Element; connection: HubConnection | null; shareConnectionBetweenTab: boolean; + hubProtocol?: IHubProtocol; invoke: < E extends keyof T["methods"], C extends Parameters, diff --git a/src/signalr/utils.ts b/src/signalr/utils.ts index 413945d..c15e4e5 100644 --- a/src/signalr/utils.ts +++ b/src/signalr/utils.ts @@ -3,6 +3,7 @@ import { HubConnectionBuilder, HubConnectionState, IHttpConnectionOptions, + IHubProtocol, } from "@microsoft/signalr"; function isConnectionConnecting(connection: HubConnection) { @@ -17,6 +18,7 @@ function createConnection( url: string, transportType: IHttpConnectionOptions, automaticReconnect: boolean | number[] = true, + hubProtocol: IHubProtocol | undefined, ) { let connectionBuilder = new HubConnectionBuilder().withUrl( url, @@ -32,6 +34,10 @@ function createConnection( } } + if (hubProtocol) { + connectionBuilder = connectionBuilder.withHubProtocol(hubProtocol); + } + if (transportType.logger) { connectionBuilder = connectionBuilder.configureLogging( transportType.logger, diff --git a/src/socket/provider/index.ts b/src/socket/provider/index.ts index 95570a2..8823420 100644 --- a/src/socket/provider/index.ts +++ b/src/socket/provider/index.ts @@ -84,7 +84,7 @@ function providerFactory(Context: Context) { return; } - shoutConnected(connection.id); + shoutConnected(connection.id || null); } if ( (!lastConnectionSentState || @@ -92,7 +92,7 @@ function providerFactory(Context: Context) { !isConnectionConnecting(connection) ) { try { - shoutConnected(connection.id); + shoutConnected(connection.id || null); connection.open(); sentInterval = setInterval(syncWithTabs, 4000);