@sdata/web-vue 3.22.3 → 3.24.0

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 (131) hide show
  1. package/dist/sd.css +128 -0
  2. package/dist/sd.min.css +1 -1
  3. package/es/components.d.ts +14 -0
  4. package/es/index.css +128 -0
  5. package/es/index.d.ts +4 -2
  6. package/es/index.js +17 -1
  7. package/es/index.scss +1 -0
  8. package/es/model-selector/assets/logos/aihubmix.js +4 -0
  9. package/es/model-selector/assets/logos/alibaba-cn.js +4 -0
  10. package/es/model-selector/assets/logos/alibaba.js +4 -0
  11. package/es/model-selector/assets/logos/amazon-bedrock.js +4 -0
  12. package/es/model-selector/assets/logos/anthropic.js +4 -0
  13. package/es/model-selector/assets/logos/azure.js +4 -0
  14. package/es/model-selector/assets/logos/baseten.js +4 -0
  15. package/es/model-selector/assets/logos/cerebras.js +4 -0
  16. package/es/model-selector/assets/logos/chutes.js +4 -0
  17. package/es/model-selector/assets/logos/cloudflare-workers-ai.js +4 -0
  18. package/es/model-selector/assets/logos/cortecs.js +4 -0
  19. package/es/model-selector/assets/logos/deepinfra.js +4 -0
  20. package/es/model-selector/assets/logos/deepseek.js +4 -0
  21. package/es/model-selector/assets/logos/default.js +4 -0
  22. package/es/model-selector/assets/logos/fastrouter.js +4 -0
  23. package/es/model-selector/assets/logos/fireworks-ai.js +4 -0
  24. package/es/model-selector/assets/logos/github-copilot.js +4 -0
  25. package/es/model-selector/assets/logos/github-models.js +4 -0
  26. package/es/model-selector/assets/logos/google-vertex-anthropic.js +4 -0
  27. package/es/model-selector/assets/logos/google-vertex.js +4 -0
  28. package/es/model-selector/assets/logos/google.js +4 -0
  29. package/es/model-selector/assets/logos/groq.js +4 -0
  30. package/es/model-selector/assets/logos/huggingface.js +4 -0
  31. package/es/model-selector/assets/logos/iflowcn.js +4 -0
  32. package/es/model-selector/assets/logos/inception.js +4 -0
  33. package/es/model-selector/assets/logos/inference.js +4 -0
  34. package/es/model-selector/assets/logos/llama.js +4 -0
  35. package/es/model-selector/assets/logos/lucidquery.js +4 -0
  36. package/es/model-selector/assets/logos/mistral.js +4 -0
  37. package/es/model-selector/assets/logos/modelscope.js +4 -0
  38. package/es/model-selector/assets/logos/moonshotai-cn.js +4 -0
  39. package/es/model-selector/assets/logos/moonshotai.js +4 -0
  40. package/es/model-selector/assets/logos/nebius.js +4 -0
  41. package/es/model-selector/assets/logos/nvidia.js +4 -0
  42. package/es/model-selector/assets/logos/openai.js +4 -0
  43. package/es/model-selector/assets/logos/opencode.js +4 -0
  44. package/es/model-selector/assets/logos/openrouter.js +4 -0
  45. package/es/model-selector/assets/logos/perplexity.js +4 -0
  46. package/es/model-selector/assets/logos/scaleway.js +4 -0
  47. package/es/model-selector/assets/logos/submodel.js +4 -0
  48. package/es/model-selector/assets/logos/togetherai.js +4 -0
  49. package/es/model-selector/assets/logos/upstage.js +4 -0
  50. package/es/model-selector/assets/logos/v0.js +4 -0
  51. package/es/model-selector/assets/logos/venice.js +4 -0
  52. package/es/model-selector/assets/logos/vercel.js +4 -0
  53. package/es/model-selector/assets/logos/vultr.js +4 -0
  54. package/es/model-selector/assets/logos/xai.js +4 -0
  55. package/es/model-selector/assets/logos/zai-coding-plan.js +4 -0
  56. package/es/model-selector/assets/logos/zai.js +4 -0
  57. package/es/model-selector/assets/logos/zenmux.js +4 -0
  58. package/es/model-selector/assets/logos/zhipuai-coding-plan.js +4 -0
  59. package/es/model-selector/assets/logos/zhipuai.js +4 -0
  60. package/es/model-selector/context.d.ts +25 -0
  61. package/es/model-selector/context.js +5 -0
  62. package/es/model-selector/index.d.ts +436 -0
  63. package/es/model-selector/index.js +57 -0
  64. package/es/model-selector/model-selector-content.js +5 -0
  65. package/es/model-selector/model-selector-content.vue.d.ts +21 -0
  66. package/es/model-selector/model-selector-content.vue_vue_type_script_setup_true_lang.js +65 -0
  67. package/es/model-selector/model-selector-dialog.js +5 -0
  68. package/es/model-selector/model-selector-dialog.vue.d.ts +36 -0
  69. package/es/model-selector/model-selector-dialog.vue_vue_type_script_setup_true_lang.js +98 -0
  70. package/es/model-selector/model-selector-empty.js +5 -0
  71. package/es/model-selector/model-selector-empty.vue.d.ts +13 -0
  72. package/es/model-selector/model-selector-empty.vue_vue_type_script_setup_true_lang.js +25 -0
  73. package/es/model-selector/model-selector-group.js +5 -0
  74. package/es/model-selector/model-selector-group.vue.d.ts +18 -0
  75. package/es/model-selector/model-selector-group.vue_vue_type_script_setup_true_lang.js +32 -0
  76. package/es/model-selector/model-selector-input.js +5 -0
  77. package/es/model-selector/model-selector-input.vue.d.ts +11 -0
  78. package/es/model-selector/model-selector-input.vue_vue_type_script_setup_true_lang.js +80 -0
  79. package/es/model-selector/model-selector-item.js +5 -0
  80. package/es/model-selector/model-selector-item.vue.d.ts +35 -0
  81. package/es/model-selector/model-selector-item.vue_vue_type_script_setup_true_lang.js +101 -0
  82. package/es/model-selector/model-selector-list.js +5 -0
  83. package/es/model-selector/model-selector-list.vue.d.ts +13 -0
  84. package/es/model-selector/model-selector-list.vue_vue_type_script_setup_true_lang.js +36 -0
  85. package/es/model-selector/model-selector-logo-group.js +5 -0
  86. package/es/model-selector/model-selector-logo-group.vue.d.ts +13 -0
  87. package/es/model-selector/model-selector-logo-group.vue_vue_type_script_setup_true_lang.js +15 -0
  88. package/es/model-selector/model-selector-logo.js +5 -0
  89. package/es/model-selector/model-selector-logo.vue.d.ts +10 -0
  90. package/es/model-selector/model-selector-logo.vue_vue_type_script_setup_true_lang.js +146 -0
  91. package/es/model-selector/model-selector-name.js +5 -0
  92. package/es/model-selector/model-selector-name.vue.d.ts +13 -0
  93. package/es/model-selector/model-selector-name.vue_vue_type_script_setup_true_lang.js +15 -0
  94. package/es/model-selector/model-selector-separator.js +5 -0
  95. package/es/model-selector/model-selector-separator.vue.d.ts +3 -0
  96. package/es/model-selector/model-selector-separator.vue_vue_type_script_setup_true_lang.js +16 -0
  97. package/es/model-selector/model-selector-shortcut.js +5 -0
  98. package/es/model-selector/model-selector-shortcut.vue.d.ts +13 -0
  99. package/es/model-selector/model-selector-shortcut.vue_vue_type_script_setup_true_lang.js +15 -0
  100. package/es/model-selector/model-selector-trigger.js +5 -0
  101. package/es/model-selector/model-selector-trigger.vue.d.ts +20 -0
  102. package/es/model-selector/model-selector-trigger.vue_vue_type_script_setup_true_lang.js +39 -0
  103. package/es/model-selector/model-selector.js +5 -0
  104. package/es/model-selector/model-selector.vue.d.ts +34 -0
  105. package/es/model-selector/model-selector.vue_vue_type_script_setup_true_lang.js +179 -0
  106. package/es/model-selector/style/css.js +2 -0
  107. package/es/model-selector/style/index.css +144 -0
  108. package/es/model-selector/style/index.d.ts +2 -0
  109. package/es/model-selector/style/index.js +2 -0
  110. package/es/model-selector/style/index.scss +157 -0
  111. package/es/model-selector/style/token.scss +24 -0
  112. package/es/model-selector/types.d.ts +16 -0
  113. package/es/model-selector/types.js +61 -0
  114. package/es/model-selector/use-model-selector-context.d.ts +1 -0
  115. package/es/model-selector/use-model-selector-context.js +10 -0
  116. package/es/rich-text-editor/rich-text-editor.vue_vue_type_script_setup_true_lang.js +16 -18
  117. package/es/sd-vue.js +2 -0
  118. package/es/sender/index.d.ts +3 -1
  119. package/es/sender/index.js +2 -1
  120. package/es/sender/recorder-core.d.ts +25 -0
  121. package/es/sender/recorder-core.js +26 -0
  122. package/es/sender/sender.vue_vue_type_script_setup_true_lang.js +16 -18
  123. package/es/sender/types.d.ts +8 -60
  124. package/es/sender/use-recorder.d.ts +16 -0
  125. package/es/sender/use-recorder.js +117 -0
  126. package/json/vetur-attributes.json +96 -1
  127. package/json/vetur-tags.json +75 -0
  128. package/json/web-types.json +291 -2
  129. package/package.json +2 -1
  130. package/es/sender/use-speech.d.ts +0 -19
  131. package/es/sender/use-speech.js +0 -381
