@absolutejs/voice 0.0.1

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 (179) hide show
  1. package/README.md +150 -0
  2. package/dist/absolutejs/src/angular/angularDeps.d.ts +2 -0
  3. package/dist/absolutejs/src/angular/angularPatch.d.ts +1 -0
  4. package/dist/absolutejs/src/angular/injectorPatch.d.ts +1 -0
  5. package/dist/absolutejs/src/angular/islands.d.ts +3 -0
  6. package/dist/absolutejs/src/angular/lowerDeferSyntax.d.ts +18 -0
  7. package/dist/absolutejs/src/angular/lowerServerIslands.d.ts +1 -0
  8. package/dist/absolutejs/src/angular/pageHandler.d.ts +26 -0
  9. package/dist/absolutejs/src/angular/resolveAngularPackage.d.ts +7 -0
  10. package/dist/absolutejs/src/angular/ssrRender.d.ts +16 -0
  11. package/dist/absolutejs/src/angular/ssrSanitizer.d.ts +3 -0
  12. package/dist/absolutejs/src/build/angularLinkerPlugin.d.ts +11 -0
  13. package/dist/absolutejs/src/build/buildAngularVendor.d.ts +4 -0
  14. package/dist/absolutejs/src/build/buildDepVendor.d.ts +2 -0
  15. package/dist/absolutejs/src/build/buildReactVendor.d.ts +8 -0
  16. package/dist/absolutejs/src/build/buildSvelteVendor.d.ts +6 -0
  17. package/dist/absolutejs/src/build/buildVueVendor.d.ts +6 -0
  18. package/dist/absolutejs/src/build/compileAngular.d.ts +29 -0
  19. package/dist/absolutejs/src/build/compileSvelte.d.ts +13 -0
  20. package/dist/absolutejs/src/build/compileVue.d.ts +19 -0
  21. package/dist/absolutejs/src/build/generateManifest.d.ts +2 -0
  22. package/dist/absolutejs/src/build/generateReactIndexes.d.ts +1 -0
  23. package/dist/absolutejs/src/build/htmlScriptHMRPlugin.d.ts +13 -0
  24. package/dist/absolutejs/src/build/islandEntries.d.ts +32 -0
  25. package/dist/absolutejs/src/build/nativeRewrite.d.ts +5 -0
  26. package/dist/absolutejs/src/build/optimizeHtmlImages.d.ts +2 -0
  27. package/dist/absolutejs/src/build/outputLogs.d.ts +1 -0
  28. package/dist/absolutejs/src/build/resolvePackageImport.d.ts +9 -0
  29. package/dist/absolutejs/src/build/rewriteImports.d.ts +7 -0
  30. package/dist/absolutejs/src/build/rewriteReactImports.d.ts +7 -0
  31. package/dist/absolutejs/src/build/scanConventions.d.ts +5 -0
  32. package/dist/absolutejs/src/build/scanCssEntryPoints.d.ts +1 -0
  33. package/dist/absolutejs/src/build/scanEntryPoints.d.ts +1 -0
  34. package/dist/absolutejs/src/build/staticIslandPages.d.ts +9 -0
  35. package/dist/absolutejs/src/build/updateAssetPaths.d.ts +1 -0
  36. package/dist/absolutejs/src/build/wrapHTMLScript.d.ts +17 -0
  37. package/dist/absolutejs/src/cli/scripts/telemetry.d.ts +5 -0
  38. package/dist/absolutejs/src/cli/telemetryEvent.d.ts +1 -0
  39. package/dist/absolutejs/src/client/islandStore.d.ts +22 -0
  40. package/dist/absolutejs/src/client/streamSwap.d.ts +11 -0
  41. package/dist/absolutejs/src/constants.d.ts +60 -0
  42. package/dist/absolutejs/src/core/build.d.ts +9 -0
  43. package/dist/absolutejs/src/core/currentIslandRegistry.d.ts +7 -0
  44. package/dist/absolutejs/src/core/devBuild.d.ts +6 -0
  45. package/dist/absolutejs/src/core/devRouteRegistrationCallsite.d.ts +2 -0
  46. package/dist/absolutejs/src/core/devVendorPaths.d.ts +13 -0
  47. package/dist/absolutejs/src/core/index.d.ts +7 -0
  48. package/dist/absolutejs/src/core/islandManifest.d.ts +3 -0
  49. package/dist/absolutejs/src/core/islandMarkupAttributes.d.ts +12 -0
  50. package/dist/absolutejs/src/core/islandPageContext.d.ts +12 -0
  51. package/dist/absolutejs/src/core/islandSsr.d.ts +6 -0
  52. package/dist/absolutejs/src/core/islands.d.ts +16 -0
  53. package/dist/absolutejs/src/core/loadIslandRegistry.d.ts +1 -0
  54. package/dist/absolutejs/src/core/lookup.d.ts +1 -0
  55. package/dist/absolutejs/src/core/pageHandlers.d.ts +6 -0
  56. package/dist/absolutejs/src/core/prepare.d.ts +274 -0
  57. package/dist/absolutejs/src/core/prerender.d.ts +31 -0
  58. package/dist/absolutejs/src/core/renderIslandMarkup.d.ts +13 -0
  59. package/dist/absolutejs/src/core/responseEnhancers.d.ts +10 -0
  60. package/dist/absolutejs/src/core/staticStreaming.d.ts +25 -0
  61. package/dist/absolutejs/src/core/streamingSlotRegistrar.d.ts +16 -0
  62. package/dist/absolutejs/src/core/streamingSlotRegistry.d.ts +2 -0
  63. package/dist/absolutejs/src/core/streamingSlotWarningScope.d.ts +4 -0
  64. package/dist/absolutejs/src/core/svelteServerModule.d.ts +1 -0
  65. package/dist/absolutejs/src/core/wrapPageHandlerWithStreamingSlots.d.ts +2 -0
  66. package/dist/absolutejs/src/dev/assetStore.d.ts +8 -0
  67. package/dist/absolutejs/src/dev/buildHMRClient.d.ts +1 -0
  68. package/dist/absolutejs/src/dev/clientManager.d.ts +31 -0
  69. package/dist/absolutejs/src/dev/configResolver.d.ts +14 -0
  70. package/dist/absolutejs/src/dev/dependencyGraph.d.ts +10 -0
  71. package/dist/absolutejs/src/dev/devCert.d.ts +11 -0
  72. package/dist/absolutejs/src/dev/fileHashTracker.d.ts +2 -0
  73. package/dist/absolutejs/src/dev/fileWatcher.d.ts +4 -0
  74. package/dist/absolutejs/src/dev/moduleMapper.d.ts +27 -0
  75. package/dist/absolutejs/src/dev/moduleServer.d.ts +21 -0
  76. package/dist/absolutejs/src/dev/moduleVersionTracker.d.ts +7 -0
  77. package/dist/absolutejs/src/dev/pathUtils.d.ts +5 -0
  78. package/dist/absolutejs/src/dev/reactComponentClassifier.d.ts +2 -0
  79. package/dist/absolutejs/src/dev/rebuildTrigger.d.ts +10 -0
  80. package/dist/absolutejs/src/dev/simpleHTMLHMR.d.ts +4 -0
  81. package/dist/absolutejs/src/dev/simpleHTMXHMR.d.ts +4 -0
  82. package/dist/absolutejs/src/dev/transformCache.d.ts +6 -0
  83. package/dist/absolutejs/src/dev/webSocket.d.ts +9 -0
  84. package/dist/absolutejs/src/index.d.ts +5 -0
  85. package/dist/absolutejs/src/islands/pageMetadata.d.ts +13 -0
  86. package/dist/absolutejs/src/islands/sourceMetadata.d.ts +10 -0
  87. package/dist/absolutejs/src/plugins/devtoolsJson.d.ts +58 -0
  88. package/dist/absolutejs/src/plugins/hmr.d.ts +138 -0
  89. package/dist/absolutejs/src/plugins/imageOptimizer.d.ts +67 -0
  90. package/dist/absolutejs/src/plugins/index.d.ts +3 -0
  91. package/dist/absolutejs/src/plugins/networking.d.ts +2 -0
  92. package/dist/absolutejs/src/plugins/pageRouter.d.ts +1 -0
  93. package/dist/absolutejs/src/react/Island.d.ts +2 -0
  94. package/dist/absolutejs/src/react/bridgeInternals.d.ts +1 -0
  95. package/dist/absolutejs/src/react/createIsland.d.ts +2 -0
  96. package/dist/absolutejs/src/react/hooks/useIslandStore.d.ts +3 -0
  97. package/dist/absolutejs/src/react/index.d.ts +4 -0
  98. package/dist/absolutejs/src/react/pageHandler.d.ts +21 -0
  99. package/dist/absolutejs/src/svelte/lowerAwaitSlotSyntax.d.ts +4 -0
  100. package/dist/absolutejs/src/svelte/lowerIslandSyntax.d.ts +4 -0
  101. package/dist/absolutejs/src/svelte/pageHandler.d.ts +23 -0
  102. package/dist/absolutejs/src/svelte/renderToReadableStream.d.ts +14 -0
  103. package/dist/absolutejs/src/utils/cleanStaleOutputs.d.ts +1 -0
  104. package/dist/absolutejs/src/utils/cleanup.d.ts +8 -0
  105. package/dist/absolutejs/src/utils/commonAncestor.d.ts +1 -0
  106. package/dist/absolutejs/src/utils/defineConfig.d.ts +2 -0
  107. package/dist/absolutejs/src/utils/defineEnv.d.ts +10 -0
  108. package/dist/absolutejs/src/utils/escapeScriptContent.d.ts +1 -0
  109. package/dist/absolutejs/src/utils/generateHeadElement.d.ts +4 -0
  110. package/dist/absolutejs/src/utils/generateSitemap.d.ts +6 -0
  111. package/dist/absolutejs/src/utils/getDurationString.d.ts +1 -0
  112. package/dist/absolutejs/src/utils/getEnv.d.ts +1 -0
  113. package/dist/absolutejs/src/utils/imageProcessing.d.ts +33 -0
  114. package/dist/absolutejs/src/utils/index.d.ts +9 -0
  115. package/dist/absolutejs/src/utils/jsonLd.d.ts +2 -0
  116. package/dist/absolutejs/src/utils/loadConfig.d.ts +1 -0
  117. package/dist/absolutejs/src/utils/logger.d.ts +55 -0
  118. package/dist/absolutejs/src/utils/networking.d.ts +2 -0
  119. package/dist/absolutejs/src/utils/normalizePath.d.ts +9 -0
  120. package/dist/absolutejs/src/utils/registerClientScript.d.ts +36 -0
  121. package/dist/absolutejs/src/utils/resolveConvention.d.ts +9 -0
  122. package/dist/absolutejs/src/utils/ssrErrorPage.d.ts +1 -0
  123. package/dist/absolutejs/src/utils/startupBanner.d.ts +9 -0
  124. package/dist/absolutejs/src/utils/streamingSlotMetricSink.d.ts +18 -0
  125. package/dist/absolutejs/src/utils/streamingSlots.d.ts +76 -0
  126. package/dist/absolutejs/src/utils/stringModifiers.d.ts +3 -0
  127. package/dist/absolutejs/src/utils/validateSafePath.d.ts +1 -0
  128. package/dist/absolutejs/src/vue/pageHandler.d.ts +29 -0
  129. package/dist/absolutejs/types/ai.d.ts +4631 -0
  130. package/dist/absolutejs/types/angular.d.ts +29 -0
  131. package/dist/absolutejs/types/build.d.ts +67 -0
  132. package/dist/absolutejs/types/cli.d.ts +19 -0
  133. package/dist/absolutejs/types/client.d.ts +65 -0
  134. package/dist/absolutejs/types/conventions.d.ts +20 -0
  135. package/dist/absolutejs/types/env.d.ts +2 -0
  136. package/dist/absolutejs/types/image.d.ts +77 -0
  137. package/dist/absolutejs/types/index.d.ts +19 -0
  138. package/dist/absolutejs/types/island.d.ts +48 -0
  139. package/dist/absolutejs/types/jsonLd.d.ts +271 -0
  140. package/dist/absolutejs/types/messages.d.ts +144 -0
  141. package/dist/absolutejs/types/metadata.d.ts +49 -0
  142. package/dist/absolutejs/types/react.d.ts +2 -0
  143. package/dist/absolutejs/types/session.d.ts +16 -0
  144. package/dist/absolutejs/types/sitemap.d.ts +14 -0
  145. package/dist/absolutejs/types/svelte.d.ts +2 -0
  146. package/dist/absolutejs/types/telemetry.d.ts +15 -0
  147. package/dist/absolutejs/types/tool.d.ts +11 -0
  148. package/dist/absolutejs/types/typeGuards.d.ts +5 -0
  149. package/dist/absolutejs/types/vue.d.ts +14 -0
  150. package/dist/absolutejs/types/websocket.d.ts +6 -0
  151. package/dist/angular/index.js +505 -0
  152. package/dist/client/index.js +521 -0
  153. package/dist/index.js +693 -0
  154. package/dist/react/index.js +489 -0
  155. package/dist/svelte/index.js +456 -0
  156. package/dist/voice/src/angular/index.d.ts +1 -0
  157. package/dist/voice/src/angular/voice-stream.service.d.ts +15 -0
  158. package/dist/voice/src/client/actions.d.ts +58 -0
  159. package/dist/voice/src/client/connection.d.ts +12 -0
  160. package/dist/voice/src/client/createVoiceStream.d.ts +14 -0
  161. package/dist/voice/src/client/index.d.ts +3 -0
  162. package/dist/voice/src/client/microphone.d.ts +11 -0
  163. package/dist/voice/src/client/store.d.ts +7 -0
  164. package/dist/voice/src/index.d.ts +5 -0
  165. package/dist/voice/src/logger.d.ts +8 -0
  166. package/dist/voice/src/memoryStore.d.ts +2 -0
  167. package/dist/voice/src/plugin.d.ts +40 -0
  168. package/dist/voice/src/react/index.d.ts +1 -0
  169. package/dist/voice/src/react/useVoiceStream.d.ts +13 -0
  170. package/dist/voice/src/session.d.ts +2 -0
  171. package/dist/voice/src/store.d.ts +6 -0
  172. package/dist/voice/src/svelte/createVoiceStream.d.ts +14 -0
  173. package/dist/voice/src/svelte/index.d.ts +1 -0
  174. package/dist/voice/src/turnDetection.d.ts +3 -0
  175. package/dist/voice/src/types.d.ts +318 -0
  176. package/dist/voice/src/vue/index.d.ts +1 -0
  177. package/dist/voice/src/vue/useVoiceStream.d.ts +13 -0
  178. package/dist/vue/index.js +496 -0
  179. package/package.json +100 -0
