@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,496 @@
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/vue/useVoiceStream.ts
73
+ import { onUnmounted, ref, shallowRef } from "vue";
74
+
75
+ // src/client/actions.ts
76
+ var serverMessageToAction = (message) => {
77
+ switch (message.type) {
78
+ case "assistant":
79
+ return {
80
+ text: message.text,
81
+ type: "assistant"
82
+ };
83
+ case "complete":
84
+ return {
85
+ sessionId: message.sessionId,
86
+ type: "complete"
87
+ };
88
+ case "error":
89
+ return {
90
+ message: message.message,
91
+ type: "error"
92
+ };
93
+ case "final":
94
+ return {
95
+ transcript: message.transcript,
96
+ type: "final"
97
+ };
98
+ case "partial":
99
+ return {
100
+ transcript: message.transcript,
101
+ type: "partial"
102
+ };
103
+ case "session":
104
+ return {
105
+ sessionId: message.sessionId,
106
+ status: message.status,
107
+ type: "session"
108
+ };
109
+ case "turn":
110
+ return {
111
+ turn: message.turn,
112
+ type: "turn"
113
+ };
114
+ default:
115
+ return null;
116
+ }
117
+ };
118
+
119
+ // src/client/connection.ts
120
+ var WS_OPEN = 1;
121
+ var WS_CLOSED = 3;
122
+ var WS_NORMAL_CLOSURE = 1000;
123
+ var DEFAULT_MAX_RECONNECT_ATTEMPTS = 10;
124
+ var DEFAULT_PING_INTERVAL = 30000;
125
+ var RECONNECT_DELAY_MS = 500;
126
+ var noop = () => {};
127
+ var noopUnsubscribe = () => noop;
128
+ var NOOP_CONNECTION = {
129
+ close: noop,
130
+ endTurn: noop,
131
+ getReadyState: () => WS_CLOSED,
132
+ getSessionId: () => "",
133
+ send: noop,
134
+ sendAudio: noop,
135
+ subscribe: noopUnsubscribe
136
+ };
137
+ var createSessionId = () => crypto.randomUUID();
138
+ var buildWsUrl = (path, sessionId) => {
139
+ const { hostname, port, protocol } = window.location;
140
+ const wsProtocol = protocol === "https:" ? "wss:" : "ws:";
141
+ const portSuffix = port ? `:${port}` : "";
142
+ const url = new URL(`${wsProtocol}//${hostname}${portSuffix}${path}`);
143
+ url.searchParams.set("sessionId", sessionId);
144
+ return url.toString();
145
+ };
146
+ var isVoiceServerMessage = (value) => {
147
+ if (!value || typeof value !== "object" || !("type" in value)) {
148
+ return false;
149
+ }
150
+ switch (value.type) {
151
+ case "assistant":
152
+ case "complete":
153
+ case "error":
154
+ case "final":
155
+ case "partial":
156
+ case "pong":
157
+ case "session":
158
+ case "turn":
159
+ return true;
160
+ default:
161
+ return false;
162
+ }
163
+ };
164
+ var parseServerMessage = (event) => {
165
+ if (typeof event.data !== "string") {
166
+ return null;
167
+ }
168
+ try {
169
+ const parsed = JSON.parse(event.data);
170
+ return isVoiceServerMessage(parsed) ? parsed : null;
171
+ } catch {
172
+ return null;
173
+ }
174
+ };
175
+ var createVoiceConnection = (path, options = {}) => {
176
+ if (typeof window === "undefined") {
177
+ return NOOP_CONNECTION;
178
+ }
179
+ const listeners = new Set;
180
+ const shouldReconnect = options.reconnect !== false;
181
+ const maxReconnectAttempts = options.maxReconnectAttempts ?? DEFAULT_MAX_RECONNECT_ATTEMPTS;
182
+ const pingInterval = options.pingInterval ?? DEFAULT_PING_INTERVAL;
183
+ const state = {
184
+ isConnected: false,
185
+ pendingMessages: [],
186
+ pingInterval: null,
187
+ reconnectAttempts: 0,
188
+ reconnectTimeout: null,
189
+ sessionId: options.sessionId ?? createSessionId(),
190
+ ws: null
191
+ };
192
+ const clearTimers = () => {
193
+ if (state.pingInterval) {
194
+ clearInterval(state.pingInterval);
195
+ state.pingInterval = null;
196
+ }
197
+ if (state.reconnectTimeout) {
198
+ clearTimeout(state.reconnectTimeout);
199
+ state.reconnectTimeout = null;
200
+ }
201
+ };
202
+ const flushPendingMessages = () => {
203
+ if (state.ws?.readyState !== WS_OPEN) {
204
+ return;
205
+ }
206
+ while (state.pendingMessages.length > 0) {
207
+ const next = state.pendingMessages.shift();
208
+ if (next !== undefined) {
209
+ state.ws.send(next);
210
+ }
211
+ }
212
+ };
213
+ const scheduleReconnect = () => {
214
+ state.reconnectAttempts += 1;
215
+ state.reconnectTimeout = setTimeout(() => {
216
+ if (state.reconnectAttempts > maxReconnectAttempts) {
217
+ return;
218
+ }
219
+ connect();
220
+ }, RECONNECT_DELAY_MS);
221
+ };
222
+ const connect = () => {
223
+ const ws = new WebSocket(buildWsUrl(path, state.sessionId));
224
+ ws.binaryType = "arraybuffer";
225
+ ws.onopen = () => {
226
+ state.isConnected = true;
227
+ state.reconnectAttempts = 0;
228
+ flushPendingMessages();
229
+ listeners.forEach((listener) => listener({
230
+ sessionId: state.sessionId,
231
+ status: "active",
232
+ type: "session"
233
+ }));
234
+ state.pingInterval = setInterval(() => {
235
+ if (ws.readyState === WS_OPEN) {
236
+ ws.send(JSON.stringify({ type: "ping" }));
237
+ }
238
+ }, pingInterval);
239
+ };
240
+ ws.onmessage = (event) => {
241
+ const parsed = parseServerMessage(event);
242
+ if (!parsed) {
243
+ return;
244
+ }
245
+ if (parsed.type === "session") {
246
+ state.sessionId = parsed.sessionId;
247
+ }
248
+ listeners.forEach((listener) => listener(parsed));
249
+ };
250
+ ws.onclose = (event) => {
251
+ state.isConnected = false;
252
+ clearTimers();
253
+ const reconnectable = shouldReconnect && event.code !== WS_NORMAL_CLOSURE && state.reconnectAttempts < maxReconnectAttempts;
254
+ if (reconnectable) {
255
+ scheduleReconnect();
256
+ }
257
+ };
258
+ state.ws = ws;
259
+ };
260
+ const sendSerialized = (value) => {
261
+ if (state.ws?.readyState === WS_OPEN) {
262
+ state.ws.send(value);
263
+ return;
264
+ }
265
+ state.pendingMessages.push(value);
266
+ };
267
+ const send = (message) => {
268
+ sendSerialized(JSON.stringify(message));
269
+ };
270
+ const sendAudio = (audio) => {
271
+ sendSerialized(audio);
272
+ };
273
+ const endTurn = () => {
274
+ send({ type: "end_turn" });
275
+ };
276
+ const close = () => {
277
+ clearTimers();
278
+ if (state.ws) {
279
+ state.ws.close(WS_NORMAL_CLOSURE);
280
+ state.ws = null;
281
+ }
282
+ state.isConnected = false;
283
+ listeners.clear();
284
+ };
285
+ const subscribe = (callback) => {
286
+ listeners.add(callback);
287
+ return () => {
288
+ listeners.delete(callback);
289
+ };
290
+ };
291
+ connect();
292
+ return {
293
+ close,
294
+ endTurn,
295
+ getReadyState: () => state.ws?.readyState ?? WS_CLOSED,
296
+ getSessionId: () => state.sessionId,
297
+ send,
298
+ sendAudio,
299
+ subscribe
300
+ };
301
+ };
302
+
303
+ // src/client/store.ts
304
+ var createInitialState = () => ({
305
+ assistantTexts: [],
306
+ error: null,
307
+ isConnected: false,
308
+ partial: "",
309
+ sessionId: null,
310
+ status: "idle",
311
+ turns: []
312
+ });
313
+ var createVoiceStreamStore = () => {
314
+ let state = createInitialState();
315
+ const subscribers = new Set;
316
+ const notify = () => {
317
+ subscribers.forEach((subscriber) => subscriber());
318
+ };
319
+ const dispatch = (action) => {
320
+ switch (action.type) {
321
+ case "assistant":
322
+ state = {
323
+ ...state,
324
+ assistantTexts: [...state.assistantTexts, action.text]
325
+ };
326
+ break;
327
+ case "complete":
328
+ state = {
329
+ ...state,
330
+ sessionId: action.sessionId,
331
+ status: "completed"
332
+ };
333
+ break;
334
+ case "connected":
335
+ state = {
336
+ ...state,
337
+ isConnected: true
338
+ };
339
+ break;
340
+ case "disconnected":
341
+ state = {
342
+ ...state,
343
+ isConnected: false
344
+ };
345
+ break;
346
+ case "error":
347
+ state = {
348
+ ...state,
349
+ error: action.message
350
+ };
351
+ break;
352
+ case "final":
353
+ state = {
354
+ ...state,
355
+ partial: "",
356
+ turns: state.turns.map((turn) => turn)
357
+ };
358
+ break;
359
+ case "partial":
360
+ state = {
361
+ ...state,
362
+ partial: action.transcript.text
363
+ };
364
+ break;
365
+ case "session":
366
+ state = {
367
+ ...state,
368
+ error: null,
369
+ sessionId: action.sessionId,
370
+ status: action.status
371
+ };
372
+ break;
373
+ case "turn":
374
+ state = {
375
+ ...state,
376
+ partial: "",
377
+ turns: [...state.turns, action.turn]
378
+ };
379
+ break;
380
+ }
381
+ notify();
382
+ };
383
+ return {
384
+ dispatch,
385
+ getServerSnapshot: () => state,
386
+ getSnapshot: () => state,
387
+ subscribe: (subscriber) => {
388
+ subscribers.add(subscriber);
389
+ return () => {
390
+ subscribers.delete(subscriber);
391
+ };
392
+ }
393
+ };
394
+ };
395
+
396
+ // src/client/createVoiceStream.ts
397
+ var createVoiceStream = (path, options = {}) => {
398
+ const connection = createVoiceConnection(path, options);
399
+ const store = createVoiceStreamStore();
400
+ const subscribers = new Set;
401
+ const notify = () => {
402
+ subscribers.forEach((subscriber) => subscriber());
403
+ };
404
+ const unsubscribeConnection = connection.subscribe((message) => {
405
+ const action = serverMessageToAction(message);
406
+ if (action) {
407
+ store.dispatch(action);
408
+ notify();
409
+ }
410
+ });
411
+ store.dispatch({ type: "connected" });
412
+ return {
413
+ close() {
414
+ unsubscribeConnection();
415
+ connection.close();
416
+ store.dispatch({ type: "disconnected" });
417
+ notify();
418
+ },
419
+ endTurn() {
420
+ connection.endTurn();
421
+ },
422
+ get error() {
423
+ return store.getSnapshot().error;
424
+ },
425
+ get isConnected() {
426
+ return store.getSnapshot().isConnected;
427
+ },
428
+ get partial() {
429
+ return store.getSnapshot().partial;
430
+ },
431
+ get sessionId() {
432
+ return connection.getSessionId();
433
+ },
434
+ get status() {
435
+ return store.getSnapshot().status;
436
+ },
437
+ get turns() {
438
+ return store.getSnapshot().turns;
439
+ },
440
+ get assistantTexts() {
441
+ return store.getSnapshot().assistantTexts;
442
+ },
443
+ sendAudio(audio) {
444
+ connection.sendAudio(audio);
445
+ },
446
+ subscribe(subscriber) {
447
+ subscribers.add(subscriber);
448
+ return () => {
449
+ subscribers.delete(subscriber);
450
+ };
451
+ }
452
+ };
453
+ };
454
+
455
+ // src/vue/useVoiceStream.ts
456
+ var useVoiceStream = (path, options = {}) => {
457
+ const stream = createVoiceStream(path, options);
458
+ const assistantTexts = shallowRef([]);
459
+ const error = ref(null);
460
+ const isConnected = ref(false);
461
+ const partial = ref("");
462
+ const sessionId = ref(stream.sessionId);
463
+ const status = ref(stream.status);
464
+ const turns = shallowRef([]);
465
+ const sync = () => {
466
+ assistantTexts.value = [...stream.assistantTexts];
467
+ error.value = stream.error;
468
+ isConnected.value = stream.isConnected;
469
+ partial.value = stream.partial;
470
+ sessionId.value = stream.sessionId;
471
+ status.value = stream.status;
472
+ turns.value = [...stream.turns];
473
+ };
474
+ const unsubscribe = stream.subscribe(sync);
475
+ sync();
476
+ const destroy = () => {
477
+ unsubscribe();
478
+ stream.close();
479
+ };
480
+ onUnmounted(destroy);
481
+ return {
482
+ assistantTexts,
483
+ close: () => destroy(),
484
+ endTurn: () => stream.endTurn(),
485
+ error,
486
+ isConnected,
487
+ partial,
488
+ sendAudio: (audio) => stream.sendAudio(audio),
489
+ sessionId,
490
+ status,
491
+ turns
492
+ };
493
+ };
494
+ export {
495
+ useVoiceStream
496
+ };
package/package.json ADDED
@@ -0,0 +1,100 @@
1
+ {
2
+ "name": "@absolutejs/voice",
3
+ "version": "0.0.1",
4
+ "description": "Voice primitives and Elysia plugin for AbsoluteJS",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/absolutejs/voice.git"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "README.md"
12
+ ],
13
+ "main": "./dist/index.js",
14
+ "types": "./dist/src/index.d.ts",
15
+ "license": "CC BY-NC 4.0",
16
+ "author": "Alex Kahn",
17
+ "scripts": {
18
+ "build": "rm -rf dist && bun build ./src/index.ts ./src/client/index.ts ./src/react/index.ts ./src/vue/index.ts ./src/svelte/index.ts ./src/angular/index.ts --outdir dist --target bun --external elysia --external react --external vue --external @angular/core --external @absolutejs/absolute && tsc --emitDeclarationOnly --project tsconfig.json",
19
+ "format": "prettier --write \"./**/*.{js,jsx,ts,tsx,json,md}\"",
20
+ "lint": "eslint ./src",
21
+ "release": "bun run format && bun run build && bun publish",
22
+ "test": "echo \"Error: no test specified\" && exit 1",
23
+ "typecheck": "bun run tsc --noEmit"
24
+ },
25
+ "exports": {
26
+ ".": {
27
+ "import": "./dist/index.js",
28
+ "types": "./dist/src/index.d.ts"
29
+ },
30
+ "./client": {
31
+ "browser": "./dist/client/index.js",
32
+ "import": "./dist/client/index.js",
33
+ "types": "./dist/src/client/index.d.ts"
34
+ },
35
+ "./react": {
36
+ "browser": "./dist/react/index.js",
37
+ "import": "./dist/react/index.js",
38
+ "types": "./dist/src/react/index.d.ts"
39
+ },
40
+ "./vue": {
41
+ "browser": "./dist/vue/index.js",
42
+ "import": "./dist/vue/index.js",
43
+ "types": "./dist/src/vue/index.d.ts"
44
+ },
45
+ "./svelte": {
46
+ "import": "./dist/svelte/index.js",
47
+ "types": "./dist/src/svelte/index.d.ts"
48
+ },
49
+ "./angular": {
50
+ "import": "./dist/angular/index.js",
51
+ "types": "./dist/src/angular/index.d.ts"
52
+ }
53
+ },
54
+ "typesVersions": {
55
+ "*": {
56
+ "client": [
57
+ "dist/src/client/index.d.ts"
58
+ ],
59
+ "react": [
60
+ "dist/src/react/index.d.ts"
61
+ ],
62
+ "svelte": [
63
+ "dist/src/svelte/index.d.ts"
64
+ ],
65
+ "vue": [
66
+ "dist/src/vue/index.d.ts"
67
+ ],
68
+ "angular": [
69
+ "dist/src/angular/index.d.ts"
70
+ ]
71
+ }
72
+ },
73
+ "peerDependencies": {
74
+ "@absolutejs/absolute": ">=0.19.0-beta.646",
75
+ "@angular/core": ">=21.0.0",
76
+ "elysia": ">=1.4.18",
77
+ "react": ">=19.0.0",
78
+ "vue": ">=3.5.0"
79
+ },
80
+ "peerDependenciesMeta": {
81
+ "@angular/core": {
82
+ "optional": true
83
+ },
84
+ "react": {
85
+ "optional": true
86
+ },
87
+ "vue": {
88
+ "optional": true
89
+ }
90
+ },
91
+ "devDependencies": {
92
+ "@angular/core": "^21.0.0",
93
+ "@types/bun": "1.3.9",
94
+ "@types/react": "19.2.0",
95
+ "elysia": "1.4.18",
96
+ "react": "19.2.1",
97
+ "typescript": "^5.9.3",
98
+ "vue": "3.5.27"
99
+ }
100
+ }