@@ -1,381 +0,0 @@
1
- import _objectSpread2 from "../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/objectSpread2.js";
2
- import { useI18n } from "../locale/index.js";
3
- import _asyncToGenerator from "../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/asyncToGenerator.js";
4
- import { computed, onBeforeUnmount, onMounted, shallowRef, toValue, watch } from "vue";
5
- //#region components/sender/use-speech.ts
6
- var DEFAULT_PROCESSOR_NAME = "sd-sender-audio-processor";
7
- var DEFAULT_BUFFER_SIZE = 4096;
8
- var resolveBufferSize = (value) => typeof value === "number" && Number.isFinite(value) ? Math.max(128, Math.floor(value)) : DEFAULT_BUFFER_SIZE;
9
- var WORKLET_SOURCE = `
10
- class SdSenderAudioProcessor extends AudioWorkletProcessor {
11
- constructor(options) {
12
- super();
13
- this.bufferSize = Math.max(128, options.processorOptions?.bufferSize || ${DEFAULT_BUFFER_SIZE});
14
- this.buffer = new Float32Array(this.bufferSize);
15
- this.offset = 0;
16
- this.stopped = false;
17
- this.port.onmessage = (event) => {
18
- if (event.data?.type !== 'flush') return;
19
- if (this.offset > 0) {
20
- const chunk = this.buffer.slice(0, this.offset);
21
- this.port.postMessage(chunk.buffer, [chunk.buffer]);
22
- this.offset = 0;
23
- }
24
- this.stopped = true;
25
- this.port.postMessage({ type: 'flushed' });
26
- };
27
- }
28
-
29
- process(inputs) {
30
- if (this.stopped) return false;
31
- const channels = inputs[0];
32
- if (!channels?.length) return true;
33
- const frames = channels[0].length;
34
- for (let frame = 0; frame < frames; frame += 1) {
35
- let sample = 0;
36
- for (let channel = 0; channel < channels.length; channel += 1) {
37
- sample += channels[channel][frame] || 0;
38
- }
39
- this.buffer[this.offset] = sample / channels.length;
40
- this.offset += 1;
41
- if (this.offset === this.bufferSize) {
42
- const chunk = this.buffer;
43
- this.port.postMessage(chunk.buffer, [chunk.buffer]);
44
- this.buffer = new Float32Array(this.bufferSize);
45
- this.offset = 0;
46
- }
47
- }
48
- return true;
49
- }
50
- }
51
- registerProcessor('${DEFAULT_PROCESSOR_NAME}', SdSenderAudioProcessor);
52
- `;
53
- var isPermissionDeniedError = (error) => error instanceof DOMException ? error.name === "NotAllowedError" || error.name === "SecurityError" : error instanceof Error && (error.name === "NotAllowedError" || error.name === "SecurityError");
54
- function useSpeech(allowSpeech, options) {
55
- const { t } = useI18n();
56
- const config = computed(() => toValue(allowSpeech));
57
- const controlled = computed(() => typeof config.value === "object" && typeof config.value.recording === "boolean" && typeof config.value.onRecordingChange === "function");
58
- const supported = shallowRef(false);
59
- const internalRecording = shallowRef(false);
60
- const requesting = shallowRef(false);
61
- const stopping = shallowRef(false);
62
- const captureError = shallowRef();
63
- const stream = shallowRef();
64
- const audioContext = shallowRef();
65
- const sourceNode = shallowRef();
66
- const workletNode = shallowRef();
67
- const socket = shallowRef();
68
- const startedAt = shallowRef(0);
69
- const chunks = shallowRef(0);
70
- const sequence = shallowRef(0);
71
- let generatedWorkletUrl;
72
- let resolveWorkletStop;
73
- let workletStopRequested = false;
74
- let workletReady = false;
75
- let disposed = false;
76
- const recording = computed(() => controlled.value && typeof config.value === "object" ? Boolean(config.value.recording) : internalRecording.value);
77
- const available = computed(() => Boolean(config.value) && (controlled.value || supported.value) && !(captureError.value && isPermissionDeniedError(captureError.value.error)));
78
- const statusText = computed(() => {
79
- var _captureError$value;
80
- if (requesting.value) return t("sender.speech.requestingPermission");
81
- if (captureError.value && isPermissionDeniedError(captureError.value.error)) return t("sender.speech.permissionDenied");
82
- if (!controlled.value && !supported.value) return t("sender.speech.unsupported");
83
- if (recording.value) return t("sender.speech.stop");
84
- if (((_captureError$value = captureError.value) === null || _captureError$value === void 0 ? void 0 : _captureError$value.error.name) === "NotFoundError") return t("sender.speech.noMicrophone");
85
- if (captureError.value) return t("sender.speech.microphoneUnavailable");
86
- return t("sender.speech.start");
87
- });
88
- const resolveAudioContext = () => {
89
- var _window$AudioContext;
90
- const AudioContextConstructor = (_window$AudioContext = window.AudioContext) !== null && _window$AudioContext !== void 0 ? _window$AudioContext : window.webkitAudioContext;
91
- if (!AudioContextConstructor) throw new Error("AudioContext is not supported");
92
- return new AudioContextConstructor();
93
- };
94
- const resolveWorkletUrl = () => {
95
- var _generatedWorkletUrl;
96
- if (typeof config.value === "object" && config.value.workletUrl) return config.value.workletUrl;
97
- (_generatedWorkletUrl = generatedWorkletUrl) !== null && _generatedWorkletUrl !== void 0 || (generatedWorkletUrl = URL.createObjectURL(new Blob([WORKLET_SOURCE], { type: "text/javascript" })));
98
- return generatedWorkletUrl;
99
- };
100
- const connectTransport = (url, protocols) => new Promise((resolve, reject) => {
101
- const nextSocket = protocols ? new WebSocket(url, protocols) : new WebSocket(url);
102
- let opened = false;
103
- socket.value = nextSocket;
104
- nextSocket.binaryType = "arraybuffer";
105
- nextSocket.onopen = (event) => {
106
- opened = true;
107
- options.onTransportOpen({
108
- event,
109
- socket: nextSocket
110
- });
111
- resolve(nextSocket);
112
- };
113
- nextSocket.onmessage = (event) => options.onTransportMessage({
114
- event,
115
- socket: nextSocket
116
- });
117
- nextSocket.onclose = (event) => options.onTransportClose({
118
- event,
119
- socket: nextSocket
120
- });
121
- nextSocket.onerror = () => {
122
- const errorEvent = {
123
- error: /* @__PURE__ */ new Error(`Unable to connect to speech URL: ${url}`),
124
- phase: "transport"
125
- };
126
- if (opened) options.onError(errorEvent);
127
- else reject(errorEvent.error);
128
- };
129
- });
130
- const stopWorklet = () => new Promise((resolve) => {
131
- var _workletNode$value;
132
- const port = (_workletNode$value = workletNode.value) === null || _workletNode$value === void 0 ? void 0 : _workletNode$value.port;
133
- if (!port || workletStopRequested) {
134
- resolve();
135
- return;
136
- }
137
- workletStopRequested = true;
138
- let settled = false;
139
- const finish = () => {
140
- if (settled) return;
141
- settled = true;
142
- window.clearTimeout(timeout);
143
- resolveWorkletStop = void 0;
144
- resolve();
145
- };
146
- const timeout = window.setTimeout(finish, 100);
147
- resolveWorkletStop = finish;
148
- port.postMessage({ type: "flush" });
149
- });
150
- const releaseResources = function() {
151
- var _ref = _asyncToGenerator(function* () {
152
- var _sourceNode$value, _stream$value, _audioContext$value;
153
- const currentWorkletNode = workletNode.value;
154
- yield stopWorklet();
155
- if (currentWorkletNode) {
156
- currentWorkletNode.port.onmessage = null;
157
- currentWorkletNode.port.close();
158
- currentWorkletNode.disconnect();
159
- }
160
- (_sourceNode$value = sourceNode.value) === null || _sourceNode$value === void 0 || _sourceNode$value.disconnect();
161
- (_stream$value = stream.value) === null || _stream$value === void 0 || _stream$value.getTracks().forEach((track) => track.stop());
162
- if (((_audioContext$value = audioContext.value) === null || _audioContext$value === void 0 ? void 0 : _audioContext$value.state) === "running") yield audioContext.value.suspend();
163
- if (socket.value && (socket.value.readyState === WebSocket.OPEN || socket.value.readyState === WebSocket.CONNECTING)) socket.value.close(1e3, "speech-ended");
164
- workletNode.value = void 0;
165
- sourceNode.value = void 0;
166
- stream.value = void 0;
167
- socket.value = void 0;
168
- });
169
- return function releaseResources() {
170
- return _ref.apply(this, arguments);
171
- };
172
- }();
173
- const closeAudioContext = function() {
174
- var _ref2 = _asyncToGenerator(function* () {
175
- if (audioContext.value && audioContext.value.state !== "closed") yield audioContext.value.close();
176
- audioContext.value = void 0;
177
- workletReady = false;
178
- });
179
- return function closeAudioContext() {
180
- return _ref2.apply(this, arguments);
181
- };
182
- }();
183
- const stopCapture = function() {
184
- var _ref3 = _asyncToGenerator(function* (reason = "manual") {
185
- if (!internalRecording.value || stopping.value) return;
186
- stopping.value = true;
187
- try {
188
- var _socket$value, _config$value$onRecor, _config$value;
189
- yield stopWorklet();
190
- const endedAt = performance.now();
191
- internalRecording.value = false;
192
- if (((_socket$value = socket.value) === null || _socket$value === void 0 ? void 0 : _socket$value.readyState) === WebSocket.OPEN && typeof config.value === "object" && config.value.sendMetadata !== false) socket.value.send(JSON.stringify({
193
- type: "end",
194
- reason
195
- }));
196
- yield releaseResources();
197
- if (typeof config.value === "object") (_config$value$onRecor = (_config$value = config.value).onRecordingChange) === null || _config$value$onRecor === void 0 || _config$value$onRecor.call(_config$value, false);
198
- options.onEnd({
199
- source: "capture",
200
- reason,
201
- startedAt: startedAt.value,
202
- endedAt,
203
- duration: endedAt - startedAt.value,
204
- chunks: chunks.value
205
- });
206
- } finally {
207
- stopping.value = false;
208
- }
209
- });
210
- return function stopCapture() {
211
- return _ref3.apply(this, arguments);
212
- };
213
- }();
214
- const startCapture = function() {
215
- var _ref4 = _asyncToGenerator(function* () {
216
- if (requesting.value || stopping.value || internalRecording.value || !available.value) return;
217
- requesting.value = true;
218
- captureError.value = void 0;
219
- let phase = "permission";
220
- try {
221
- var _speechConfig$audioCo, _speechConfig$process, _socket$value3, _speechConfig$onRecor;
222
- const speechConfig = typeof config.value === "object" ? config.value : void 0;
223
- const bufferSize = resolveBufferSize(speechConfig === null || speechConfig === void 0 ? void 0 : speechConfig.bufferSize);
224
- stream.value = yield navigator.mediaDevices.getUserMedia({
225
- audio: (_speechConfig$audioCo = speechConfig === null || speechConfig === void 0 ? void 0 : speechConfig.audioConstraints) !== null && _speechConfig$audioCo !== void 0 ? _speechConfig$audioCo : true,
226
- video: false
227
- });
228
- if (disposed) {
229
- yield releaseResources();
230
- return;
231
- }
232
- if (speechConfig === null || speechConfig === void 0 ? void 0 : speechConfig.url) {
233
- phase = "transport";
234
- yield connectTransport(speechConfig.url, speechConfig.protocols);
235
- if (disposed) {
236
- yield releaseResources();
237
- return;
238
- }
239
- }
240
- phase = "audioContext";
241
- let nextAudioContext = audioContext.value;
242
- if (!nextAudioContext) {
243
- nextAudioContext = resolveAudioContext();
244
- audioContext.value = nextAudioContext;
245
- workletReady = false;
246
- }
247
- if (nextAudioContext.state === "suspended") yield nextAudioContext.resume();
248
- phase = "audioWorklet";
249
- if (!workletReady) {
250
- yield nextAudioContext.audioWorklet.addModule(resolveWorkletUrl());
251
- workletReady = true;
252
- }
253
- if (disposed) {
254
- yield releaseResources();
255
- return;
256
- }
257
- const processorName = (_speechConfig$process = speechConfig === null || speechConfig === void 0 ? void 0 : speechConfig.processorName) !== null && _speechConfig$process !== void 0 ? _speechConfig$process : DEFAULT_PROCESSOR_NAME;
258
- const nextWorkletNode = new AudioWorkletNode(nextAudioContext, processorName, {
259
- numberOfInputs: 1,
260
- numberOfOutputs: 0,
261
- channelCount: 1,
262
- processorOptions: _objectSpread2(_objectSpread2({}, speechConfig === null || speechConfig === void 0 ? void 0 : speechConfig.processorOptions), {}, { bufferSize })
263
- });
264
- workletStopRequested = false;
265
- workletNode.value = nextWorkletNode;
266
- sourceNode.value = nextAudioContext.createMediaStreamSource(stream.value);
267
- nextWorkletNode.port.onmessage = (event) => {
268
- var _socket$value2;
269
- if (!(event.data instanceof ArrayBuffer) && "type" in event.data) {
270
- if (event.data.type === "flushed") resolveWorkletStop === null || resolveWorkletStop === void 0 || resolveWorkletStop();
271
- return;
272
- }
273
- if (!internalRecording.value) return;
274
- const buffer = event.data;
275
- const dataEvent = {
276
- buffer,
277
- sampleRate: nextAudioContext.sampleRate,
278
- sequence: sequence.value,
279
- timestamp: performance.now()
280
- };
281
- sequence.value += 1;
282
- chunks.value += 1;
283
- options.onData(dataEvent);
284
- if (((_socket$value2 = socket.value) === null || _socket$value2 === void 0 ? void 0 : _socket$value2.readyState) === WebSocket.OPEN) socket.value.send(buffer);
285
- };
286
- sourceNode.value.connect(nextWorkletNode);
287
- startedAt.value = performance.now();
288
- chunks.value = 0;
289
- sequence.value = 0;
290
- internalRecording.value = true;
291
- if (((_socket$value3 = socket.value) === null || _socket$value3 === void 0 ? void 0 : _socket$value3.readyState) === WebSocket.OPEN && (speechConfig === null || speechConfig === void 0 ? void 0 : speechConfig.sendMetadata) !== false) socket.value.send(JSON.stringify({
292
- type: "start",
293
- format: "pcm-f32",
294
- channels: 1,
295
- sampleRate: nextAudioContext.sampleRate,
296
- bufferSize
297
- }));
298
- speechConfig === null || speechConfig === void 0 || (_speechConfig$onRecor = speechConfig.onRecordingChange) === null || _speechConfig$onRecor === void 0 || _speechConfig$onRecor.call(speechConfig, true);
299
- options.onStart({
300
- source: "capture",
301
- startedAt: startedAt.value,
302
- stream: stream.value,
303
- audioContext: nextAudioContext,
304
- sampleRate: nextAudioContext.sampleRate
305
- });
306
- } catch (error) {
307
- const errorEvent = {
308
- error: error instanceof Error ? error : new Error(String(error)),
309
- phase
310
- };
311
- captureError.value = errorEvent;
312
- options.onError(errorEvent);
313
- yield releaseResources();
314
- yield closeAudioContext();
315
- } finally {
316
- requesting.value = false;
317
- }
318
- });
319
- return function startCapture() {
320
- return _ref4.apply(this, arguments);
321
- };
322
- }();
323
- const trigger = function() {
324
- var _ref5 = _asyncToGenerator(function* (breakRecording = false) {
325
- if (requesting.value || stopping.value) return;
326
- if (breakRecording && !recording.value) return;
327
- if (controlled.value && typeof config.value === "object") {
328
- var _config$value$onRecor2, _config$value2;
329
- const nextRecording = !recording.value;
330
- (_config$value$onRecor2 = (_config$value2 = config.value).onRecordingChange) === null || _config$value$onRecor2 === void 0 || _config$value$onRecor2.call(_config$value2, nextRecording);
331
- const now = performance.now();
332
- if (nextRecording) {
333
- startedAt.value = now;
334
- options.onStart({
335
- source: "controlled",
336
- startedAt: now
337
- });
338
- } else options.onEnd({
339
- source: "controlled",
340
- reason: "controlled",
341
- startedAt: startedAt.value,
342
- endedAt: now,
343
- duration: now - startedAt.value,
344
- chunks: 0
345
- });
346
- return;
347
- }
348
- if (internalRecording.value) yield stopCapture();
349
- else yield startCapture();
350
- });
351
- return function trigger() {
352
- return _ref5.apply(this, arguments);
353
- };
354
- }();
355
- onMounted(() => {
356
- var _navigator$mediaDevic;
357
- supported.value = Boolean(typeof ((_navigator$mediaDevic = navigator.mediaDevices) === null || _navigator$mediaDevic === void 0 ? void 0 : _navigator$mediaDevic.getUserMedia) === "function" && typeof AudioContext !== "undefined" && typeof AudioWorkletNode !== "undefined");
358
- });
359
- watch(() => Boolean(config.value), (enabled) => {
360
- if (!enabled) stopCapture();
361
- });
362
- watch(controlled, (nextControlled) => {
363
- if (nextControlled) stopCapture();
364
- });
365
- onBeforeUnmount(_asyncToGenerator(function* () {
366
- disposed = true;
367
- if (internalRecording.value) yield stopCapture("unmount");
368
- else yield releaseResources();
369
- yield closeAudioContext();
370
- if (generatedWorkletUrl) URL.revokeObjectURL(generatedWorkletUrl);
371
- }));
372
- return {
373
- available,
374
- recording,
375
- requesting: computed(() => requesting.value || stopping.value),
376
- statusText,
377
- trigger
378
- };
379
- }
380
- //#endregion
381
- export { useSpeech };