@azure/ai-voicelive 1.0.0-beta.1 → 1.0.0-beta.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 (110) hide show
  1. package/dist/browser/index.d.ts +1 -1
  2. package/dist/browser/index.js +1 -1
  3. package/dist/browser/index.js.map +1 -1
  4. package/dist/browser/models/index.d.ts +1 -1
  5. package/dist/browser/models/index.js +1 -1
  6. package/dist/browser/models/index.js.map +1 -1
  7. package/dist/browser/models/models.d.ts +357 -25
  8. package/dist/browser/models/models.js +361 -56
  9. package/dist/browser/models/models.js.map +1 -1
  10. package/dist/browser/protocol/messageParser.d.ts +1 -1
  11. package/dist/browser/protocol/messageParser.js +19 -76
  12. package/dist/browser/protocol/messageParser.js.map +1 -1
  13. package/dist/browser/voiceLiveSession.d.ts +2 -2
  14. package/dist/browser/voiceLiveSession.js +11 -10
  15. package/dist/browser/voiceLiveSession.js.map +1 -1
  16. package/dist/browser/websocket/websocket-browser.mjs.map +1 -0
  17. package/dist/browser/websocket/{websocketBrowser.d.ts → websocket.d.ts} +8 -2
  18. package/dist/{react-native/websocket/websocketBrowser.js → browser/websocket/websocket.js} +43 -3
  19. package/dist/browser/websocket/websocketFactory.d.ts +0 -11
  20. package/dist/browser/websocket/websocketFactory.js +2 -66
  21. package/dist/browser/websocket/websocketFactory.js.map +1 -1
  22. package/dist/browser/websocket/websocketLike.d.ts +3 -0
  23. package/dist/browser/websocket/websocketLike.js.map +1 -1
  24. package/dist/commonjs/index.d.ts +1 -1
  25. package/dist/commonjs/index.js +6 -1
  26. package/dist/commonjs/index.js.map +1 -1
  27. package/dist/commonjs/models/index.d.ts +1 -1
  28. package/dist/commonjs/models/index.js +6 -1
  29. package/dist/commonjs/models/index.js.map +1 -1
  30. package/dist/commonjs/models/models.d.ts +357 -25
  31. package/dist/commonjs/models/models.js +386 -59
  32. package/dist/commonjs/models/models.js.map +1 -1
  33. package/dist/commonjs/protocol/messageParser.d.ts +1 -1
  34. package/dist/commonjs/protocol/messageParser.js +18 -75
  35. package/dist/commonjs/protocol/messageParser.js.map +1 -1
  36. package/dist/commonjs/tsdoc-metadata.json +1 -1
  37. package/dist/commonjs/voiceLiveSession.d.ts +2 -2
  38. package/dist/commonjs/voiceLiveSession.js +20 -19
  39. package/dist/commonjs/voiceLiveSession.js.map +1 -1
  40. package/dist/{esm/websocket/websocketNode.d.ts → commonjs/websocket/websocket.d.ts} +2 -2
  41. package/dist/commonjs/websocket/{websocketNode.js → websocket.js} +31 -6
  42. package/dist/commonjs/websocket/websocket.js.map +1 -0
  43. package/dist/commonjs/websocket/websocketFactory.d.ts +0 -11
  44. package/dist/commonjs/websocket/websocketFactory.js +2 -68
  45. package/dist/commonjs/websocket/websocketFactory.js.map +1 -1
  46. package/dist/commonjs/websocket/websocketLike.d.ts +3 -0
  47. package/dist/commonjs/websocket/websocketLike.js.map +1 -1
  48. package/dist/esm/index.d.ts +1 -1
  49. package/dist/esm/index.js +1 -1
  50. package/dist/esm/index.js.map +1 -1
  51. package/dist/esm/models/index.d.ts +1 -1
  52. package/dist/esm/models/index.js +1 -1
  53. package/dist/esm/models/index.js.map +1 -1
  54. package/dist/esm/models/models.d.ts +357 -25
  55. package/dist/esm/models/models.js +361 -56
  56. package/dist/esm/models/models.js.map +1 -1
  57. package/dist/esm/protocol/messageParser.d.ts +1 -1
  58. package/dist/esm/protocol/messageParser.js +19 -76
  59. package/dist/esm/protocol/messageParser.js.map +1 -1
  60. package/dist/esm/voiceLiveSession.d.ts +2 -2
  61. package/dist/esm/voiceLiveSession.js +11 -10
  62. package/dist/esm/voiceLiveSession.js.map +1 -1
  63. package/dist/{react-native/websocket/websocketNode.d.ts → esm/websocket/websocket.d.ts} +2 -2
  64. package/dist/{browser/websocket/websocketNode.js → esm/websocket/websocket.js} +29 -4
  65. package/dist/esm/websocket/websocket.js.map +1 -0
  66. package/dist/esm/websocket/websocketFactory.d.ts +0 -11
  67. package/dist/esm/websocket/websocketFactory.js +2 -66
  68. package/dist/esm/websocket/websocketFactory.js.map +1 -1
  69. package/dist/esm/websocket/websocketLike.d.ts +3 -0
  70. package/dist/esm/websocket/websocketLike.js.map +1 -1
  71. package/dist/react-native/index.d.ts +1 -1
  72. package/dist/react-native/index.js +1 -1
  73. package/dist/react-native/index.js.map +1 -1
  74. package/dist/react-native/models/index.d.ts +1 -1
  75. package/dist/react-native/models/index.js +1 -1
  76. package/dist/react-native/models/index.js.map +1 -1
  77. package/dist/react-native/models/models.d.ts +357 -25
  78. package/dist/react-native/models/models.js +361 -56
  79. package/dist/react-native/models/models.js.map +1 -1
  80. package/dist/react-native/protocol/messageParser.d.ts +1 -1
  81. package/dist/react-native/protocol/messageParser.js +19 -76
  82. package/dist/react-native/protocol/messageParser.js.map +1 -1
  83. package/dist/react-native/voiceLiveSession.d.ts +2 -2
  84. package/dist/react-native/voiceLiveSession.js +11 -10
  85. package/dist/react-native/voiceLiveSession.js.map +1 -1
  86. package/dist/{commonjs/websocket/websocketNode.d.ts → react-native/websocket/websocket.d.ts} +2 -2
  87. package/dist/{esm/websocket/websocketNode.js → react-native/websocket/websocket.js} +29 -4
  88. package/dist/react-native/websocket/websocket.js.map +1 -0
  89. package/dist/react-native/websocket/websocketFactory.d.ts +0 -11
  90. package/dist/react-native/websocket/websocketFactory.js +2 -66
  91. package/dist/react-native/websocket/websocketFactory.js.map +1 -1
  92. package/dist/react-native/websocket/websocketLike.d.ts +3 -0
  93. package/dist/react-native/websocket/websocketLike.js.map +1 -1
  94. package/package.json +20 -7
  95. package/dist/browser/websocket/websocketBrowser.js +0 -175
  96. package/dist/browser/websocket/websocketBrowser.js.map +0 -1
  97. package/dist/browser/websocket/websocketNode.d.ts +0 -26
  98. package/dist/browser/websocket/websocketNode.js.map +0 -1
  99. package/dist/commonjs/websocket/websocketBrowser.d.ts +0 -26
  100. package/dist/commonjs/websocket/websocketBrowser.js +0 -179
  101. package/dist/commonjs/websocket/websocketBrowser.js.map +0 -1
  102. package/dist/commonjs/websocket/websocketNode.js.map +0 -1
  103. package/dist/esm/websocket/websocketBrowser.d.ts +0 -26
  104. package/dist/esm/websocket/websocketBrowser.js +0 -175
  105. package/dist/esm/websocket/websocketBrowser.js.map +0 -1
  106. package/dist/esm/websocket/websocketNode.js.map +0 -1
  107. package/dist/react-native/websocket/websocketBrowser.d.ts +0 -26
  108. package/dist/react-native/websocket/websocketBrowser.js.map +0 -1
  109. package/dist/react-native/websocket/websocketNode.js +0 -180
  110. package/dist/react-native/websocket/websocketNode.js.map +0 -1
