@azure/ai-voicelive 1.0.0-alpha.20251117.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +358 -0
  3. package/dist/browser/auth/credentialHandler.d.ts +43 -0
  4. package/dist/browser/auth/credentialHandler.js +147 -0
  5. package/dist/browser/auth/credentialHandler.js.map +1 -0
  6. package/dist/browser/errors/connectionErrors.d.ts +68 -0
  7. package/dist/browser/errors/connectionErrors.js +136 -0
  8. package/dist/browser/errors/connectionErrors.js.map +1 -0
  9. package/dist/browser/errors/index.d.ts +2 -0
  10. package/dist/browser/errors/index.js +4 -0
  11. package/dist/browser/errors/index.js.map +1 -0
  12. package/dist/browser/handlers/sessionHandlers.d.ts +250 -0
  13. package/dist/browser/handlers/sessionHandlers.js +4 -0
  14. package/dist/browser/handlers/sessionHandlers.js.map +1 -0
  15. package/dist/browser/handlers/subscriptionManager.d.ts +54 -0
  16. package/dist/browser/handlers/subscriptionManager.js +250 -0
  17. package/dist/browser/handlers/subscriptionManager.js.map +1 -0
  18. package/dist/browser/index.d.ts +7 -0
  19. package/dist/browser/index.js +12 -0
  20. package/dist/browser/index.js.map +1 -0
  21. package/dist/browser/logger.d.ts +2 -0
  22. package/dist/browser/logger.js +5 -0
  23. package/dist/browser/logger.js.map +1 -0
  24. package/dist/browser/models/index.d.ts +2 -0
  25. package/dist/browser/models/index.js +4 -0
  26. package/dist/browser/models/index.js.map +1 -0
  27. package/dist/browser/models/models.d.ts +2154 -0
  28. package/dist/browser/models/models.js +2251 -0
  29. package/dist/browser/models/models.js.map +1 -0
  30. package/dist/browser/package.json +3 -0
  31. package/dist/browser/protocol/messageParser.d.ts +42 -0
  32. package/dist/browser/protocol/messageParser.js +150 -0
  33. package/dist/browser/protocol/messageParser.js.map +1 -0
  34. package/dist/browser/voiceLiveClient.d.ts +65 -0
  35. package/dist/browser/voiceLiveClient.js +81 -0
  36. package/dist/browser/voiceLiveClient.js.map +1 -0
  37. package/dist/browser/voiceLiveSession.d.ts +138 -0
  38. package/dist/browser/voiceLiveSession.js +429 -0
  39. package/dist/browser/voiceLiveSession.js.map +1 -0
  40. package/dist/browser/websocket/connectionManager.d.ts +88 -0
  41. package/dist/browser/websocket/connectionManager.js +183 -0
  42. package/dist/browser/websocket/connectionManager.js.map +1 -0
  43. package/dist/browser/websocket/websocketBrowser.d.ts +26 -0
  44. package/dist/browser/websocket/websocketBrowser.js +175 -0
  45. package/dist/browser/websocket/websocketBrowser.js.map +1 -0
  46. package/dist/browser/websocket/websocketFactory.d.ts +23 -0
  47. package/dist/browser/websocket/websocketFactory.js +80 -0
  48. package/dist/browser/websocket/websocketFactory.js.map +1 -0
  49. package/dist/browser/websocket/websocketLike.d.ts +78 -0
  50. package/dist/browser/websocket/websocketLike.js +13 -0
  51. package/dist/browser/websocket/websocketLike.js.map +1 -0
  52. package/dist/browser/websocket/websocketNode.d.ts +26 -0
  53. package/dist/browser/websocket/websocketNode.js +180 -0
  54. package/dist/browser/websocket/websocketNode.js.map +1 -0
  55. package/dist/commonjs/auth/credentialHandler.d.ts +43 -0
  56. package/dist/commonjs/auth/credentialHandler.js +151 -0
  57. package/dist/commonjs/auth/credentialHandler.js.map +1 -0
  58. package/dist/commonjs/errors/connectionErrors.d.ts +68 -0
  59. package/dist/commonjs/errors/connectionErrors.js +146 -0
  60. package/dist/commonjs/errors/connectionErrors.js.map +1 -0
  61. package/dist/commonjs/errors/index.d.ts +2 -0
  62. package/dist/commonjs/errors/index.js +7 -0
  63. package/dist/commonjs/errors/index.js.map +1 -0
  64. package/dist/commonjs/handlers/sessionHandlers.d.ts +250 -0
  65. package/dist/commonjs/handlers/sessionHandlers.js +5 -0
  66. package/dist/commonjs/handlers/sessionHandlers.js.map +1 -0
  67. package/dist/commonjs/handlers/subscriptionManager.d.ts +54 -0
  68. package/dist/commonjs/handlers/subscriptionManager.js +255 -0
  69. package/dist/commonjs/handlers/subscriptionManager.js.map +1 -0
  70. package/dist/commonjs/index.d.ts +7 -0
  71. package/dist/commonjs/index.js +45 -0
  72. package/dist/commonjs/index.js.map +1 -0
  73. package/dist/commonjs/logger.d.ts +2 -0
  74. package/dist/commonjs/logger.js +8 -0
  75. package/dist/commonjs/logger.js.map +1 -0
  76. package/dist/commonjs/models/index.d.ts +2 -0
  77. package/dist/commonjs/models/index.js +27 -0
  78. package/dist/commonjs/models/index.js.map +1 -0
  79. package/dist/commonjs/models/models.d.ts +2154 -0
  80. package/dist/commonjs/models/models.js +2463 -0
  81. package/dist/commonjs/models/models.js.map +1 -0
  82. package/dist/commonjs/package.json +3 -0
  83. package/dist/commonjs/protocol/messageParser.d.ts +42 -0
  84. package/dist/commonjs/protocol/messageParser.js +154 -0
  85. package/dist/commonjs/protocol/messageParser.js.map +1 -0
  86. package/dist/commonjs/tsdoc-metadata.json +11 -0
  87. package/dist/commonjs/voiceLiveClient.d.ts +65 -0
  88. package/dist/commonjs/voiceLiveClient.js +85 -0
  89. package/dist/commonjs/voiceLiveClient.js.map +1 -0
  90. package/dist/commonjs/voiceLiveSession.d.ts +138 -0
  91. package/dist/commonjs/voiceLiveSession.js +433 -0
  92. package/dist/commonjs/voiceLiveSession.js.map +1 -0
  93. package/dist/commonjs/websocket/connectionManager.d.ts +88 -0
  94. package/dist/commonjs/websocket/connectionManager.js +187 -0
  95. package/dist/commonjs/websocket/connectionManager.js.map +1 -0
  96. package/dist/commonjs/websocket/websocketBrowser.d.ts +26 -0
  97. package/dist/commonjs/websocket/websocketBrowser.js +179 -0
  98. package/dist/commonjs/websocket/websocketBrowser.js.map +1 -0
  99. package/dist/commonjs/websocket/websocketFactory.d.ts +23 -0
  100. package/dist/commonjs/websocket/websocketFactory.js +86 -0
  101. package/dist/commonjs/websocket/websocketFactory.js.map +1 -0
  102. package/dist/commonjs/websocket/websocketLike.d.ts +78 -0
  103. package/dist/commonjs/websocket/websocketLike.js +16 -0
  104. package/dist/commonjs/websocket/websocketLike.js.map +1 -0
  105. package/dist/commonjs/websocket/websocketNode.d.ts +26 -0
  106. package/dist/commonjs/websocket/websocketNode.js +185 -0
  107. package/dist/commonjs/websocket/websocketNode.js.map +1 -0
  108. package/dist/esm/auth/credentialHandler.d.ts +43 -0
  109. package/dist/esm/auth/credentialHandler.js +147 -0
  110. package/dist/esm/auth/credentialHandler.js.map +1 -0
  111. package/dist/esm/errors/connectionErrors.d.ts +68 -0
  112. package/dist/esm/errors/connectionErrors.js +136 -0
  113. package/dist/esm/errors/connectionErrors.js.map +1 -0
  114. package/dist/esm/errors/index.d.ts +2 -0
  115. package/dist/esm/errors/index.js +4 -0
  116. package/dist/esm/errors/index.js.map +1 -0
  117. package/dist/esm/handlers/sessionHandlers.d.ts +250 -0
  118. package/dist/esm/handlers/sessionHandlers.js +4 -0
  119. package/dist/esm/handlers/sessionHandlers.js.map +1 -0
  120. package/dist/esm/handlers/subscriptionManager.d.ts +54 -0
  121. package/dist/esm/handlers/subscriptionManager.js +250 -0
  122. package/dist/esm/handlers/subscriptionManager.js.map +1 -0
  123. package/dist/esm/index.d.ts +7 -0
  124. package/dist/esm/index.js +12 -0
  125. package/dist/esm/index.js.map +1 -0
  126. package/dist/esm/logger.d.ts +2 -0
  127. package/dist/esm/logger.js +5 -0
  128. package/dist/esm/logger.js.map +1 -0
  129. package/dist/esm/models/index.d.ts +2 -0
  130. package/dist/esm/models/index.js +4 -0
  131. package/dist/esm/models/index.js.map +1 -0
  132. package/dist/esm/models/models.d.ts +2154 -0
  133. package/dist/esm/models/models.js +2251 -0
  134. package/dist/esm/models/models.js.map +1 -0
  135. package/dist/esm/package.json +3 -0
  136. package/dist/esm/protocol/messageParser.d.ts +42 -0
  137. package/dist/esm/protocol/messageParser.js +150 -0
  138. package/dist/esm/protocol/messageParser.js.map +1 -0
  139. package/dist/esm/voiceLiveClient.d.ts +65 -0
  140. package/dist/esm/voiceLiveClient.js +81 -0
  141. package/dist/esm/voiceLiveClient.js.map +1 -0
  142. package/dist/esm/voiceLiveSession.d.ts +138 -0
  143. package/dist/esm/voiceLiveSession.js +429 -0
  144. package/dist/esm/voiceLiveSession.js.map +1 -0
  145. package/dist/esm/websocket/connectionManager.d.ts +88 -0
  146. package/dist/esm/websocket/connectionManager.js +183 -0
  147. package/dist/esm/websocket/connectionManager.js.map +1 -0
  148. package/dist/esm/websocket/websocketBrowser.d.ts +26 -0
  149. package/dist/esm/websocket/websocketBrowser.js +175 -0
  150. package/dist/esm/websocket/websocketBrowser.js.map +1 -0
  151. package/dist/esm/websocket/websocketFactory.d.ts +23 -0
  152. package/dist/esm/websocket/websocketFactory.js +80 -0
  153. package/dist/esm/websocket/websocketFactory.js.map +1 -0
  154. package/dist/esm/websocket/websocketLike.d.ts +78 -0
  155. package/dist/esm/websocket/websocketLike.js +13 -0
  156. package/dist/esm/websocket/websocketLike.js.map +1 -0
  157. package/dist/esm/websocket/websocketNode.d.ts +26 -0
  158. package/dist/esm/websocket/websocketNode.js +180 -0
  159. package/dist/esm/websocket/websocketNode.js.map +1 -0
  160. package/dist/react-native/auth/credentialHandler.d.ts +43 -0
  161. package/dist/react-native/auth/credentialHandler.js +147 -0
  162. package/dist/react-native/auth/credentialHandler.js.map +1 -0
  163. package/dist/react-native/errors/connectionErrors.d.ts +68 -0
  164. package/dist/react-native/errors/connectionErrors.js +136 -0
  165. package/dist/react-native/errors/connectionErrors.js.map +1 -0
  166. package/dist/react-native/errors/index.d.ts +2 -0
  167. package/dist/react-native/errors/index.js +4 -0
  168. package/dist/react-native/errors/index.js.map +1 -0
  169. package/dist/react-native/handlers/sessionHandlers.d.ts +250 -0
  170. package/dist/react-native/handlers/sessionHandlers.js +4 -0
  171. package/dist/react-native/handlers/sessionHandlers.js.map +1 -0
  172. package/dist/react-native/handlers/subscriptionManager.d.ts +54 -0
  173. package/dist/react-native/handlers/subscriptionManager.js +250 -0
  174. package/dist/react-native/handlers/subscriptionManager.js.map +1 -0
  175. package/dist/react-native/index.d.ts +7 -0
  176. package/dist/react-native/index.js +12 -0
  177. package/dist/react-native/index.js.map +1 -0
  178. package/dist/react-native/logger.d.ts +2 -0
  179. package/dist/react-native/logger.js +5 -0
  180. package/dist/react-native/logger.js.map +1 -0
  181. package/dist/react-native/models/index.d.ts +2 -0
  182. package/dist/react-native/models/index.js +4 -0
  183. package/dist/react-native/models/index.js.map +1 -0
  184. package/dist/react-native/models/models.d.ts +2154 -0
  185. package/dist/react-native/models/models.js +2251 -0
  186. package/dist/react-native/models/models.js.map +1 -0
  187. package/dist/react-native/package.json +3 -0
  188. package/dist/react-native/protocol/messageParser.d.ts +42 -0
  189. package/dist/react-native/protocol/messageParser.js +150 -0
  190. package/dist/react-native/protocol/messageParser.js.map +1 -0
  191. package/dist/react-native/voiceLiveClient.d.ts +65 -0
  192. package/dist/react-native/voiceLiveClient.js +81 -0
  193. package/dist/react-native/voiceLiveClient.js.map +1 -0
  194. package/dist/react-native/voiceLiveSession.d.ts +138 -0
  195. package/dist/react-native/voiceLiveSession.js +429 -0
  196. package/dist/react-native/voiceLiveSession.js.map +1 -0
  197. package/dist/react-native/websocket/connectionManager.d.ts +88 -0
  198. package/dist/react-native/websocket/connectionManager.js +183 -0
  199. package/dist/react-native/websocket/connectionManager.js.map +1 -0
  200. package/dist/react-native/websocket/websocketBrowser.d.ts +26 -0
  201. package/dist/react-native/websocket/websocketBrowser.js +175 -0
  202. package/dist/react-native/websocket/websocketBrowser.js.map +1 -0
  203. package/dist/react-native/websocket/websocketFactory.d.ts +23 -0
  204. package/dist/react-native/websocket/websocketFactory.js +80 -0
  205. package/dist/react-native/websocket/websocketFactory.js.map +1 -0
  206. package/dist/react-native/websocket/websocketLike.d.ts +78 -0
  207. package/dist/react-native/websocket/websocketLike.js +13 -0
  208. package/dist/react-native/websocket/websocketLike.js.map +1 -0
  209. package/dist/react-native/websocket/websocketNode.d.ts +26 -0
  210. package/dist/react-native/websocket/websocketNode.js +180 -0
  211. package/dist/react-native/websocket/websocketNode.js.map +1 -0
  212. package/package.json +150 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocketLike.js","sourceRoot":"","sources":["../../../src/websocket/websocketLike.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAIlC;;GAEG;AACH,MAAM,CAAN,IAAY,cAKX;AALD,WAAY,cAAc;IACxB,+DAAc,CAAA;IACd,mDAAQ,CAAA;IACR,yDAAW,CAAA;IACX,uDAAU,CAAA;AACZ,CAAC,EALW,cAAc,KAAd,cAAc,QAKzB","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\n\n/**\n * WebSocket ready state enumeration matching standard WebSocket values\n */\nexport enum WebSocketState {\n Connecting = 0,\n Open = 1,\n Closing = 2,\n Closed = 3,\n}\n\n/**\n * Options for WebSocket creation and connection\n */\nexport interface WebSocketFactoryOptions {\n /** Connection timeout in milliseconds */\n connectionTimeoutInMs?: number;\n /** Maximum message size in bytes */\n maxMessageSize?: number;\n /** Enable compression if supported */\n compression?: boolean;\n /** Custom headers for connection (Node.js only) */\n headers?: Record<string, string>;\n}\n\n/**\n * Platform-agnostic WebSocket interface for Voice Live connections\n */\nexport interface VoiceLiveWebSocketLike {\n /**\n * Establishes WebSocket connection to the specified URL\n */\n connect(url: string, protocols?: string[], abortSignal?: AbortSignalLike): Promise<void>;\n\n /**\n * Closes the WebSocket connection\n */\n disconnect(code?: number, reason?: string): Promise<void>;\n\n /**\n * Sends data through the WebSocket connection\n */\n send(data: string | ArrayBuffer, abortSignal?: AbortSignalLike): Promise<void>;\n\n /**\n * Registers handler for connection open event\n */\n onOpen(handler: () => void): void;\n\n /**\n * Registers handler for connection close event\n */\n onClose(handler: (code: number, reason: string) => void): void;\n\n /**\n * Registers handler for message reception\n */\n onMessage(handler: (data: string | ArrayBuffer) => void): void;\n\n /**\n * Registers handler for connection errors\n */\n onError(handler: (error: Error) => void): void;\n\n /**\n * Gets current connection state\n */\n readonly isConnected: boolean;\n\n /**\n * Gets current connection state enum\n */\n readonly readyState: WebSocketState;\n\n /**\n * Gets the connected URL if applicable\n */\n readonly url?: string;\n}\n\n/**\n * Factory interface for creating WebSocket instances\n */\nexport interface VoiceLiveWebSocketFactoryLike {\n /**\n * Creates a new WebSocket instance for the target platform\n */\n create(options?: WebSocketFactoryOptions): VoiceLiveWebSocketLike;\n}\n"]}
