Skip to content

Commit 81044d3

Browse files
feat(typescript): expose protocols field on WebSocket ConnectArgs (#13588)
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
1 parent 70ec403 commit 81044d3

9 files changed

Lines changed: 70 additions & 10 deletions

File tree

generators/typescript/sdk/client-class-generator/src/websocket/GeneratedDefaultWebsocketImplementation.ts

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export class GeneratedDefaultWebsocketImplementation implements GeneratedWebsock
4242
private static readonly HEADERS_PROPERTY_NAME = "headers";
4343
private static readonly HEADERS_VARIABLE_NAME = "_headers";
4444

45+
private static readonly PROTOCOLS_PROPERTY_NAME = "protocols";
4546
private static readonly RECONNECT_ATTEMPTS_PROPERTY_NAME = "reconnectAttempts";
4647
private static readonly CONNECTION_TIMEOUT_PROPERTY_NAME = "connectionTimeoutInSeconds";
4748
private static readonly ABORT_SIGNAL_PROPERTY_NAME = "abortSignal";
@@ -188,6 +189,19 @@ export class GeneratedDefaultWebsocketImplementation implements GeneratedWebsock
188189
hasQuestionToken: context.type.isOptional(header.valueType)
189190
};
190191
}),
192+
{
193+
name: GeneratedDefaultWebsocketImplementation.PROTOCOLS_PROPERTY_NAME,
194+
type: getTextOfTsNode(
195+
ts.factory.createUnionTypeNode([
196+
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
197+
ts.factory.createArrayTypeNode(
198+
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword)
199+
)
200+
])
201+
),
202+
hasQuestionToken: true,
203+
docs: ["WebSocket subprotocols to use for the connection."]
204+
},
191205
{
192206
name: GeneratedDefaultWebsocketImplementation.ADDITIONAL_QUERY_PARAMETERS_PROPERTY_NAME,
193207
type: getTextOfTsNode(
@@ -302,6 +316,15 @@ export class GeneratedDefaultWebsocketImplementation implements GeneratedWebsock
302316
);
303317
}
304318

319+
// Add protocols binding
320+
bindingElements.push(
321+
ts.factory.createBindingElement(
322+
undefined,
323+
undefined,
324+
ts.factory.createIdentifier(GeneratedDefaultWebsocketImplementation.PROTOCOLS_PROPERTY_NAME)
325+
)
326+
);
327+
305328
// Add additional query parameters binding
306329
bindingElements.push(
307330
ts.factory.createBindingElement(
@@ -534,7 +557,11 @@ export class GeneratedDefaultWebsocketImplementation implements GeneratedWebsock
534557

535558
return context.coreUtilities.websocket.ReconnectingWebSocket._connect({
536559
url: context.coreUtilities.urlUtils.join._invoke([baseUrl, url]),
537-
protocols: ts.factory.createArrayLiteralExpression([]),
560+
protocols: ts.factory.createBinaryExpression(
561+
ts.factory.createIdentifier(GeneratedDefaultWebsocketImplementation.PROTOCOLS_PROPERTY_NAME),
562+
ts.factory.createToken(ts.SyntaxKind.QuestionQuestionToken),
563+
ts.factory.createArrayLiteralExpression([])
564+
),
538565
options: ts.factory.createObjectLiteralExpression([
539566
ts.factory.createPropertyAssignment(
540567
"debug",

generators/typescript/sdk/versions.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,16 @@
11
# yaml-language-server: $schema=../../../fern-versions-yml.schema.json
2+
- version: 3.57.0
3+
changelogEntry:
4+
- summary: |
5+
Expose an optional `protocols` field on `RealtimeClient.ConnectArgs` for WebSocket
6+
subprotocol negotiation. The `ReconnectingWebSocket` constructor already accepted a
7+
`protocols` parameter but it was hardcoded to an empty array. Browser callers can now
8+
authenticate via subprotocols (e.g. `xai-client-secret.<token>`) where custom headers
9+
are forbidden by the browser security model.
10+
type: feat
11+
createdAt: "2026-03-16"
12+
irVersion: 65
13+
214
- version: 3.56.4
315
changelogEntry:
416
- summary: |

seed/ts-sdk/websocket-bearer-auth/websockets/src/api/resources/realtime/client/Client.ts

Lines changed: 4 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

seed/ts-sdk/websocket-bearer-auth/websockets/src/api/resources/realtimeNoAuth/client/Client.ts

Lines changed: 4 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

seed/ts-sdk/websocket-inferred-auth/websockets/src/api/resources/realtime/client/Client.ts

Lines changed: 4 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

seed/ts-sdk/websocket/no-serde/src/api/resources/empty/resources/emptyRealtime/client/Client.ts

Lines changed: 5 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

seed/ts-sdk/websocket/no-serde/src/api/resources/realtime/client/Client.ts

Lines changed: 4 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

seed/ts-sdk/websocket/serde/src/api/resources/empty/resources/emptyRealtime/client/Client.ts

Lines changed: 5 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

seed/ts-sdk/websocket/serde/src/api/resources/realtime/client/Client.ts

Lines changed: 4 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)