@@ -1,76 +1,12 @@
1
1
  // Copyright (c) Microsoft Corporation.
2
2
  // Licensed under the MIT License.
3
+ import { VoiceLiveWebSocket } from "./websocket.js";
3
4
  /**
4
5
  * Factory for creating platform-appropriate WebSocket instances
5
6
  */
6
7
  export class VoiceLiveWebSocketFactory {
7
8
  create(options) {
8
- const platform = this._detectPlatform();
9
- switch (platform) {
10
- case "browser":
11
- return this._createBrowserWebSocket(options);
12
- case "node":
13
- return this._createNodeWebSocket(options);
14
- default:
15
- throw new Error(`Unsupported environment for WebSocket: ${platform}`);
16
- }
17
- }
18
- _createBrowserWebSocket(options) {
19
- // Use dynamic require to avoid bundling Node.js specific code in browser builds
20
- // eslint-disable-next-line @typescript-eslint/no-require-imports
21
- const { VoiceLiveWebSocketBrowser } = require("./websocketBrowser.js");
22
- return new VoiceLiveWebSocketBrowser(options);
23
- }
24
- _createNodeWebSocket(options) {
25
- // Use dynamic require to avoid bundling browser specific code in Node.js builds
26
- // eslint-disable-next-line @typescript-eslint/no-require-imports
27
- const { VoiceLiveWebSocketNode } = require("./websocketNode.js");
28
- return new VoiceLiveWebSocketNode(options);
29
- }
30
- _detectPlatform() {
31
- // Check for browser environment
32
- if (typeof self !== "undefined" && typeof self.WebSocket !== "undefined") {
33
- return "browser";
34
- }
35
- // Check for Node.js environment
36
- if (typeof process !== "undefined" &&
37
- process.versions != null &&
38
- process.versions.node != null) {
39
- return "node";
40
- }
41
- // Check for global object (Node.js) vs window (browser)
42
- if (typeof global !== "undefined" && typeof require !== "undefined") {
43
- return "node";
44
- }
45
- return "unknown";
46
- }
47
- }
48
- /**
49
- * Platform detection utility
50
- */
51
- export function detectPlatform() {
52
- const factory = new VoiceLiveWebSocketFactory();
53
- return factory._detectPlatform();
54
- }
55
- /**
56
- * Check if platform supports WebSocket
57
- */
58
- export function isWebSocketSupported() {
59
- const platform = detectPlatform();
60
- switch (platform) {
61
- case "browser":
62
- return typeof WebSocket !== "undefined";
63
- case "node":
64
- try {
65
- // eslint-disable-next-line @typescript-eslint/no-require-imports
66
- require("ws");
67
- return true;
68
- }
69
- catch {
70
- return false;
71
- }
72
- default:
73
- return false;
9
+ return new VoiceLiveWebSocket(options);
74
10
  }
75
11
  }