@@ -0,0 +1,521 @@
1
+ // @bun
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __name = (target, name) => {
6
+ Object.defineProperty(target, "name", {
7
+ value: name,
8
+ enumerable: false,
9
+ configurable: true
10
+ });
11
+ return target;
12
+ };
13
+ var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name);
14
+ var __typeError = (msg) => {
15
+ throw TypeError(msg);
16
+ };
17
+ var __defNormalProp = (obj, key, value) => (key in obj) ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
18
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
19
+ var __privateIn = (member, obj) => Object(obj) !== obj ? __typeError('Cannot use the "in" operator on this value') : member.has(obj);
20
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
21
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
22
+ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
23
+ var __decoratorStart = (base) => [, , , __create(base?.[__knownSymbol("metadata")] ?? null)];
24
+ var __decoratorStrings = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
25
+ var __expectFn = (fn) => fn !== undefined && typeof fn !== "function" ? __typeError("Function expected") : fn;
26
+ var __decoratorContext = (kind, name, done, metadata, fns) => ({
27
+ kind: __decoratorStrings[kind],
28
+ name,
29
+ metadata,
30
+ addInitializer: (fn) => done._ ? __typeError("Already initialized") : fns.push(__expectFn(fn || null))
31
+ });
32
+ var __decoratorMetadata = (array, target) => __defNormalProp(target, __knownSymbol("metadata"), array[3]);
33
+ var __runInitializers = (array, flags, self, value) => {
34
+ for (var i = 0, fns = array[flags >> 1], n = fns && fns.length;i < n; i++)
35
+ flags & 1 ? fns[i].call(self) : value = fns[i].call(self, value);
36
+ return value;
37
+ };
38
+ var __decorateElement = (array, flags, name, decorators, target, extra) => {
39
+ var fn, it, done, ctx, access, k = flags & 7, s = !!(flags & 8), p = !!(flags & 16);
40
+ var j = k > 3 ? array.length + 1 : k ? s ? 1 : 2 : 0, key = __decoratorStrings[k + 5];
41
+ var initializers = k > 3 && (array[j - 1] = []), extraInitializers = array[j] || (array[j] = []);
42
+ var desc = k && (!p && !s && (target = target.prototype), k < 5 && (k > 3 || !p) && __getOwnPropDesc(k < 4 ? target : {
43
+ get [name]() {
44
+ return __privateGet(this, extra);
45
+ },
46
+ set [name](x) {
47
+ __privateSet(this, extra, x);
48
+ }
49
+ }, name));
50
+ k ? p && k < 4 && __name(extra, (k > 2 ? "set " : k > 1 ? "get " : "") + name) : __name(target, name);
51
+ for (var i = decorators.length - 1;i >= 0; i--) {
52
+ ctx = __decoratorContext(k, name, done = {}, array[3], extraInitializers);
53
+ if (k) {
54
+ ctx.static = s, ctx.private = p, access = ctx.access = { has: p ? (x) => __privateIn(target, x) : (x) => (name in x) };
55
+ if (k ^ 3)
56
+ access.get = p ? (x) => (k ^ 1 ? __privateGet : __privateMethod)(x, target, k ^ 4 ? extra : desc.get) : (x) => x[name];
57
+ if (k > 2)
58
+ access.set = p ? (x, y) => __privateSet(x, target, y, k ^ 4 ? extra : desc.set) : (x, y) => x[name] = y;
59
+ }
60
+ it = (0, decorators[i])(k ? k < 4 ? p ? extra : desc[key] : k > 4 ? undefined : { get: desc.get, set: desc.set } : target, ctx);
61
+ done._ = 1;
62
+ if (k ^ 4 || it === undefined)
63
+ __expectFn(it) && (k > 4 ? initializers.unshift(it) : k ? p ? extra = it : desc[key] = it : target = it);
64
+ else if (typeof it !== "object" || it === null)
65
+ __typeError("Object expected");
66
+ else
67
+ __expectFn(fn = it.get) && (desc.get = fn), __expectFn(fn = it.set) && (desc.set = fn), __expectFn(fn = it.init) && initializers.unshift(fn);
68
+ }
69
+ return k || __decoratorMetadata(array, target), desc && __defProp(target, name, desc), p ? k ^ 4 ? extra : desc : target;
70
+ };
71
+
72
+ // src/client/connection.ts
73
+ var WS_OPEN = 1;
74
+ var WS_CLOSED = 3;
75
+ var WS_NORMAL_CLOSURE = 1000;
76
+ var DEFAULT_MAX_RECONNECT_ATTEMPTS = 10;
77
+ var DEFAULT_PING_INTERVAL = 30000;
78
+ var RECONNECT_DELAY_MS = 500;
79
+ var noop = () => {};
80
+ var noopUnsubscribe = () => noop;
81
+ var NOOP_CONNECTION = {
82
+ close: noop,
83
+ endTurn: noop,
84
+ getReadyState: () => WS_CLOSED,
85
+ getSessionId: () => "",
86
+ send: noop,
87
+ sendAudio: noop,
88
+ subscribe: noopUnsubscribe
89
+ };
90
+ var createSessionId = () => crypto.randomUUID();
91
+ var buildWsUrl = (path, sessionId) => {
92
+ const { hostname, port, protocol } = window.location;
93
+ const wsProtocol = protocol === "https:" ? "wss:" : "ws:";
94
+ const portSuffix = port ? `:${port}` : "";
95
+ const url = new URL(`${wsProtocol}//${hostname}${portSuffix}${path}`);
96
+ url.searchParams.set("sessionId", sessionId);
97
+ return url.toString();
98
+ };
99
+ var isVoiceServerMessage = (value) => {
100
+ if (!value || typeof value !== "object" || !("type" in value)) {
101
+ return false;
102
+ }
103
+ switch (value.type) {
104
+ case "assistant":
105
+ case "complete":
106
+ case "error":
107
+ case "final":
108
+ case "partial":
109
+ case "pong":
110
+ case "session":
111
+ case "turn":
112
+ return true;
113
+ default:
114
+ return false;
115
+ }
116
+ };
117
+ var parseServerMessage = (event) => {
118
+ if (typeof event.data !== "string") {
119
+ return null;
120
+ }
121
+ try {
122
+ const parsed = JSON.parse(event.data);
123
+ return isVoiceServerMessage(parsed) ? parsed : null;
124
+ } catch {
125
+ return null;
126
+ }
127
+ };
128
+ var createVoiceConnection = (path, options = {}) => {
129
+ if (typeof window === "undefined") {
130
+ return NOOP_CONNECTION;
131
+ }
132
+ const listeners = new Set;
133
+ const shouldReconnect = options.reconnect !== false;
134
+ const maxReconnectAttempts = options.maxReconnectAttempts ?? DEFAULT_MAX_RECONNECT_ATTEMPTS;
135
+ const pingInterval = options.pingInterval ?? DEFAULT_PING_INTERVAL;
136
+ const state = {
137
+ isConnected: false,
138
+ pendingMessages: [],
139
+ pingInterval: null,
140
+ reconnectAttempts: 0,
141
+ reconnectTimeout: null,
142
+ sessionId: options.sessionId ?? createSessionId(),
143
+ ws: null
144
+ };
145
+ const clearTimers = () => {
146
+ if (state.pingInterval) {
147
+ clearInterval(state.pingInterval);
148
+ state.pingInterval = null;
149
+ }
150
+ if (state.reconnectTimeout) {
151
+ clearTimeout(state.reconnectTimeout);
152
+ state.reconnectTimeout = null;
153
+ }
154
+ };
155
+ const flushPendingMessages = () => {
156
+ if (state.ws?.readyState !== WS_OPEN) {
157
+ return;
158
+ }
159
+ while (state.pendingMessages.length > 0) {
160
+ const next = state.pendingMessages.shift();
161
+ if (next !== undefined) {
162
+ state.ws.send(next);
163
+ }
164
+ }
165
+ };
166
+ const scheduleReconnect = () => {
167
+ state.reconnectAttempts += 1;
168
+ state.reconnectTimeout = setTimeout(() => {
169
+ if (state.reconnectAttempts > maxReconnectAttempts) {
170
+ return;
171
+ }
172
+ connect();
173
+ }, RECONNECT_DELAY_MS);
174
+ };
175
+ const connect = () => {
176
+ const ws = new WebSocket(buildWsUrl(path, state.sessionId));
177
+ ws.binaryType = "arraybuffer";
178
+ ws.onopen = () => {
179
+ state.isConnected = true;
180
+ state.reconnectAttempts = 0;
181
+ flushPendingMessages();
182
+ listeners.forEach((listener) => listener({
183
+ sessionId: state.sessionId,
184
+ status: "active",
185
+ type: "session"
186
+ }));
187
+ state.pingInterval = setInterval(() => {
188
+ if (ws.readyState === WS_OPEN) {
189
+ ws.send(JSON.stringify({ type: "ping" }));
190
+ }
191
+ }, pingInterval);
192
+ };
193
+ ws.onmessage = (event) => {
194
+ const parsed = parseServerMessage(event);
195
+ if (!parsed) {
196
+ return;
197
+ }
198
+ if (parsed.type === "session") {
199
+ state.sessionId = parsed.sessionId;
200
+ }
201
+ listeners.forEach((listener) => listener(parsed));
202
+ };
203
+ ws.onclose = (event) => {
204
+ state.isConnected = false;
205
+ clearTimers();
206
+ const reconnectable = shouldReconnect && event.code !== WS_NORMAL_CLOSURE && state.reconnectAttempts < maxReconnectAttempts;
207
+ if (reconnectable) {
208
+ scheduleReconnect();
209
+ }
210
+ };
211
+ state.ws = ws;
212
+ };
213
+ const sendSerialized = (value) => {
214
+ if (state.ws?.readyState === WS_OPEN) {
215
+ state.ws.send(value);
216
+ return;
217
+ }
218
+ state.pendingMessages.push(value);
219
+ };
220
+ const send = (message) => {
221
+ sendSerialized(JSON.stringify(message));
222
+ };
223
+ const sendAudio = (audio) => {
224
+ sendSerialized(audio);
225
+ };
226
+ const endTurn = () => {
227
+ send({ type: "end_turn" });
228
+ };
229
+ const close = () => {
230
+ clearTimers();
231
+ if (state.ws) {
232
+ state.ws.close(WS_NORMAL_CLOSURE);
233
+ state.ws = null;
234
+ }
235
+ state.isConnected = false;
236
+ listeners.clear();
237
+ };
238
+ const subscribe = (callback) => {
239
+ listeners.add(callback);
240
+ return () => {
241
+ listeners.delete(callback);
242
+ };
243
+ };
244
+ connect();
245
+ return {
246
+ close,
247
+ endTurn,
248
+ getReadyState: () => state.ws?.readyState ?? WS_CLOSED,
249
+ getSessionId: () => state.sessionId,
250
+ send,
251
+ sendAudio,
252
+ subscribe
253
+ };
254
+ };
255
+ // src/client/actions.ts
256
+ var serverMessageToAction = (message) => {
257
+ switch (message.type) {
258
+ case "assistant":
259
+ return {
260
+ text: message.text,
261
+ type: "assistant"
262
+ };
263
+ case "complete":
264
+ return {
265
+ sessionId: message.sessionId,
266
+ type: "complete"
267
+ };
268
+ case "error":
269
+ return {
270
+ message: message.message,
271
+ type: "error"
272
+ };
273
+ case "final":
274
+ return {
275
+ transcript: message.transcript,
276
+ type: "final"
277
+ };
278
+ case "partial":
279
+ return {
280
+ transcript: message.transcript,
281
+ type: "partial"
282
+ };
283
+ case "session":
284
+ return {
285
+ sessionId: message.sessionId,
286
+ status: message.status,
287
+ type: "session"
288
+ };
289
+ case "turn":
290
+ return {
291
+ turn: message.turn,
292
+ type: "turn"
293
+ };
294
+ default:
295
+ return null;
296
+ }
297
+ };
298
+
299
+ // src/client/store.ts
300
+ var createInitialState = () => ({
301
+ assistantTexts: [],
302
+ error: null,
303
+ isConnected: false,
304
+ partial: "",
305
+ sessionId: null,
306
+ status: "idle",
307
+ turns: []
308
+ });
309
+ var createVoiceStreamStore = () => {
310
+ let state = createInitialState();
311
+ const subscribers = new Set;
312
+ const notify = () => {
313
+ subscribers.forEach((subscriber) => subscriber());
314
+ };
315
+ const dispatch = (action) => {
316
+ switch (action.type) {
317
+ case "assistant":
318
+ state = {
319
+ ...state,
320
+ assistantTexts: [...state.assistantTexts, action.text]
321
+ };
322
+ break;
323
+ case "complete":
324
+ state = {
325
+ ...state,
326
+ sessionId: action.sessionId,
327
+ status: "completed"
328
+ };
329
+ break;
330
+ case "connected":
331
+ state = {
332
+ ...state,
333
+ isConnected: true
334
+ };
335
+ break;
336
+ case "disconnected":
337
+ state = {
338
+ ...state,
339
+ isConnected: false
340
+ };
341
+ break;
342
+ case "error":
343
+ state = {
344
+ ...state,
345
+ error: action.message
346
+ };
347
+ break;
348
+ case "final":
349
+ state = {
350
+ ...state,
351
+ partial: "",
352
+ turns: state.turns.map((turn) => turn)
353
+ };
354
+ break;
355
+ case "partial":
356
+ state = {
357
+ ...state,
358
+ partial: action.transcript.text
359
+ };
360
+ break;
361
+ case "session":
362
+ state = {
363
+ ...state,
364
+ error: null,
365
+ sessionId: action.sessionId,
366
+ status: action.status
367
+ };
368
+ break;
369
+ case "turn":
370
+ state = {
371
+ ...state,
372
+ partial: "",
373
+ turns: [...state.turns, action.turn]
374
+ };
375
+ break;
376
+ }
377
+ notify();
378
+ };
379
+ return {
380
+ dispatch,
381
+ getServerSnapshot: () => state,
382
+ getSnapshot: () => state,
383
+ subscribe: (subscriber) => {
384
+ subscribers.add(subscriber);
385
+ return () => {
386
+ subscribers.delete(subscriber);
387
+ };
388
+ }
389
+ };
390
+ };
391
+
392
+ // src/client/createVoiceStream.ts
393
+ var createVoiceStream = (path, options = {}) => {
394
+ const connection = createVoiceConnection(path, options);
395
+ const store = createVoiceStreamStore();
396
+ const subscribers = new Set;
397
+ const notify = () => {
398
+ subscribers.forEach((subscriber) => subscriber());
399
+ };
400
+ const unsubscribeConnection = connection.subscribe((message) => {
401
+ const action = serverMessageToAction(message);
402
+ if (action) {
403
+ store.dispatch(action);
404
+ notify();
405
+ }
406
+ });
407
+ store.dispatch({ type: "connected" });
408
+ return {
409
+ close() {
410
+ unsubscribeConnection();
411
+ connection.close();
412
+ store.dispatch({ type: "disconnected" });
413
+ notify();
414
+ },
415
+ endTurn() {
416
+ connection.endTurn();
417
+ },
418
+ get error() {
419
+ return store.getSnapshot().error;
420
+ },
421
+ get isConnected() {
422
+ return store.getSnapshot().isConnected;
423
+ },
424
+ get partial() {
425
+ return store.getSnapshot().partial;
426
+ },
427
+ get sessionId() {
428
+ return connection.getSessionId();
429
+ },
430
+ get status() {
431
+ return store.getSnapshot().status;
432
+ },
433
+ get turns() {
434
+ return store.getSnapshot().turns;
435
+ },
436
+ get assistantTexts() {
437
+ return store.getSnapshot().assistantTexts;
438
+ },
439
+ sendAudio(audio) {
440
+ connection.sendAudio(audio);
441
+ },
442
+ subscribe(subscriber) {
443
+ subscribers.add(subscriber);
444
+ return () => {
445
+ subscribers.delete(subscriber);
446
+ };
447
+ }
448
+ };
449
+ };
450
+ // src/client/microphone.ts
451
+ var clampSample = (value) => Math.max(-1, Math.min(1, value));
452
+ var floatTo16BitPCM = (input) => {
453
+ const output = new Int16Array(input.length);
454
+ for (let index = 0;index < input.length; index += 1) {
455
+ const sample = clampSample(input[index] ?? 0);
456
+ output[index] = sample < 0 ? sample * 32768 : sample * 32767;
457
+ }
458
+ return new Uint8Array(output.buffer);
459
+ };
460
+ var downsampleBuffer = (input, sourceRate, targetRate) => {
461
+ if (sourceRate === targetRate) {
462
+ return input;
463
+ }
464
+ const ratio = sourceRate / targetRate;
465
+ const length = Math.round(input.length / ratio);
466
+ const output = new Float32Array(length);
467
+ let offsetResult = 0;
468
+ let offsetBuffer = 0;
469
+ while (offsetResult < output.length) {
470
+ const nextOffsetBuffer = Math.round((offsetResult + 1) * ratio);
471
+ let accum = 0;
472
+ let count = 0;
473
+ for (let index = offsetBuffer;index < nextOffsetBuffer && index < input.length; index += 1) {
474
+ accum += input[index] ?? 0;
475
+ count += 1;
476
+ }
477
+ output[offsetResult] = count > 0 ? accum / count : 0;
478
+ offsetResult += 1;
479
+ offsetBuffer = nextOffsetBuffer;
480
+ }
481
+ return output;
482
+ };
483
+ var createMicrophoneCapture = (options) => {
484
+ let audioContext = null;
485
+ let sourceNode = null;
486
+ let processorNode = null;
487
+ let mediaStream = null;
488
+ const start = async () => {
489
+ mediaStream = await navigator.mediaDevices.getUserMedia({
490
+ audio: {
491
+ channelCount: options.channelCount ?? 1
492
+ }
493
+ });
494
+ audioContext = new AudioContext;
495
+ sourceNode = audioContext.createMediaStreamSource(mediaStream);
496
+ processorNode = audioContext.createScriptProcessor(4096, 1, 1);
497
+ processorNode.onaudioprocess = (event) => {
498
+ const channel = event.inputBuffer.getChannelData(0);
499
+ const downsampled = downsampleBuffer(channel, audioContext?.sampleRate ?? 48000, options.sampleRateHz ?? 16000);
500
+ options.onAudio(floatTo16BitPCM(downsampled));
501
+ };
502
+ sourceNode.connect(processorNode);
503
+ processorNode.connect(audioContext.destination);
504
+ };
505
+ const stop = () => {
506
+ processorNode?.disconnect();
507
+ sourceNode?.disconnect();
508
+ mediaStream?.getTracks().forEach((track) => track.stop());
509
+ audioContext?.close();
510
+ audioContext = null;
511
+ mediaStream = null;
512
+ processorNode = null;
513
+ sourceNode = null;
514
+ };
515
+ return { start, stop };
516
+ };
517
+ export {
518
+ createVoiceStream,
519
+ createVoiceConnection,
520
+ createMicrophoneCapture
521
+ };