@@ -0,0 +1,26 @@
1
+ import type { AbortSignalLike } from "@azure/abort-controller";
2
+ import { WebSocketState, type VoiceLiveWebSocketLike, type WebSocketFactoryOptions } from "./websocketLike.js";
3
+ /**
4
+ * Node.js WebSocket implementation using 'ws' library
5
+ */
6
+ export declare class VoiceLiveWebSocketNode implements VoiceLiveWebSocketLike {
7
+ private _ws?;
8
+ private _url?;
9
+ private _options;
10
+ private _onOpen?;
11
+ private _onClose?;
12
+ private _onMessage?;
13
+ private _onError?;
14
+ constructor(options?: WebSocketFactoryOptions);
15
+ connect(url: string, protocols?: string[], abortSignal?: AbortSignalLike): Promise<void>;
16
+ disconnect(code?: number, reason?: string): Promise<void>;
17
+ send(data: string | ArrayBuffer, abortSignal?: AbortSignalLike): Promise<void>;
18
+ onOpen(handler: () => void): void;
19
+ onClose(handler: (code: number, reason: string) => void): void;
20
+ onMessage(handler: (data: string | ArrayBuffer) => void): void;
21
+ onError(handler: (error: Error) => void): void;
22
+ get isConnected(): boolean;
23
+ get readyState(): WebSocketState;
24
+ get url(): string | undefined;
25
+ }
26
+ //# sourceMappingURL=websocketNode.d.ts.map
@@ -0,0 +1,180 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT License.
3
+ import WebSocket from "ws";
4
+ import { WebSocketState, } from "./websocketLike.js";
5
+ import { VoiceLiveConnectionError, VoiceLiveErrorCodes } from "../errors/connectionErrors.js";
6
+ /**
7
+ * Node.js WebSocket implementation using 'ws' library
8
+ */
9
+ export class VoiceLiveWebSocketNode {
10
+ _ws;
11
+ _url;
12
+ _options;
13
+ _onOpen;
14
+ _onClose;
15
+ _onMessage;
16
+ _onError;
17
+ constructor(options = {}) {
18
+ this._options = {
19
+ connectionTimeoutInMs: 30000,
20
+ maxMessageSize: 1024 * 1024, // 1MB
21
+ compression: true,
22
+ ...options,
23
+ };
24
+ }
25
+ async connect(url, protocols, abortSignal) {
26
+ if (this._ws && this._ws.readyState !== WebSocket.CLOSED) {
27
+ throw new VoiceLiveConnectionError("WebSocket is already connected or connecting", VoiceLiveErrorCodes.AlreadyConnected);
28
+ }
29
+ return new Promise((resolve, reject) => {
30
+ const timeoutId = setTimeout(() => {
31
+ reject(new VoiceLiveConnectionError(`WebSocket connection timeout after ${this._options.connectionTimeoutInMs}ms`, VoiceLiveErrorCodes.ConnectionTimeout));
32
+ }, this._options.connectionTimeoutInMs);
33
+ // Handle abort signal
34
+ const abortHandler = () => {
35
+ clearTimeout(timeoutId);
36
+ if (this._ws) {
37
+ this._ws.terminate();
38
+ }
39
+ reject(new VoiceLiveConnectionError("WebSocket connection aborted", VoiceLiveErrorCodes.OperationCancelled));
40
+ };
41
+ if (abortSignal) {
42
+ if (abortSignal.aborted) {
43
+ abortHandler();
44
+ return;
45
+ }
46
+ abortSignal.addEventListener("abort", abortHandler);
47
+ }
48
+ try {
49
+ this._ws = new WebSocket(url, protocols, {
50
+ headers: this._options.headers,
51
+ maxPayload: this._options.maxMessageSize,
52
+ perMessageDeflate: this._options.compression,
53
+ });
54
+ this._url = url;
55
+ this._ws.on("open", () => {
56
+ clearTimeout(timeoutId);
57
+ if (abortSignal) {
58
+ abortSignal.removeEventListener("abort", abortHandler);
59
+ }
60
+ this._onOpen?.();
61
+ resolve();
62
+ });
63
+ this._ws.on("close", (code, reason) => {
64
+ clearTimeout(timeoutId);
65
+ if (abortSignal) {
66
+ abortSignal.removeEventListener("abort", abortHandler);
67
+ }
68
+ this._onClose?.(code, reason.toString());
69
+ });
70
+ this._ws.on("message", (data) => {
71
+ if (typeof data === "string") {
72
+ this._onMessage?.(data);
73
+ }
74
+ else if (data instanceof Buffer) {
75
+ // Convert Buffer to ArrayBuffer
76
+ const arrayBuffer = new ArrayBuffer(data.length);
77
+ const view = new Uint8Array(arrayBuffer);
78
+ view.set(data);
79
+ this._onMessage?.(arrayBuffer);
80
+ }
81
+ else if (data instanceof ArrayBuffer) {
82
+ this._onMessage?.(data);
83
+ }
84
+ else {
85
+ // Handle other data types by converting to ArrayBuffer
86
+ const buffer = Buffer.from(data);
87
+ const arrayBuffer = new ArrayBuffer(buffer.length);
88
+ const view = new Uint8Array(arrayBuffer);
89
+ view.set(buffer);
90
+ this._onMessage?.(arrayBuffer);
91
+ }
92
+ });
93
+ this._ws.on("error", (error) => {
94
+ clearTimeout(timeoutId);
95
+ if (abortSignal) {
96
+ abortSignal.removeEventListener("abort", abortHandler);
97
+ }
98
+ this._onError?.(error);
99
+ reject(new VoiceLiveConnectionError(`WebSocket error: ${error.message}`, VoiceLiveErrorCodes.WebSocketError, "websocket_connection", true, // Potentially recoverable
100
+ error));
101
+ });
102
+ }
103
+ catch (error) {
104
+ clearTimeout(timeoutId);
105
+ if (abortSignal) {
106
+ abortSignal.removeEventListener("abort", abortHandler);
107
+ }
108
+ reject(new VoiceLiveConnectionError(`Failed to create WebSocket: ${error instanceof Error ? error.message : "Unknown error"}`, VoiceLiveErrorCodes.ConnectionFailed, "websocket_creation", false, error instanceof Error ? error : new Error(String(error))));
109
+ }
110
+ });
111
+ }
112
+ async disconnect(code = 1000, reason) {
113
+ if (!this._ws || this._ws.readyState === WebSocket.CLOSED) {
114
+ return;
115
+ }
116
+ return new Promise((resolve) => {
117
+ const closeHandler = () => {
118
+ resolve();
119
+ };
120
+ if (this._ws.readyState === WebSocket.CLOSING) {
121
+ this._ws.once("close", closeHandler);
122
+ }
123
+ else {
124
+ this._ws.once("close", closeHandler);
125
+ this._ws.close(code, reason);
126
+ }
127
+ });
128
+ }
129
+ async send(data, abortSignal) {
130
+ if (!this._ws || this._ws.readyState !== WebSocket.OPEN) {
131
+ throw new VoiceLiveConnectionError("WebSocket is not connected", VoiceLiveErrorCodes.NotConnected);
132
+ }
133
+ if (abortSignal?.aborted) {
134
+ throw new VoiceLiveConnectionError("Send operation aborted", VoiceLiveErrorCodes.OperationCancelled);
135
+ }
136
+ return new Promise((resolve, reject) => {
137
+ const abortHandler = () => {
138
+ reject(new VoiceLiveConnectionError("Send operation aborted", VoiceLiveErrorCodes.OperationCancelled));
139
+ };
140
+ if (abortSignal) {
141
+ abortSignal.addEventListener("abort", abortHandler);
142
+ }
143
+ this._ws.send(data, (error) => {
144
+ if (abortSignal) {
145
+ abortSignal.removeEventListener("abort", abortHandler);
146
+ }
147
+ if (error) {
148
+ reject(new VoiceLiveConnectionError(`Failed to send WebSocket message: ${error.message}`, VoiceLiveErrorCodes.WebSocketError, "message_send", true, error));
149
+ }
150
+ else {
151
+ resolve();
152
+ }
153
+ });
154
+ });
155
+ }
156
+ onOpen(handler) {
157
+ this._onOpen = handler;
158
+ }
159
+ onClose(handler) {
160
+ this._onClose = handler;
161
+ }
162
+ onMessage(handler) {
163
+ this._onMessage = handler;
164
+ }
165
+ onError(handler) {
166
+ this._onError = handler;
167
+ }
168
+ get isConnected() {
169
+ return this._ws?.readyState === WebSocket.OPEN;
170
+ }
171
+ get readyState() {
172
+ if (!this._ws)
173
+ return WebSocketState.Closed;
174
+ return this._ws.readyState;
175
+ }
176
+ get url() {
177
+ return this._url;
178
+ }
179
+ }
180
+ //# sourceMappingURL=websocketNode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocketNode.js","sourceRoot":"","sources":["../../../src/websocket/websocketNode.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport WebSocket from \"ws\";\nimport {\n WebSocketState,\n type VoiceLiveWebSocketLike,\n type WebSocketFactoryOptions,\n} from \"./websocketLike.js\";\nimport { VoiceLiveConnectionError, VoiceLiveErrorCodes } from \"../errors/connectionErrors.js\";\n\n/**\n * Node.js WebSocket implementation using 'ws' library\n */\nexport class VoiceLiveWebSocketNode implements VoiceLiveWebSocketLike {\n private _ws?: WebSocket;\n private _url?: string;\n private _options: WebSocketFactoryOptions;\n\n private _onOpen?: () => void;\n private _onClose?: (code: number, reason: string) => void;\n private _onMessage?: (data: string | ArrayBuffer) => void;\n private _onError?: (error: Error) => void;\n\n constructor(options: WebSocketFactoryOptions = {}) {\n this._options = {\n connectionTimeoutInMs: 30000,\n maxMessageSize: 1024 * 1024, // 1MB\n compression: true,\n ...options,\n };\n }\n\n async connect(url: string, protocols?: string[], abortSignal?: AbortSignalLike): Promise<void> {\n if (this._ws && this._ws.readyState !== WebSocket.CLOSED) {\n throw new VoiceLiveConnectionError(\n \"WebSocket is already connected or connecting\",\n VoiceLiveErrorCodes.AlreadyConnected,\n );\n }\n\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n reject(\n new VoiceLiveConnectionError(\n `WebSocket connection timeout after ${this._options.connectionTimeoutInMs}ms`,\n VoiceLiveErrorCodes.ConnectionTimeout,\n ),\n );\n }, this._options.connectionTimeoutInMs);\n\n // Handle abort signal\n const abortHandler = (): void => {\n clearTimeout(timeoutId);\n if (this._ws) {\n this._ws.terminate();\n }\n reject(\n new VoiceLiveConnectionError(\n \"WebSocket connection aborted\",\n VoiceLiveErrorCodes.OperationCancelled,\n ),\n );\n };\n\n if (abortSignal) {\n if (abortSignal.aborted) {\n abortHandler();\n return;\n }\n abortSignal.addEventListener(\"abort\", abortHandler);\n }\n\n try {\n this._ws = new WebSocket(url, protocols, {\n headers: this._options.headers,\n maxPayload: this._options.maxMessageSize,\n perMessageDeflate: this._options.compression,\n });\n\n this._url = url;\n\n this._ws.on(\"open\", () => {\n clearTimeout(timeoutId);\n if (abortSignal) {\n abortSignal.removeEventListener(\"abort\", abortHandler);\n }\n this._onOpen?.();\n resolve();\n });\n\n this._ws.on(\"close\", (code: number, reason: Buffer) => {\n clearTimeout(timeoutId);\n if (abortSignal) {\n abortSignal.removeEventListener(\"abort\", abortHandler);\n }\n this._onClose?.(code, reason.toString());\n });\n\n this._ws.on(\"message\", (data: WebSocket.Data) => {\n if (typeof data === \"string\") {\n this._onMessage?.(data);\n } else if (data instanceof Buffer) {\n // Convert Buffer to ArrayBuffer\n const arrayBuffer = new ArrayBuffer(data.length);\n const view = new Uint8Array(arrayBuffer);\n view.set(data);\n this._onMessage?.(arrayBuffer);\n } else if (data instanceof ArrayBuffer) {\n this._onMessage?.(data);\n } else {\n // Handle other data types by converting to ArrayBuffer\n const buffer = Buffer.from(data as any);\n const arrayBuffer = new ArrayBuffer(buffer.length);\n const view = new Uint8Array(arrayBuffer);\n view.set(buffer);\n this._onMessage?.(arrayBuffer);\n }\n });\n\n this._ws.on(\"error\", (error: Error) => {\n clearTimeout(timeoutId);\n if (abortSignal) {\n abortSignal.removeEventListener(\"abort\", abortHandler);\n }\n this._onError?.(error);\n reject(\n new VoiceLiveConnectionError(\n `WebSocket error: ${error.message}`,\n VoiceLiveErrorCodes.WebSocketError,\n \"websocket_connection\",\n true, // Potentially recoverable\n error,\n ),\n );\n });\n } catch (error) {\n clearTimeout(timeoutId);\n if (abortSignal) {\n abortSignal.removeEventListener(\"abort\", abortHandler);\n }\n reject(\n new VoiceLiveConnectionError(\n `Failed to create WebSocket: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n VoiceLiveErrorCodes.ConnectionFailed,\n \"websocket_creation\",\n false,\n error instanceof Error ? error : new Error(String(error)),\n ),\n );\n }\n });\n }\n\n async disconnect(code: number = 1000, reason?: string): Promise<void> {\n if (!this._ws || this._ws.readyState === WebSocket.CLOSED) {\n return;\n }\n\n return new Promise((resolve) => {\n const closeHandler = (): void => {\n resolve();\n };\n\n if (this._ws!.readyState === WebSocket.CLOSING) {\n this._ws!.once(\"close\", closeHandler);\n } else {\n this._ws!.once(\"close\", closeHandler);\n this._ws!.close(code, reason);\n }\n });\n }\n\n async send(data: string | ArrayBuffer, abortSignal?: AbortSignalLike): Promise<void> {\n if (!this._ws || this._ws.readyState !== WebSocket.OPEN) {\n throw new VoiceLiveConnectionError(\n \"WebSocket is not connected\",\n VoiceLiveErrorCodes.NotConnected,\n );\n }\n\n if (abortSignal?.aborted) {\n throw new VoiceLiveConnectionError(\n \"Send operation aborted\",\n VoiceLiveErrorCodes.OperationCancelled,\n );\n }\n\n return new Promise((resolve, reject) => {\n const abortHandler = (): void => {\n reject(\n new VoiceLiveConnectionError(\n \"Send operation aborted\",\n VoiceLiveErrorCodes.OperationCancelled,\n ),\n );\n };\n\n if (abortSignal) {\n abortSignal.addEventListener(\"abort\", abortHandler);\n }\n\n this._ws!.send(data, (error?: Error) => {\n if (abortSignal) {\n abortSignal.removeEventListener(\"abort\", abortHandler);\n }\n\n if (error) {\n reject(\n new VoiceLiveConnectionError(\n `Failed to send WebSocket message: ${error.message}`,\n VoiceLiveErrorCodes.WebSocketError,\n \"message_send\",\n true,\n error,\n ),\n );\n } else {\n resolve();\n }\n });\n });\n }\n\n onOpen(handler: () => void): void {\n this._onOpen = handler;\n }\n\n onClose(handler: (code: number, reason: string) => void): void {\n this._onClose = handler;\n }\n\n onMessage(handler: (data: string | ArrayBuffer) => void): void {\n this._onMessage = handler;\n }\n\n onError(handler: (error: Error) => void): void {\n this._onError = handler;\n }\n\n get isConnected(): boolean {\n return this._ws?.readyState === WebSocket.OPEN;\n }\n\n get readyState(): WebSocketState {\n if (!this._ws) return WebSocketState.Closed;\n return this._ws.readyState as WebSocketState;\n }\n\n get url(): string | undefined {\n return this._url;\n }\n}\n"]}
@@ -0,0 +1,43 @@
1
+ import type { TokenCredential, KeyCredential } from "@azure/core-auth";
2
+ /**
3
+ * Union type for supported credential types
4
+ */
5
+ export type VoiceLiveCredential = TokenCredential | KeyCredential;
6
+ /**
7
+ * Handles both Azure TokenCredential and KeyCredential authentication for Voice Live service
8
+ */
9
+ export declare class CredentialHandler {
10
+ private _accessToken?;
11
+ private readonly _scope;
12
+ private readonly _tokenRefreshBuffer;
13
+ private readonly _credential;
14
+ private readonly _isApiKey;
15
+ constructor(credential: VoiceLiveCredential, scope?: string);
16
+ /**
17
+ * Gets a valid access token or API key, refreshing if necessary
18
+ */
19
+ getAccessToken(): Promise<string>;
20
+ /**
21
+ * Builds the WebSocket URL with authentication
22
+ */
23
+ getWebSocketUrl(baseEndpoint: string, apiVersion: string, model?: string): Promise<string>;
24
+ /**
25
+ * Gets authentication headers for the WebSocket connection
26
+ */
27
+ getAuthHeaders(): Promise<Record<string, string>>;
28
+ /**
29
+ * Returns the type of credential being used
30
+ */
31
+ get credentialType(): "key" | "token";
32
+ /**
33
+ * Returns whether this is using an API key credential
34
+ */
35
+ get isApiKey(): boolean;
36
+ /**
37
+ * For API key credentials, allows updating the key
38
+ */
39
+ updateApiKey(newKey: string): void;
40
+ private _isTokenValid;
41
+ private _generateRequestId;
42
+ }
43
+ //# sourceMappingURL=credentialHandler.d.ts.map
@@ -0,0 +1,147 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT License.
3
+ import { VoiceLiveAuthenticationError, VoiceLiveErrorCodes } from "../errors/index.js";
4
+ import { logger } from "../logger.js";
5
+ /**
6
+ * Type guard to check if credential is a KeyCredential
7
+ */
8
+ function isKeyCredential(credential) {
9
+ return "key" in credential && typeof credential.key === "string";
10
+ }
11
+ /**
12
+ * Handles both Azure TokenCredential and KeyCredential authentication for Voice Live service
13
+ */
14
+ export class CredentialHandler {
15
+ _accessToken;
16
+ _scope;
17
+ _tokenRefreshBuffer = 5 * 60 * 1000; // 5 minutes
18
+ _credential;
19
+ _isApiKey;
20
+ constructor(credential, scope) {
21
+ this._credential = credential;
22
+ this._isApiKey = isKeyCredential(credential);
23
+ // Voice Live specific scope - may need adjustment based on actual service
24
+ this._scope = scope || "https://cognitiveservices.azure.com/.default";
25
+ logger.info("CredentialHandler initialized", {
26
+ credentialType: this._isApiKey ? "KeyCredential" : "TokenCredential",
27
+ scope: this._scope,
28
+ });
29
+ }
30
+ /**
31
+ * Gets a valid access token or API key, refreshing if necessary
32
+ */
33
+ async getAccessToken() {
34
+ // For API Key credentials, return the key directly
35
+ if (this._isApiKey) {
36
+ const keyCredential = this._credential;
37
+ logger.info("Using API key for authentication");
38
+ return keyCredential.key;
39
+ }
40
+ // For Token credentials, handle token lifecycle
41
+ const tokenCredential = this._credential;
42
+ // Check if current token is still valid
43
+ if (this._accessToken && this._isTokenValid(this._accessToken)) {
44
+ return this._accessToken.token;
45
+ }
46
+ try {
47
+ logger.info("Acquiring new access token", { scope: this._scope });
48
+ // Get new token from credential
49
+ const tokenResponse = await tokenCredential.getToken(this._scope);
50
+ if (!tokenResponse) {
51
+ throw new VoiceLiveAuthenticationError("Failed to acquire access token - credential returned null", VoiceLiveErrorCodes.AuthenticationFailed);
52
+ }
53
+ this._accessToken = tokenResponse;
54
+ logger.info("Successfully acquired access token", {
55
+ expiresAt: new Date(this._accessToken.expiresOnTimestamp),
56
+ });
57
+ return this._accessToken.token;
58
+ }
59
+ catch (error) {
60
+ logger.error("Failed to obtain access token", { error, scope: this._scope });
61
+ if (error instanceof VoiceLiveAuthenticationError) {
62
+ throw error;
63
+ }
64
+ throw new VoiceLiveAuthenticationError(`Failed to obtain access token: ${error instanceof Error ? error.message : "Unknown error"}`, VoiceLiveErrorCodes.AuthenticationFailed, error instanceof Error ? error : new Error(String(error)));
65
+ }
66
+ }
67
+ /**
68
+ * Builds the WebSocket URL with authentication
69
+ */
70
+ async getWebSocketUrl(baseEndpoint, apiVersion, model) {
71
+ const authValue = await this.getAccessToken();
72
+ const url = new URL(baseEndpoint);
73
+ url.protocol = url.protocol === "https:" ? "wss:" : "ws:";
74
+ url.pathname = "/voice-live/realtime"; // Voice Live WebSocket endpoint path
75
+ url.searchParams.set("api-version", apiVersion);
76
+ // Add model parameter if provided
77
+ if (model) {
78
+ url.searchParams.set("model", model);
79
+ }
80
+ // For API keys, add as query parameter
81
+ if (this._isApiKey) {
82
+ url.searchParams.set("api-key", authValue);
83
+ }
84
+ else {
85
+ // For tokens, we'll use headers instead of query params
86
+ // The token will be added in getAuthHeaders()
87
+ }
88
+ return url.toString();
89
+ }
90
+ /**
91
+ * Gets authentication headers for the WebSocket connection
92
+ */
93
+ async getAuthHeaders() {
94
+ const authValue = await this.getAccessToken();
95
+ const headers = {
96
+ "X-MS-Client-Request-ID": this._generateRequestId(),
97
+ "User-Agent": "Azure-Voice-Live-SDK-JS/1.0.0",
98
+ };
99
+ // Add appropriate authentication header based on credential type
100
+ if (this._isApiKey) {
101
+ // For API keys, use the X-API-Key header or similar
102
+ headers["api-key"] = authValue;
103
+ }
104
+ else {
105
+ // For tokens, use standard Bearer authorization
106
+ headers["Authorization"] = `Bearer ${authValue}`;
107
+ }
108
+ return headers;
109
+ }
110
+ /**
111
+ * Returns the type of credential being used
112
+ */
113
+ get credentialType() {
114
+ return this._isApiKey ? "key" : "token";
115
+ }
116
+ /**
117
+ * Returns whether this is using an API key credential
118
+ */
119
+ get isApiKey() {
120
+ return this._isApiKey;
121
+ }
122
+ /**
123
+ * For API key credentials, allows updating the key
124
+ */
125
+ updateApiKey(newKey) {
126
+ if (!this._isApiKey) {
127
+ throw new VoiceLiveAuthenticationError("Cannot update API key on TokenCredential", VoiceLiveErrorCodes.InvalidCredentials);
128
+ }
129
+ const keyCredential = this._credential;
130
+ if ("update" in keyCredential && typeof keyCredential.update === "function") {
131
+ keyCredential.update(newKey);
132
+ logger.info("API key updated");
133
+ }
134
+ else {
135
+ throw new VoiceLiveAuthenticationError("KeyCredential does not support key updates", VoiceLiveErrorCodes.InvalidCredentials);
136
+ }
137
+ }
138
+ _isTokenValid(token) {
139
+ const expiresAt = token.expiresOnTimestamp;
140
+ const now = Date.now();
141
+ return expiresAt > now + this._tokenRefreshBuffer;
142
+ }
143
+ _generateRequestId() {
144
+ return `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;
145
+ }
146
+ }
147
+ //# sourceMappingURL=credentialHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentialHandler.js","sourceRoot":"","sources":["../../../src/auth/credentialHandler.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { TokenCredential, KeyCredential, AccessToken } from \"@azure/core-auth\";\nimport { VoiceLiveAuthenticationError, VoiceLiveErrorCodes } from \"../errors/index.js\";\nimport { logger } from \"../logger.js\";\n\n/**\n * Union type for supported credential types\n */\nexport type VoiceLiveCredential = TokenCredential | KeyCredential;\n\n/**\n * Type guard to check if credential is a KeyCredential\n */\nfunction isKeyCredential(credential: VoiceLiveCredential): credential is KeyCredential {\n return \"key\" in credential && typeof (credential as KeyCredential).key === \"string\";\n}\n\n/**\n * Handles both Azure TokenCredential and KeyCredential authentication for Voice Live service\n */\nexport class CredentialHandler {\n private _accessToken?: AccessToken;\n private readonly _scope: string;\n private readonly _tokenRefreshBuffer = 5 * 60 * 1000; // 5 minutes\n private readonly _credential: VoiceLiveCredential;\n private readonly _isApiKey: boolean;\n\n constructor(credential: VoiceLiveCredential, scope?: string) {\n this._credential = credential;\n this._isApiKey = isKeyCredential(credential);\n\n // Voice Live specific scope - may need adjustment based on actual service\n this._scope = scope || \"https://cognitiveservices.azure.com/.default\";\n\n logger.info(\"CredentialHandler initialized\", {\n credentialType: this._isApiKey ? \"KeyCredential\" : \"TokenCredential\",\n scope: this._scope,\n });\n }\n\n /**\n * Gets a valid access token or API key, refreshing if necessary\n */\n async getAccessToken(): Promise<string> {\n // For API Key credentials, return the key directly\n if (this._isApiKey) {\n const keyCredential = this._credential as KeyCredential;\n logger.info(\"Using API key for authentication\");\n return keyCredential.key;\n }\n\n // For Token credentials, handle token lifecycle\n const tokenCredential = this._credential as TokenCredential;\n\n // Check if current token is still valid\n if (this._accessToken && this._isTokenValid(this._accessToken)) {\n return this._accessToken.token;\n }\n\n try {\n logger.info(\"Acquiring new access token\", { scope: this._scope });\n\n // Get new token from credential\n const tokenResponse = await tokenCredential.getToken(this._scope);\n\n if (!tokenResponse) {\n throw new VoiceLiveAuthenticationError(\n \"Failed to acquire access token - credential returned null\",\n VoiceLiveErrorCodes.AuthenticationFailed,\n );\n }\n\n this._accessToken = tokenResponse;\n\n logger.info(\"Successfully acquired access token\", {\n expiresAt: new Date(this._accessToken.expiresOnTimestamp),\n });\n\n return this._accessToken.token;\n } catch (error) {\n logger.error(\"Failed to obtain access token\", { error, scope: this._scope });\n\n if (error instanceof VoiceLiveAuthenticationError) {\n throw error;\n }\n\n throw new VoiceLiveAuthenticationError(\n `Failed to obtain access token: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n VoiceLiveErrorCodes.AuthenticationFailed,\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n }\n\n /**\n * Builds the WebSocket URL with authentication\n */\n async getWebSocketUrl(baseEndpoint: string, apiVersion: string, model?: string): Promise<string> {\n const authValue = await this.getAccessToken();\n\n const url = new URL(baseEndpoint);\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n url.pathname = \"/voice-live/realtime\"; // Voice Live WebSocket endpoint path\n url.searchParams.set(\"api-version\", apiVersion);\n\n // Add model parameter if provided\n if (model) {\n url.searchParams.set(\"model\", model);\n }\n\n // For API keys, add as query parameter\n if (this._isApiKey) {\n url.searchParams.set(\"api-key\", authValue);\n } else {\n // For tokens, we'll use headers instead of query params\n // The token will be added in getAuthHeaders()\n }\n\n return url.toString();\n }\n\n /**\n * Gets authentication headers for the WebSocket connection\n */\n async getAuthHeaders(): Promise<Record<string, string>> {\n const authValue = await this.getAccessToken();\n\n const headers: Record<string, string> = {\n \"X-MS-Client-Request-ID\": this._generateRequestId(),\n \"User-Agent\": \"Azure-Voice-Live-SDK-JS/1.0.0\",\n };\n\n // Add appropriate authentication header based on credential type\n if (this._isApiKey) {\n // For API keys, use the X-API-Key header or similar\n headers[\"api-key\"] = authValue;\n } else {\n // For tokens, use standard Bearer authorization\n headers[\"Authorization\"] = `Bearer ${authValue}`;\n }\n\n return headers;\n }\n\n /**\n * Returns the type of credential being used\n */\n get credentialType(): \"key\" | \"token\" {\n return this._isApiKey ? \"key\" : \"token\";\n }\n\n /**\n * Returns whether this is using an API key credential\n */\n get isApiKey(): boolean {\n return this._isApiKey;\n }\n\n /**\n * For API key credentials, allows updating the key\n */\n updateApiKey(newKey: string): void {\n if (!this._isApiKey) {\n throw new VoiceLiveAuthenticationError(\n \"Cannot update API key on TokenCredential\",\n VoiceLiveErrorCodes.InvalidCredentials,\n );\n }\n\n const keyCredential = this._credential as KeyCredential;\n if (\"update\" in keyCredential && typeof keyCredential.update === \"function\") {\n keyCredential.update(newKey);\n logger.info(\"API key updated\");\n } else {\n throw new VoiceLiveAuthenticationError(\n \"KeyCredential does not support key updates\",\n VoiceLiveErrorCodes.InvalidCredentials,\n );\n }\n }\n\n private _isTokenValid(token: AccessToken): boolean {\n const expiresAt = token.expiresOnTimestamp;\n const now = Date.now();\n return expiresAt > now + this._tokenRefreshBuffer;\n }\n\n private _generateRequestId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n }\n}\n"]}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Error codes for Voice Live WebSocket operations
3
+ */
4
+ export declare enum VoiceLiveErrorCodes {
5
+ ConnectionFailed = "CONNECTION_FAILED",
6
+ ConnectionTimeout = "CONNECTION_TIMEOUT",
7
+ ConnectionLost = "CONNECTION_LOST",
8
+ AlreadyConnected = "ALREADY_CONNECTED",
9
+ NotConnected = "NOT_CONNECTED",
10
+ WebSocketError = "WEBSOCKET_ERROR",
11
+ AuthenticationFailed = "AUTHENTICATION_FAILED",
12
+ InvalidCredentials = "INVALID_CREDENTIALS",
13
+ Unauthorized = "UNAUTHORIZED",
14
+ Forbidden = "FORBIDDEN",
15
+ InvalidMessage = "INVALID_MESSAGE",
16
+ MessageTooLarge = "MESSAGE_TOO_LARGE",
17
+ ProtocolError = "PROTOCOL_ERROR",
18
+ BufferOverflow = "BUFFER_OVERFLOW",
19
+ OperationCancelled = "OPERATION_CANCELLED",
20
+ InvalidState = "INVALID_STATE"
21
+ }
22
+ /**
23
+ * Base error class for Voice Live WebSocket operations
24
+ */
25
+ export declare class VoiceLiveConnectionError extends Error {
26
+ /** Error code identifying the specific error type */
27
+ readonly code: string;
28
+ /** Context information about where the error occurred */
29
+ readonly context: string;
30
+ /** Indicates whether this error is potentially recoverable */
31
+ readonly recoverable: boolean;
32
+ /** The original error that caused this error, if any */
33
+ readonly cause?: Error;
34
+ /** Timestamp when the error occurred */
35
+ readonly timestamp: Date;
36
+ constructor(message: string, code: string, context?: string, recoverable?: boolean, cause?: Error);
37
+ }
38
+ /**
39
+ * Authentication error class for Voice Live operations
40
+ */
41
+ export declare class VoiceLiveAuthenticationError extends VoiceLiveConnectionError {
42
+ constructor(message: string, code: string, cause?: Error);
43
+ }
44
+ /**
45
+ * Protocol error class for Voice Live message operations
46
+ */
47
+ export declare class VoiceLiveProtocolError extends VoiceLiveConnectionError {
48
+ constructor(message: string, code: string, cause?: Error);
49
+ }
50
+ /**
51
+ * General Voice Live error class
52
+ */
53
+ export declare class VoiceLiveError extends VoiceLiveConnectionError {
54
+ constructor(message: string, code: string, context?: string, recoverable?: boolean, cause?: Error);
55
+ }
56
+ /**
57
+ * Classifies a WebSocket close event and returns appropriate error
58
+ */
59
+ export declare function classifyWebSocketClose(code: number, reason: string): VoiceLiveConnectionError;
60
+ /**
61
+ * Classifies connection errors
62
+ */
63
+ export declare function classifyConnectionError(error: VoiceLiveConnectionError | Error | unknown): VoiceLiveConnectionError;
64
+ /**
65
+ * Classifies protocol errors
66
+ */
67
+ export declare function classifyProtocolError(error: Error, messageType: string): VoiceLiveProtocolError;
68
+ //# sourceMappingURL=connectionErrors.d.ts.map