76
12
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"websocketFactory.js","sourceRoot":"","sources":["../../../src/websocket/websocketFactory.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAQlC;;GAEG;AACH,MAAM,OAAO,yBAAyB;IACpC,MAAM,CAAC,OAAiC;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAExC,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;YAE/C,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAE5C;gBACE,MAAM,IAAI,KAAK,CAAC,0CAA0C,QAAQ,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAEO,uBAAuB,CAAC,OAAiC;QAC/D,gFAAgF;QAChF,iEAAiE;QACjE,MAAM,EAAE,yBAAyB,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;QACvE,OAAO,IAAI,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAEO,oBAAoB,CAAC,OAAiC;QAC5D,gFAAgF;QAChF,iEAAiE;QACjE,MAAM,EAAE,sBAAsB,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACjE,OAAO,IAAI,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAEO,eAAe;QACrB,gCAAgC;QAChC,IAAI,OAAO,IAAI,KAAK,WAAW,IAAI,OAAQ,IAAY,CAAC,SAAS,KAAK,WAAW,EAAE,CAAC;YAClF,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,gCAAgC;QAChC,IACE,OAAO,OAAO,KAAK,WAAW;YAC9B,OAAO,CAAC,QAAQ,IAAI,IAAI;YACxB,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,EAC7B,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,wDAAwD;QACxD,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE,CAAC;YACpE,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,OAAO,GAAG,IAAI,yBAAyB,EAAE,CAAC;IAChD,OAAQ,OAAe,CAAC,eAAe,EAAE,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAElC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,SAAS;YACZ,OAAO,OAAO,SAAS,KAAK,WAAW,CAAC;QAE1C,KAAK,MAAM;YACT,IAAI,CAAC;gBACH,iEAAiE;gBACjE,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QAEH;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,yBAAyB,EAAE,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type {\n VoiceLiveWebSocketLike,\n VoiceLiveWebSocketFactoryLike,\n WebSocketFactoryOptions,\n} from \"./websocketLike.js\";\n\n/**\n * Factory for creating platform-appropriate WebSocket instances\n */\nexport class VoiceLiveWebSocketFactory implements VoiceLiveWebSocketFactoryLike {\n create(options?: WebSocketFactoryOptions): VoiceLiveWebSocketLike {\n const platform = this._detectPlatform();\n\n switch (platform) {\n case \"browser\":\n return this._createBrowserWebSocket(options);\n\n case \"node\":\n return this._createNodeWebSocket(options);\n\n default:\n throw new Error(`Unsupported environment for WebSocket: ${platform}`);\n }\n }\n\n private _createBrowserWebSocket(options?: WebSocketFactoryOptions): VoiceLiveWebSocketLike {\n // Use dynamic require to avoid bundling Node.js specific code in browser builds\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { VoiceLiveWebSocketBrowser } = require(\"./websocketBrowser.js\");\n return new VoiceLiveWebSocketBrowser(options);\n }\n\n private _createNodeWebSocket(options?: WebSocketFactoryOptions): VoiceLiveWebSocketLike {\n // Use dynamic require to avoid bundling browser specific code in Node.js builds\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { VoiceLiveWebSocketNode } = require(\"./websocketNode.js\");\n return new VoiceLiveWebSocketNode(options);\n }\n\n private _detectPlatform(): \"browser\" | \"node\" | \"unknown\" {\n // Check for browser environment\n if (typeof self !== \"undefined\" && typeof (self as any).WebSocket !== \"undefined\") {\n return \"browser\";\n }\n\n // Check for Node.js environment\n if (\n typeof process !== \"undefined\" &&\n process.versions != null &&\n process.versions.node != null\n ) {\n return \"node\";\n }\n\n // Check for global object (Node.js) vs window (browser)\n if (typeof global !== \"undefined\" && typeof require !== \"undefined\") {\n return \"node\";\n }\n\n return \"unknown\";\n }\n}\n\n/**\n * Platform detection utility\n */\nexport function detectPlatform(): \"browser\" | \"node\" | \"unknown\" {\n const factory = new VoiceLiveWebSocketFactory();\n return (factory as any)._detectPlatform();\n}\n\n/**\n * Check if platform supports WebSocket\n */\nexport function isWebSocketSupported(): boolean {\n const platform = detectPlatform();\n\n switch (platform) {\n case \"browser\":\n return typeof WebSocket !== \"undefined\";\n\n case \"node\":\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n require(\"ws\");\n return true;\n } catch {\n return false;\n }\n\n default:\n return false;\n }\n}\n\n/**\n * Default factory instance\n */\nexport const defaultWebSocketFactory = new VoiceLiveWebSocketFactory();\n"]}
1
+ {"version":3,"file":"websocketFactory.js","sourceRoot":"","sources":["../../../src/websocket/websocketFactory.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAOlC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;GAEG;AACH,MAAM,OAAO,yBAAyB;IACpC,MAAM,CAAC,OAAiC;QACtC,OAAO,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,yBAAyB,EAAE,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type {\n VoiceLiveWebSocketLike,\n VoiceLiveWebSocketFactoryLike,\n WebSocketFactoryOptions,\n} from \"./websocketLike.js\";\nimport { VoiceLiveWebSocket } from \"./websocket.js\";\n\n/**\n * Factory for creating platform-appropriate WebSocket instances\n */\nexport class VoiceLiveWebSocketFactory implements VoiceLiveWebSocketFactoryLike {\n create(options?: WebSocketFactoryOptions): VoiceLiveWebSocketLike {\n return new VoiceLiveWebSocket(options);\n }\n}\n\n/**\n * Default factory instance\n */\nexport const defaultWebSocketFactory = new VoiceLiveWebSocketFactory();\n"]}
@@ -1,4 +1,5 @@
1
1
  import type { AbortSignalLike } from "@azure/abort-controller";
2
+ import type { ProxySettings } from "@azure/core-rest-pipeline";
2
3
  /**
3
4
  * WebSocket ready state enumeration matching standard WebSocket values
4
5
  */
@@ -20,6 +21,8 @@ export interface WebSocketFactoryOptions {
20
21
  compression?: boolean;
21
22
  /** Custom headers for connection (Node.js only) */
22
23
  headers?: Record<string, string>;
24
+ /** @internal - Proxy configuration (detected from environment variables) */
25
+ proxyOptions?: ProxySettings;
23
26
  }
24
27
  /**
25
28
  * Platform-agnostic WebSocket interface for Voice Live connections
@@ -1 +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"]}
1
+ {"version":3,"file":"websocketLike.js","sourceRoot":"","sources":["../../../src/websocket/websocketLike.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAKlC;;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\";\nimport type { ProxySettings } from \"@azure/core-rest-pipeline\";\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 /** @internal - Proxy configuration (detected from environment variables) */\n proxyOptions?: ProxySettings;\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@azure/ai-voicelive",
3
- "version": "1.0.0-beta.1",
3
+ "version": "1.0.0-beta.2",
4
4
  "description": "A generated SDK for VoiceLiveClient.",
5
5
  "engines": {
6
6
  "node": ">=20.0.0"
@@ -60,11 +60,12 @@
60
60
  "@azure/core-rest-pipeline": "^1.20.0",
61
61
  "@azure/core-util": "^1.12.0",
62
62
  "@azure/logger": "^1.2.0",
63
+ "https-proxy-agent": "^7.0.1",
63
64
  "tslib": "^2.8.1",
64
65
  "ws": "^8.18.3"
65
66
  },
66
67
  "devDependencies": {
67
- "@azure/identity": "4.11.1",
68
+ "@azure/identity": "4.13.0",
68
69
  "@types/node": "^20.19.25",
69
70
  "@types/ws": "^8.18.1",
70
71
  "@vitest/browser-playwright": "^4.0.8",
@@ -72,17 +73,18 @@
72
73
  "cross-env": "^7.0.3",
73
74
  "dotenv": "^16.6.1",
74
75
  "eslint": "^9.39.1",
76
+ "microsoft-cognitiveservices-speech-sdk": "^1.47.0",
75
77
  "playwright": "^1.56.1",
76
78
  "prettier": "^3.6.2",
77
79
  "rimraf": "^6.1.0",
78
80
  "tshy": "^3.0.3",
79
81
  "typescript": "~5.9.3",
80
82
  "vitest": "^4.0.8",
81
- "@azure-tools/test-recorder": "4.1.1",
82
- "@azure-tools/test-utils-vitest": "2.0.1",
83
- "@azure-tools/test-credential": "2.1.2",
84
- "@azure/dev-tool": "1.0.0",
85
- "@azure/eslint-plugin-azure-sdk": "3.0.0"
83
+ "@azure-tools/test-credential": "^2.1.2",
84
+ "@azure-tools/test-recorder": "^4.1.1",
85
+ "@azure-tools/test-utils-vitest": "^2.0.1",
86
+ "@azure/dev-tool": "^1.0.0",
87
+ "@azure/eslint-plugin-azure-sdk": "^3.0.0"
86
88
  },
87
89
  "exports": {
88
90
  "./package.json": "./package.json",
@@ -138,11 +140,22 @@
138
140
  "format": "prettier --write --config ../../../.prettierrc.json --ignore-path ../../../.prettierignore \"src/**/*.{ts,cts,mts}\" \"test/**/*.{ts,cts,mts}\" \"*.{js,cjs,mjs,json}\" ",
139
141
  "generate:client": "echo skipped",
140
142
  "test:browser": "dev-tool run build-test && dev-tool run test:vitest --browser",
143
+ "test:browser:debug": "dev-tool run build-test && vitest --config vitest.browser.debug.config.ts --browser",
144
+ "test:browser:grep": "dev-tool run build-test && vitest --config vitest.browser.debug.config.ts --browser --run -t",
145
+ "test:browser:ui": "dev-tool run build-test && vitest --config vitest.browser.debug.config.ts --browser --ui",
141
146
  "build": "dev-tool run build-package && dev-tool run extract-api",
142
147
  "fastbuild": "dev-tool run build-package",
143
148
  "test:node": "dev-tool run test:vitest",
144
149
  "test:node:esm": "dev-tool run test:vitest --esm",
150
+ "test:debug": "vitest -c vitest.debug.config.ts",
151
+ "test:debug:ui": "vitest -c vitest.debug.config.ts --ui",
152
+ "test:node:verbose": "AZURE_LOG_LEVEL=verbose DEBUG=azure:ai-voicelive:* dev-tool run test:vitest --reporter=verbose",
153
+ "test:vitest": "vitest",
154
+ "test:vitest:ui": "vitest --ui",
155
+ "test:grep": "vitest --run --reporter=verbose -t",
145
156
  "test": "npm run test:node && npm run test:browser",
157
+ "test:integration": "bash ./scripts/integration-test.sh",
158
+ "test:integration:windows": "powershell -ExecutionPolicy Bypass -File ./scripts/integration-test.ps1",
146
159
  "update-snippets": "dev-tool run update-snippets",
147
160
  "dev": "./fast-dev.sh",
148
161
  "watch": "dev-tool run build-package --watch"
@@ -1,175 +0,0 @@
1
- // Copyright (c) Microsoft Corporation.
2
- // Licensed under the MIT License.
3
- import { WebSocketState, } from "./websocketLike.js";
4
- import { VoiceLiveConnectionError, VoiceLiveErrorCodes } from "../errors/connectionErrors.js";
5
- /**
6
- * Browser WebSocket implementation using native WebSocket API
7
- */
8
- export class VoiceLiveWebSocketBrowser {
9
- _ws;
10
- _url;
11
- _options;
12
- _onOpen;
13
- _onClose;
14
- _onMessage;
15
- _onError;
16
- constructor(options = {}) {
17
- this._options = {
18
- connectionTimeoutInMs: 30000,
19
- maxMessageSize: 1024 * 1024, // 1MB
20
- ...options,
21
- };
22
- }
23
- async connect(url, protocols, abortSignal) {
24
- if (this._ws && this._ws.readyState !== WebSocket.CLOSED) {
25
- throw new VoiceLiveConnectionError("WebSocket is already connected or connecting", VoiceLiveErrorCodes.AlreadyConnected);
26
- }
27
- return new Promise((resolve, reject) => {
28
- const timeoutId = setTimeout(() => {
29
- reject(new VoiceLiveConnectionError(`WebSocket connection timeout after ${this._options.connectionTimeoutInMs}ms`, VoiceLiveErrorCodes.ConnectionTimeout));
30
- }, this._options.connectionTimeoutInMs);
31
- // Handle abort signal
32
- const abortHandler = () => {
33
- clearTimeout(timeoutId);
34
- if (this._ws) {
35
- this._ws.close();
36
- }
37
- reject(new VoiceLiveConnectionError("WebSocket connection aborted", VoiceLiveErrorCodes.OperationCancelled));
38
- };
39
- if (abortSignal) {
40
- if (abortSignal.aborted) {
41
- abortHandler();
42
- return;
43
- }
44
- abortSignal.addEventListener("abort", abortHandler);
45
- }
46
- try {
47
- this._ws = new WebSocket(url, protocols);
48
- this._ws.binaryType = "arraybuffer";
49
- this._url = url;
50
- this._ws.addEventListener("open", () => {
51
- clearTimeout(timeoutId);
52
- if (abortSignal) {
53
- abortSignal.removeEventListener("abort", abortHandler);
54
- }
55
- this._onOpen?.();
56
- resolve();
57
- });
58
- this._ws.addEventListener("close", (event) => {
59
- clearTimeout(timeoutId);
60
- if (abortSignal) {
61
- abortSignal.removeEventListener("abort", abortHandler);
62
- }
63
- this._onClose?.(event.code, event.reason);
64
- });
65
- this._ws.addEventListener("message", (event) => {
66
- if (typeof event.data === "string") {
67
- this._onMessage?.(event.data);
68
- }
69
- else if (event.data instanceof ArrayBuffer) {
70
- this._onMessage?.(event.data);
71
- }
72
- else if (event.data instanceof Blob) {
73
- // Convert Blob to ArrayBuffer
74
- const reader = new FileReader();
75
- reader.onload = () => {
76
- if (reader.result instanceof ArrayBuffer) {
77
- this._onMessage?.(reader.result);
78
- }
79
- };
80
- reader.onerror = () => {
81
- this._onError?.(new VoiceLiveConnectionError("Failed to read blob data", VoiceLiveErrorCodes.WebSocketError, "blob_read"));
82
- };
83
- reader.readAsArrayBuffer(event.data);
84
- }
85
- });
86
- this._ws.addEventListener("error", () => {
87
- clearTimeout(timeoutId);
88
- if (abortSignal) {
89
- abortSignal.removeEventListener("abort", abortHandler);
90
- }
91
- const error = new VoiceLiveConnectionError("WebSocket connection failed", VoiceLiveErrorCodes.WebSocketError, "websocket_connection", true);
92
- this._onError?.(error);
93
- reject(error);
94
- });
95
- }
96
- catch (error) {
97
- clearTimeout(timeoutId);
98
- if (abortSignal) {
99
- abortSignal.removeEventListener("abort", abortHandler);
100
- }
101
- 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))));
102
- }
103
- });
104
- }
105
- async disconnect(code = 1000, reason) {
106
- if (!this._ws || this._ws.readyState === WebSocket.CLOSED) {
107
- return;
108
- }
109
- return new Promise((resolve) => {
110
- const closeHandler = () => {
111
- resolve();
112
- };
113
- if (this._ws.readyState === WebSocket.CLOSING) {
114
- this._ws.addEventListener("close", closeHandler, { once: true });
115
- }
116
- else {
117
- this._ws.addEventListener("close", closeHandler, { once: true });
118
- this._ws.close(code, reason);
119
- }
120
- });
121
- }
122
- async send(data, abortSignal) {
123
- if (!this._ws || this._ws.readyState !== WebSocket.OPEN) {
124
- throw new VoiceLiveConnectionError("WebSocket is not connected", VoiceLiveErrorCodes.NotConnected);
125
- }
126
- if (abortSignal?.aborted) {
127
- throw new VoiceLiveConnectionError("Send operation aborted", VoiceLiveErrorCodes.OperationCancelled);
128
- }
129
- return new Promise((resolve, reject) => {
130
- const abortHandler = () => {
131
- reject(new VoiceLiveConnectionError("Send operation aborted", VoiceLiveErrorCodes.OperationCancelled));
132
- };
133
- if (abortSignal) {
134
- abortSignal.addEventListener("abort", abortHandler, { once: true });
135
- }
136
- try {
137
- this._ws.send(data);
138
- if (abortSignal) {
139
- abortSignal.removeEventListener("abort", abortHandler);
140
- }
141
- resolve();
142
- }
143
- catch (error) {
144
- if (abortSignal) {
145
- abortSignal.removeEventListener("abort", abortHandler);
146
- }
147
- reject(new VoiceLiveConnectionError(`Failed to send WebSocket message: ${error instanceof Error ? error.message : "Unknown error"}`, VoiceLiveErrorCodes.WebSocketError, "message_send", true, error instanceof Error ? error : new Error(String(error))));
148
- }
149
- });
150
- }
151
- onOpen(handler) {
152
- this._onOpen = handler;
153
- }
154
- onClose(handler) {
155
- this._onClose = handler;
156
- }
157
- onMessage(handler) {
158
- this._onMessage = handler;
159
- }
160
- onError(handler) {
161
- this._onError = handler;
162
- }
163
- get isConnected() {
164
- return this._ws?.readyState === WebSocket.OPEN;
165
- }
166
- get readyState() {
167
- if (!this._ws)
168
- return WebSocketState.Closed;
169
- return this._ws.readyState;
170
- }
171
- get url() {
172
- return this._url;
173
- }
174
- }
175
- //# sourceMappingURL=websocketBrowser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"websocketBrowser.js","sourceRoot":"","sources":["../../../src/websocket/websocketBrowser.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 {\n WebSocketState,\n type VoiceLiveWebSocketLike,\n type WebSocketFactoryOptions,\n} from \"./websocketLike.js\";\nimport { VoiceLiveConnectionError, VoiceLiveErrorCodes } from \"../errors/connectionErrors.js\";\n\n/**\n * Browser WebSocket implementation using native WebSocket API\n */\nexport class VoiceLiveWebSocketBrowser 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 ...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 // Handle abort signal\n const abortHandler = (): void => {\n clearTimeout(timeoutId);\n if (this._ws) {\n this._ws.close();\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 this._ws.binaryType = \"arraybuffer\";\n this._url = url;\n\n this._ws.addEventListener(\"open\", () => {\n clearTimeout(timeoutId);\n if (abortSignal) {\n abortSignal.removeEventListener(\"abort\", abortHandler);\n }\n this._onOpen?.();\n resolve();\n });\n\n this._ws.addEventListener(\"close\", (event: CloseEvent) => {\n clearTimeout(timeoutId);\n if (abortSignal) {\n abortSignal.removeEventListener(\"abort\", abortHandler);\n }\n this._onClose?.(event.code, event.reason);\n });\n\n this._ws.addEventListener(\"message\", (event: MessageEvent) => {\n if (typeof event.data === \"string\") {\n this._onMessage?.(event.data);\n } else if (event.data instanceof ArrayBuffer) {\n this._onMessage?.(event.data);\n } else if (event.data instanceof Blob) {\n // Convert Blob to ArrayBuffer\n const reader = new FileReader();\n reader.onload = () => {\n if (reader.result instanceof ArrayBuffer) {\n this._onMessage?.(reader.result);\n }\n };\n reader.onerror = () => {\n this._onError?.(\n new VoiceLiveConnectionError(\n \"Failed to read blob data\",\n VoiceLiveErrorCodes.WebSocketError,\n \"blob_read\",\n ),\n );\n };\n reader.readAsArrayBuffer(event.data);\n }\n });\n\n this._ws.addEventListener(\"error\", () => {\n clearTimeout(timeoutId);\n if (abortSignal) {\n abortSignal.removeEventListener(\"abort\", abortHandler);\n }\n const error = new VoiceLiveConnectionError(\n \"WebSocket connection failed\",\n VoiceLiveErrorCodes.WebSocketError,\n \"websocket_connection\",\n true,\n );\n this._onError?.(error);\n reject(error);\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!.addEventListener(\"close\", closeHandler, { once: true });\n } else {\n this._ws!.addEventListener(\"close\", closeHandler, { once: true });\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, { once: true });\n }\n\n try {\n this._ws!.send(data);\n if (abortSignal) {\n abortSignal.removeEventListener(\"abort\", abortHandler);\n }\n resolve();\n } catch (error) {\n if (abortSignal) {\n abortSignal.removeEventListener(\"abort\", abortHandler);\n }\n reject(\n new VoiceLiveConnectionError(\n `Failed to send WebSocket message: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n VoiceLiveErrorCodes.WebSocketError,\n \"message_send\",\n true,\n error instanceof Error ? error : new Error(String(error)),\n ),\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"]}
@@ -1,26 +0,0 @@
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
@@ -1 +0,0 @@
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"]}
@@ -1,26 +0,0 @@
1
- import type { AbortSignalLike } from "@azure/abort-controller";
2
- import { WebSocketState, type VoiceLiveWebSocketLike, type WebSocketFactoryOptions } from "./websocketLike.js";
3
- /**
4
- * Browser WebSocket implementation using native WebSocket API
5
- */
6
- export declare class VoiceLiveWebSocketBrowser 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=websocketBrowser.d.ts.map