@garrix82/reactgenie-lib 1.3.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.
- package/.env.example +22 -0
- package/.github/workflows/publish.yml +20 -0
- package/LICENSE.txt +201 -0
- package/README.md +621 -0
- package/babel.config.js +29 -0
- package/dist/adapters/__tests__/expo-router-adapter.test.d.ts +1 -0
- package/dist/adapters/expo-router-adapter.d.ts +16 -0
- package/dist/adapters/expo-router-adapter.js +521 -0
- package/dist/adapters/navigation-adapter.d.ts +20 -0
- package/dist/adapters/navigation-adapter.js +137 -0
- package/dist/audio-visualizer.d.ts +14 -0
- package/dist/audio-visualizer.js +123 -0
- package/dist/current-selection.d.ts +27 -0
- package/dist/current-selection.js +94 -0
- package/dist/errors.d.ts +19 -0
- package/dist/errors.js +37 -0
- package/dist/genie/DateTime.d.ts +66 -0
- package/dist/genie/DateTime.js +399 -0
- package/dist/genie/TimeDelta.d.ts +35 -0
- package/dist/genie/TimeDelta.js +169 -0
- package/dist/genie-view-wrapper.d.ts +1 -0
- package/dist/genie-view-wrapper.js +377 -0
- package/dist/hooks/__tests__/useSpeechRecognition.test.d.ts +1 -0
- package/dist/hooks/useSpeechRecognition.d.ts +28 -0
- package/dist/hooks/useSpeechRecognition.js +118 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +469 -0
- package/dist/logger.d.ts +23 -0
- package/dist/logger.js +597 -0
- package/dist/logger.remote.test.d.ts +0 -0
- package/dist/modality-provider-v2.d.ts +28 -0
- package/dist/modality-provider-v2.js +1321 -0
- package/dist/modality-provider.d.ts +22 -0
- package/dist/modality-provider.js +373 -0
- package/dist/native-visibility.d.ts +28 -0
- package/dist/native-visibility.js +50 -0
- package/dist/platform/VoiceRecognitionBar.d.ts +17 -0
- package/dist/platform/VoiceRecognitionBar.js +332 -0
- package/dist/platform/components.d.ts +32 -0
- package/dist/platform/components.js +351 -0
- package/dist/platform/events.d.ts +31 -0
- package/dist/platform/events.js +274 -0
- package/dist/platform/index.d.ts +3 -0
- package/dist/platform/index.js +39 -0
- package/dist/platform/types.d.ts +79 -0
- package/dist/platform/types.js +97 -0
- package/dist/react-decorators.d.ts +87 -0
- package/dist/react-decorators.js +368 -0
- package/dist/shared-store.d.ts +74 -0
- package/dist/shared-store.js +589 -0
- package/dist/speech-recognition/__tests__/speech-recognition-groq-transport.test.d.ts +1 -0
- package/dist/speech-recognition/__tests__/speech-recognition-native.test.d.ts +1 -0
- package/dist/speech-recognition/__tests__/speech-recognition-openai-native.test.d.ts +1 -0
- package/dist/speech-recognition/__tests__/speech-recognition-openai.test.d.ts +1 -0
- package/dist/speech-recognition/__tests__/speech-recognition-unified-import.test.d.ts +0 -0
- package/dist/speech-recognition/__tests__/speech-recognition-unified.test.d.ts +1 -0
- package/dist/speech-recognition/speech-recognition-groq.d.ts +21 -0
- package/dist/speech-recognition/speech-recognition-groq.js +409 -0
- package/dist/speech-recognition/speech-recognition-mlx.d.ts +15 -0
- package/dist/speech-recognition/speech-recognition-mlx.js +393 -0
- package/dist/speech-recognition/speech-recognition-native.d.ts +24 -0
- package/dist/speech-recognition/speech-recognition-native.js +632 -0
- package/dist/speech-recognition/speech-recognition-openai-native.d.ts +40 -0
- package/dist/speech-recognition/speech-recognition-openai-native.js +653 -0
- package/dist/speech-recognition/speech-recognition-openai.d.ts +39 -0
- package/dist/speech-recognition/speech-recognition-openai.js +718 -0
- package/dist/speech-recognition/speech-recognition-unified.d.ts +93 -0
- package/dist/speech-recognition/speech-recognition-unified.js +589 -0
- package/dist/speech-recognition/utils/groq-transcription.d.ts +41 -0
- package/dist/speech-recognition/utils/groq-transcription.js +382 -0
- package/dist/speech-recognition.d.ts +7 -0
- package/dist/speech-recognition.js +61 -0
- package/dist/voice-pipeline-telemetry.d.ts +26 -0
- package/dist/voice-pipeline-telemetry.js +15 -0
- package/garrix82-reactgenie-lib-1.3.0.tgz +0 -0
- package/metro/index.js +3 -0
- package/metro/with-genie-registry.js +47 -0
- package/package.json +111 -0
- package/scripts/dry-run.js +23 -0
- package/scripts/generate-genie-registry.js +278 -0
- package/scripts/log-file-test.js +51 -0
- package/scripts/parse.js +26 -0
- package/scripts/prompt.js +19 -0
- package/scripts/set-script.js +200 -0
- package/tsconfig.json +36 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
type ReactNativeFile = {
|
|
2
|
+
uri: string;
|
|
3
|
+
name?: string;
|
|
4
|
+
type?: string;
|
|
5
|
+
};
|
|
6
|
+
export type GroqTranscriptionOptions = {
|
|
7
|
+
apiKey: string;
|
|
8
|
+
audioBlob: Blob | ReactNativeFile;
|
|
9
|
+
mimeType: string;
|
|
10
|
+
language?: string;
|
|
11
|
+
model?: string;
|
|
12
|
+
responseFormat?: 'json' | 'verbose_json';
|
|
13
|
+
stream?: boolean;
|
|
14
|
+
signal?: AbortSignal;
|
|
15
|
+
endpoint?: string;
|
|
16
|
+
onInterim?: (text: string) => void;
|
|
17
|
+
};
|
|
18
|
+
export type GroqTranslationOptions = {
|
|
19
|
+
apiKey: string;
|
|
20
|
+
audioBlob: Blob | ReactNativeFile;
|
|
21
|
+
mimeType: string;
|
|
22
|
+
language?: string;
|
|
23
|
+
model?: string;
|
|
24
|
+
responseFormat?: 'json' | 'verbose_json';
|
|
25
|
+
signal?: AbortSignal;
|
|
26
|
+
endpoint?: string;
|
|
27
|
+
};
|
|
28
|
+
export type GroqTextTranslationOptions = {
|
|
29
|
+
apiKey: string;
|
|
30
|
+
text: string;
|
|
31
|
+
language?: string;
|
|
32
|
+
targetLanguage?: string;
|
|
33
|
+
model?: string;
|
|
34
|
+
signal?: AbortSignal;
|
|
35
|
+
endpoint?: string;
|
|
36
|
+
};
|
|
37
|
+
export declare function streamGroqTranscription({ apiKey, audioBlob, mimeType, language, model, responseFormat, stream, signal, endpoint, onInterim, }: GroqTranscriptionOptions): Promise<string>;
|
|
38
|
+
export declare function translateGroqAudio({ apiKey, audioBlob, mimeType, language, model, responseFormat, signal, endpoint, }: GroqTranslationOptions): Promise<string>;
|
|
39
|
+
export declare function translateGroqText({ apiKey, text, language, targetLanguage, model, signal, endpoint, }: GroqTextTranslationOptions): Promise<string>;
|
|
40
|
+
export declare function mergeTranscriptParts(base: string, addition: string): string;
|
|
41
|
+
export {};
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.mergeTranscriptParts = mergeTranscriptParts;
|
|
7
|
+
exports.streamGroqTranscription = streamGroqTranscription;
|
|
8
|
+
exports.translateGroqAudio = translateGroqAudio;
|
|
9
|
+
exports.translateGroqText = translateGroqText;
|
|
10
|
+
var _logger = _interopRequireDefault(require("../../logger"));
|
|
11
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
const DEFAULT_ENDPOINT = 'https://api.groq.com/openai/v1/audio/transcriptions';
|
|
13
|
+
const DEFAULT_TRANSLATION_ENDPOINT = 'https://api.groq.com/openai/v1/audio/translations';
|
|
14
|
+
const DEFAULT_CHAT_COMPLETIONS_ENDPOINT = 'https://api.groq.com/openai/v1/chat/completions';
|
|
15
|
+
async function streamGroqTranscription({
|
|
16
|
+
apiKey,
|
|
17
|
+
audioBlob,
|
|
18
|
+
mimeType,
|
|
19
|
+
language = 'en',
|
|
20
|
+
model = 'whisper-large-v3',
|
|
21
|
+
responseFormat = 'verbose_json',
|
|
22
|
+
stream = true,
|
|
23
|
+
signal,
|
|
24
|
+
endpoint = DEFAULT_ENDPOINT,
|
|
25
|
+
onInterim
|
|
26
|
+
}) {
|
|
27
|
+
const fileName = isReactNativeFile(audioBlob) ? audioBlob.name || `audio.${getFileExtension(mimeType)}` : `audio.${getFileExtension(mimeType)}`;
|
|
28
|
+
const formData = new FormData();
|
|
29
|
+
if (isReactNativeFile(audioBlob)) {
|
|
30
|
+
formData.append('file', {
|
|
31
|
+
uri: audioBlob.uri,
|
|
32
|
+
name: fileName,
|
|
33
|
+
type: audioBlob.type || mimeType
|
|
34
|
+
});
|
|
35
|
+
} else {
|
|
36
|
+
const file = createAudioFile(audioBlob, fileName, mimeType);
|
|
37
|
+
if (file && typeof file === 'object') {
|
|
38
|
+
if (file instanceof Blob && !file.name) {
|
|
39
|
+
formData.append('file', file, fileName);
|
|
40
|
+
} else {
|
|
41
|
+
formData.append('file', file);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
formData.append('model', model);
|
|
46
|
+
formData.append('language', language);
|
|
47
|
+
formData.append('response_format', responseFormat);
|
|
48
|
+
const url = stream ? `${endpoint}?stream=true` : endpoint;
|
|
49
|
+
if (stream && isReactNativeEnv() && typeof XMLHttpRequest !== 'undefined') {
|
|
50
|
+
_logger.default.warn('[Groq SSE] using XHR streaming (React Native)');
|
|
51
|
+
return streamGroqTranscriptionViaXhr({
|
|
52
|
+
apiKey,
|
|
53
|
+
formData,
|
|
54
|
+
url,
|
|
55
|
+
signal,
|
|
56
|
+
onInterim
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
const response = await fetch(url, {
|
|
60
|
+
method: 'POST',
|
|
61
|
+
headers: {
|
|
62
|
+
Authorization: `Bearer ${apiKey}`
|
|
63
|
+
},
|
|
64
|
+
body: formData,
|
|
65
|
+
signal
|
|
66
|
+
});
|
|
67
|
+
if (!response.ok) {
|
|
68
|
+
const errorBody = await response.text().catch(() => '');
|
|
69
|
+
throw buildHttpError(response.status, errorBody);
|
|
70
|
+
}
|
|
71
|
+
let lastText = '';
|
|
72
|
+
const handleLine = line => {
|
|
73
|
+
const trimmed = line.trim();
|
|
74
|
+
if (!trimmed) return;
|
|
75
|
+
const payload = trimmed.startsWith('data:') ? trimmed.slice(5).trim() : trimmed;
|
|
76
|
+
if (!payload) return;
|
|
77
|
+
try {
|
|
78
|
+
const parsed = JSON.parse(payload);
|
|
79
|
+
const text = extractText(parsed);
|
|
80
|
+
if (text) {
|
|
81
|
+
lastText = text;
|
|
82
|
+
if (onInterim) onInterim(text);
|
|
83
|
+
}
|
|
84
|
+
} catch {
|
|
85
|
+
// ignore non-JSON lines
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
const reader = response.body?.getReader?.();
|
|
89
|
+
if (reader && typeof TextDecoder !== 'undefined') {
|
|
90
|
+
const decoder = new TextDecoder();
|
|
91
|
+
let buffer = '';
|
|
92
|
+
while (true) {
|
|
93
|
+
const {
|
|
94
|
+
value,
|
|
95
|
+
done
|
|
96
|
+
} = await reader.read();
|
|
97
|
+
if (done) break;
|
|
98
|
+
buffer += decoder.decode(value, {
|
|
99
|
+
stream: true
|
|
100
|
+
});
|
|
101
|
+
const lines = buffer.split('\n');
|
|
102
|
+
buffer = lines.pop() || '';
|
|
103
|
+
for (const line of lines) {
|
|
104
|
+
handleLine(line);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (buffer) {
|
|
108
|
+
handleLine(buffer);
|
|
109
|
+
}
|
|
110
|
+
} else {
|
|
111
|
+
const text = await response.text();
|
|
112
|
+
const lines = text.split('\n');
|
|
113
|
+
for (const line of lines) {
|
|
114
|
+
handleLine(line);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return lastText;
|
|
118
|
+
}
|
|
119
|
+
async function translateGroqAudio({
|
|
120
|
+
apiKey,
|
|
121
|
+
audioBlob,
|
|
122
|
+
mimeType,
|
|
123
|
+
language,
|
|
124
|
+
model = 'whisper-large-v3',
|
|
125
|
+
responseFormat = 'json',
|
|
126
|
+
signal,
|
|
127
|
+
endpoint = DEFAULT_TRANSLATION_ENDPOINT
|
|
128
|
+
}) {
|
|
129
|
+
const fileName = isReactNativeFile(audioBlob) ? audioBlob.name || `audio.${getFileExtension(mimeType)}` : `audio.${getFileExtension(mimeType)}`;
|
|
130
|
+
const formData = new FormData();
|
|
131
|
+
if (isReactNativeFile(audioBlob)) {
|
|
132
|
+
formData.append('file', {
|
|
133
|
+
uri: audioBlob.uri,
|
|
134
|
+
name: fileName,
|
|
135
|
+
type: audioBlob.type || mimeType
|
|
136
|
+
});
|
|
137
|
+
} else {
|
|
138
|
+
const file = createAudioFile(audioBlob, fileName, mimeType);
|
|
139
|
+
if (file && typeof file === 'object') {
|
|
140
|
+
if (file instanceof Blob && !file.name) {
|
|
141
|
+
formData.append('file', file, fileName);
|
|
142
|
+
} else {
|
|
143
|
+
formData.append('file', file);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
formData.append('model', model);
|
|
148
|
+
if (language) {
|
|
149
|
+
formData.append('language', language);
|
|
150
|
+
}
|
|
151
|
+
formData.append('response_format', responseFormat);
|
|
152
|
+
const response = await fetch(endpoint, {
|
|
153
|
+
method: 'POST',
|
|
154
|
+
headers: {
|
|
155
|
+
Authorization: `Bearer ${apiKey}`
|
|
156
|
+
},
|
|
157
|
+
body: formData,
|
|
158
|
+
signal
|
|
159
|
+
});
|
|
160
|
+
if (!response.ok) {
|
|
161
|
+
const errorBody = await response.text().catch(() => '');
|
|
162
|
+
throw buildHttpError(response.status, errorBody);
|
|
163
|
+
}
|
|
164
|
+
let payload = null;
|
|
165
|
+
try {
|
|
166
|
+
payload = await response.json();
|
|
167
|
+
} catch {
|
|
168
|
+
const text = await response.text().catch(() => '');
|
|
169
|
+
return text.trim();
|
|
170
|
+
}
|
|
171
|
+
return extractText(payload);
|
|
172
|
+
}
|
|
173
|
+
async function translateGroqText({
|
|
174
|
+
apiKey,
|
|
175
|
+
text,
|
|
176
|
+
language,
|
|
177
|
+
targetLanguage = 'English',
|
|
178
|
+
model = 'llama-3.1-8b-instant',
|
|
179
|
+
signal,
|
|
180
|
+
endpoint = DEFAULT_CHAT_COMPLETIONS_ENDPOINT
|
|
181
|
+
}) {
|
|
182
|
+
const input = text.trim();
|
|
183
|
+
if (!input) return '';
|
|
184
|
+
const response = await fetch(endpoint, {
|
|
185
|
+
method: 'POST',
|
|
186
|
+
headers: {
|
|
187
|
+
Authorization: 'Bearer ' + apiKey,
|
|
188
|
+
'Content-Type': 'application/json'
|
|
189
|
+
},
|
|
190
|
+
body: JSON.stringify({
|
|
191
|
+
model,
|
|
192
|
+
temperature: 0,
|
|
193
|
+
stream: false,
|
|
194
|
+
messages: [{
|
|
195
|
+
role: 'system',
|
|
196
|
+
content: 'Translate user text accurately. Return only translated text without commentary.'
|
|
197
|
+
}, {
|
|
198
|
+
role: 'user',
|
|
199
|
+
content: language ? 'Translate from ' + language + ' to ' + targetLanguage + ': ' + input : 'Translate to ' + targetLanguage + ': ' + input
|
|
200
|
+
}]
|
|
201
|
+
}),
|
|
202
|
+
signal
|
|
203
|
+
});
|
|
204
|
+
if (!response.ok) {
|
|
205
|
+
const errorBody = await response.text().catch(() => '');
|
|
206
|
+
throw buildHttpError(response.status, errorBody);
|
|
207
|
+
}
|
|
208
|
+
const payload = await response.json().catch(() => null);
|
|
209
|
+
const translated = extractChatCompletionText(payload);
|
|
210
|
+
if (translated) return translated.trim();
|
|
211
|
+
return extractText(payload);
|
|
212
|
+
}
|
|
213
|
+
function mergeTranscriptParts(base, addition) {
|
|
214
|
+
const a = base.trim();
|
|
215
|
+
const b = addition.trim();
|
|
216
|
+
if (!a) return b;
|
|
217
|
+
if (!b) return a;
|
|
218
|
+
if (a.endsWith(b)) return a;
|
|
219
|
+
if (b.startsWith(a)) return b;
|
|
220
|
+
return `${a} ${b}`.trim();
|
|
221
|
+
}
|
|
222
|
+
function createAudioFile(audioBlob, name, mimeType) {
|
|
223
|
+
if (typeof File !== 'undefined') {
|
|
224
|
+
try {
|
|
225
|
+
return new File([audioBlob], name, {
|
|
226
|
+
type: mimeType
|
|
227
|
+
});
|
|
228
|
+
} catch {
|
|
229
|
+
return audioBlob;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return audioBlob;
|
|
233
|
+
}
|
|
234
|
+
function streamGroqTranscriptionViaXhr(options) {
|
|
235
|
+
return new Promise((resolve, reject) => {
|
|
236
|
+
const xhr = new XMLHttpRequest();
|
|
237
|
+
let lastText = '';
|
|
238
|
+
let processedLength = 0;
|
|
239
|
+
let buffer = '';
|
|
240
|
+
const debug = shouldDebugSse();
|
|
241
|
+
const log = debug ? _logger.default.warn : _logger.default.debug;
|
|
242
|
+
const handleLine = line => {
|
|
243
|
+
const trimmed = line.trim();
|
|
244
|
+
if (!trimmed) return;
|
|
245
|
+
const payload = trimmed.startsWith('data:') ? trimmed.slice(5).trim() : trimmed;
|
|
246
|
+
if (!payload) return;
|
|
247
|
+
if (payload === '[DONE]') return;
|
|
248
|
+
try {
|
|
249
|
+
const parsed = JSON.parse(payload);
|
|
250
|
+
const text = extractText(parsed);
|
|
251
|
+
if (text) {
|
|
252
|
+
lastText = text;
|
|
253
|
+
log('[Groq SSE] interim:', text);
|
|
254
|
+
if (options.onInterim) options.onInterim(text);
|
|
255
|
+
}
|
|
256
|
+
} catch {
|
|
257
|
+
// ignore non-JSON lines
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
xhr.open('POST', options.url, true);
|
|
261
|
+
xhr.setRequestHeader('Authorization', `Bearer ${options.apiKey}`);
|
|
262
|
+
xhr.responseType = 'text';
|
|
263
|
+
const processIncremental = () => {
|
|
264
|
+
const text = xhr.responseText || '';
|
|
265
|
+
const chunk = text.slice(processedLength);
|
|
266
|
+
if (!chunk) return;
|
|
267
|
+
processedLength = text.length;
|
|
268
|
+
buffer += chunk;
|
|
269
|
+
log('[Groq SSE] chunk bytes:', chunk.length);
|
|
270
|
+
const lines = buffer.split('\n');
|
|
271
|
+
buffer = lines.pop() || '';
|
|
272
|
+
for (const line of lines) {
|
|
273
|
+
handleLine(line);
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
xhr.onreadystatechange = () => {
|
|
277
|
+
if (xhr.readyState === XMLHttpRequest.LOADING) {
|
|
278
|
+
processIncremental();
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
if (xhr.readyState === XMLHttpRequest.DONE) {
|
|
282
|
+
if (xhr.status >= 200 && xhr.status < 300) {
|
|
283
|
+
if (buffer) {
|
|
284
|
+
handleLine(buffer);
|
|
285
|
+
buffer = '';
|
|
286
|
+
}
|
|
287
|
+
processIncremental();
|
|
288
|
+
resolve(lastText);
|
|
289
|
+
} else if (xhr.status === 0) {
|
|
290
|
+
// Status 0 in React Native usually means the request never reached the server
|
|
291
|
+
reject(new Error(`Groq API network error (status 0). Check device connectivity, HTTP/ATS cleartext settings, and endpoint URL: ${options.url}`));
|
|
292
|
+
} else {
|
|
293
|
+
reject(buildHttpError(xhr.status, xhr.responseText || ''));
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
};
|
|
297
|
+
xhr.onprogress = () => {
|
|
298
|
+
processIncremental();
|
|
299
|
+
};
|
|
300
|
+
xhr.onerror = () => {
|
|
301
|
+
reject(new Error('Groq API network error'));
|
|
302
|
+
};
|
|
303
|
+
if (options.signal) {
|
|
304
|
+
if (options.signal.aborted) {
|
|
305
|
+
xhr.abort();
|
|
306
|
+
reject(new Error('AbortError'));
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
options.signal.addEventListener('abort', () => {
|
|
310
|
+
xhr.abort();
|
|
311
|
+
reject(new Error('AbortError'));
|
|
312
|
+
}, {
|
|
313
|
+
once: true
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
xhr.send(options.formData);
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
function isReactNativeFile(value) {
|
|
320
|
+
return !!value && typeof value === 'object' && 'uri' in value;
|
|
321
|
+
}
|
|
322
|
+
function isReactNativeEnv() {
|
|
323
|
+
return typeof navigator !== 'undefined' && navigator.product === 'ReactNative';
|
|
324
|
+
}
|
|
325
|
+
function shouldDebugSse() {
|
|
326
|
+
return typeof __DEV__ !== 'undefined' ? __DEV__ : false;
|
|
327
|
+
}
|
|
328
|
+
function extractChatCompletionText(payload) {
|
|
329
|
+
const content = payload?.choices?.[0]?.message?.content;
|
|
330
|
+
if (typeof content === 'string') {
|
|
331
|
+
return content.trim();
|
|
332
|
+
}
|
|
333
|
+
if (Array.isArray(content)) {
|
|
334
|
+
const joined = content.map(part => {
|
|
335
|
+
if (typeof part?.text === 'string') return part.text;
|
|
336
|
+
if (typeof part?.content === 'string') return part.content;
|
|
337
|
+
return '';
|
|
338
|
+
}).join('').trim();
|
|
339
|
+
return joined;
|
|
340
|
+
}
|
|
341
|
+
return '';
|
|
342
|
+
}
|
|
343
|
+
function extractText(payload) {
|
|
344
|
+
if (!payload || typeof payload !== 'object') return '';
|
|
345
|
+
const directText = typeof payload.text === 'string' ? payload.text : '';
|
|
346
|
+
if (directText) return directText.trim();
|
|
347
|
+
const deltaText = payload.delta && typeof payload.delta.text === 'string' ? payload.delta.text : '';
|
|
348
|
+
if (deltaText) return deltaText.trim();
|
|
349
|
+
const dataText = payload.data && typeof payload.data.text === 'string' ? payload.data.text : '';
|
|
350
|
+
if (dataText) return dataText.trim();
|
|
351
|
+
const choiceText = payload.choices?.[0]?.delta?.content || payload.choices?.[0]?.text || '';
|
|
352
|
+
return typeof choiceText === 'string' ? choiceText.trim() : '';
|
|
353
|
+
}
|
|
354
|
+
function buildHttpError(status, rawBody) {
|
|
355
|
+
const detail = extractErrorMessage(rawBody);
|
|
356
|
+
const suffix = detail ? ` - ${detail}` : '';
|
|
357
|
+
return new Error(`Groq API error: ${status}${suffix}`);
|
|
358
|
+
}
|
|
359
|
+
function extractErrorMessage(rawBody) {
|
|
360
|
+
if (!rawBody) return '';
|
|
361
|
+
const trimmed = rawBody.trim();
|
|
362
|
+
if (!trimmed) return '';
|
|
363
|
+
try {
|
|
364
|
+
const parsed = JSON.parse(trimmed);
|
|
365
|
+
const message = parsed?.error?.message || parsed?.error || parsed?.message || parsed?.detail || '';
|
|
366
|
+
if (typeof message === 'string' && message.trim()) {
|
|
367
|
+
return message.trim();
|
|
368
|
+
}
|
|
369
|
+
} catch {
|
|
370
|
+
// ignore JSON parse failures
|
|
371
|
+
}
|
|
372
|
+
return trimmed.slice(0, 300);
|
|
373
|
+
}
|
|
374
|
+
function getFileExtension(mimeType) {
|
|
375
|
+
if (mimeType.includes('webm')) return 'webm';
|
|
376
|
+
if (mimeType.includes('ogg')) return 'ogg';
|
|
377
|
+
if (mimeType.includes('mp4')) return 'mp4';
|
|
378
|
+
if (mimeType.includes('wav')) return 'wav';
|
|
379
|
+
if (mimeType.includes('m4a')) return 'm4a';
|
|
380
|
+
return 'webm';
|
|
381
|
+
}
|
|
382
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJERUZBVUxUX0VORFBPSU5UIiwiREVGQVVMVF9UUkFOU0xBVElPTl9FTkRQT0lOVCIsIkRFRkFVTFRfQ0hBVF9DT01QTEVUSU9OU19FTkRQT0lOVCIsInN0cmVhbUdyb3FUcmFuc2NyaXB0aW9uIiwiYXBpS2V5IiwiYXVkaW9CbG9iIiwibWltZVR5cGUiLCJsYW5ndWFnZSIsIm1vZGVsIiwicmVzcG9uc2VGb3JtYXQiLCJzdHJlYW0iLCJzaWduYWwiLCJlbmRwb2ludCIsIm9uSW50ZXJpbSIsImZpbGVOYW1lIiwiaXNSZWFjdE5hdGl2ZUZpbGUiLCJuYW1lIiwiZ2V0RmlsZUV4dGVuc2lvbiIsImZvcm1EYXRhIiwiRm9ybURhdGEiLCJhcHBlbmQiLCJ1cmkiLCJ0eXBlIiwiZmlsZSIsImNyZWF0ZUF1ZGlvRmlsZSIsIkJsb2IiLCJ1cmwiLCJpc1JlYWN0TmF0aXZlRW52IiwiWE1MSHR0cFJlcXVlc3QiLCJsb2dnZXIiLCJ3YXJuIiwic3RyZWFtR3JvcVRyYW5zY3JpcHRpb25WaWFYaHIiLCJyZXNwb25zZSIsImZldGNoIiwibWV0aG9kIiwiaGVhZGVycyIsIkF1dGhvcml6YXRpb24iLCJib2R5Iiwib2siLCJlcnJvckJvZHkiLCJ0ZXh0IiwiY2F0Y2giLCJidWlsZEh0dHBFcnJvciIsInN0YXR1cyIsImxhc3RUZXh0IiwiaGFuZGxlTGluZSIsImxpbmUiLCJ0cmltbWVkIiwidHJpbSIsInBheWxvYWQiLCJzdGFydHNXaXRoIiwic2xpY2UiLCJwYXJzZWQiLCJKU09OIiwicGFyc2UiLCJleHRyYWN0VGV4dCIsInJlYWRlciIsImdldFJlYWRlciIsIlRleHREZWNvZGVyIiwiZGVjb2RlciIsImJ1ZmZlciIsInZhbHVlIiwiZG9uZSIsInJlYWQiLCJkZWNvZGUiLCJsaW5lcyIsInNwbGl0IiwicG9wIiwidHJhbnNsYXRlR3JvcUF1ZGlvIiwianNvbiIsInRyYW5zbGF0ZUdyb3FUZXh0IiwidGFyZ2V0TGFuZ3VhZ2UiLCJpbnB1dCIsInN0cmluZ2lmeSIsInRlbXBlcmF0dXJlIiwibWVzc2FnZXMiLCJyb2xlIiwiY29udGVudCIsInRyYW5zbGF0ZWQiLCJleHRyYWN0Q2hhdENvbXBsZXRpb25UZXh0IiwibWVyZ2VUcmFuc2NyaXB0UGFydHMiLCJiYXNlIiwiYWRkaXRpb24iLCJhIiwiYiIsImVuZHNXaXRoIiwiRmlsZSIsIm9wdGlvbnMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInhociIsInByb2Nlc3NlZExlbmd0aCIsImRlYnVnIiwic2hvdWxkRGVidWdTc2UiLCJsb2ciLCJvcGVuIiwic2V0UmVxdWVzdEhlYWRlciIsInJlc3BvbnNlVHlwZSIsInByb2Nlc3NJbmNyZW1lbnRhbCIsInJlc3BvbnNlVGV4dCIsImNodW5rIiwibGVuZ3RoIiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVhZHlTdGF0ZSIsIkxPQURJTkciLCJET05FIiwiRXJyb3IiLCJvbnByb2dyZXNzIiwib25lcnJvciIsImFib3J0ZWQiLCJhYm9ydCIsImFkZEV2ZW50TGlzdGVuZXIiLCJvbmNlIiwic2VuZCIsIm5hdmlnYXRvciIsInByb2R1Y3QiLCJfX0RFVl9fIiwiY2hvaWNlcyIsIm1lc3NhZ2UiLCJBcnJheSIsImlzQXJyYXkiLCJqb2luZWQiLCJtYXAiLCJwYXJ0Iiwiam9pbiIsImRpcmVjdFRleHQiLCJkZWx0YVRleHQiLCJkZWx0YSIsImRhdGFUZXh0IiwiZGF0YSIsImNob2ljZVRleHQiLCJyYXdCb2R5IiwiZGV0YWlsIiwiZXh0cmFjdEVycm9yTWVzc2FnZSIsInN1ZmZpeCIsImVycm9yIiwiaW5jbHVkZXMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3BlZWNoLXJlY29nbml0aW9uL3V0aWxzL2dyb3EtdHJhbnNjcmlwdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9nZ2VyIGZyb20gJy4uLy4uL2xvZ2dlcic7XG5cbnR5cGUgUmVhY3ROYXRpdmVGaWxlID0ge1xuICB1cmk6IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbiAgdHlwZT86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEdyb3FUcmFuc2NyaXB0aW9uT3B0aW9ucyA9IHtcbiAgYXBpS2V5OiBzdHJpbmc7XG4gIGF1ZGlvQmxvYjogQmxvYiB8IFJlYWN0TmF0aXZlRmlsZTtcbiAgbWltZVR5cGU6IHN0cmluZztcbiAgbGFuZ3VhZ2U/OiBzdHJpbmc7XG4gIG1vZGVsPzogc3RyaW5nO1xuICByZXNwb25zZUZvcm1hdD86ICdqc29uJyB8ICd2ZXJib3NlX2pzb24nO1xuICBzdHJlYW0/OiBib29sZWFuO1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgZW5kcG9pbnQ/OiBzdHJpbmc7XG4gIG9uSW50ZXJpbT86ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQ7XG59O1xuXG5jb25zdCBERUZBVUxUX0VORFBPSU5UID0gJ2h0dHBzOi8vYXBpLmdyb3EuY29tL29wZW5haS92MS9hdWRpby90cmFuc2NyaXB0aW9ucyc7XG5jb25zdCBERUZBVUxUX1RSQU5TTEFUSU9OX0VORFBPSU5UID1cbiAgJ2h0dHBzOi8vYXBpLmdyb3EuY29tL29wZW5haS92MS9hdWRpby90cmFuc2xhdGlvbnMnO1xuY29uc3QgREVGQVVMVF9DSEFUX0NPTVBMRVRJT05TX0VORFBPSU5UID1cbiAgJ2h0dHBzOi8vYXBpLmdyb3EuY29tL29wZW5haS92MS9jaGF0L2NvbXBsZXRpb25zJztcblxuZXhwb3J0IHR5cGUgR3JvcVRyYW5zbGF0aW9uT3B0aW9ucyA9IHtcbiAgYXBpS2V5OiBzdHJpbmc7XG4gIGF1ZGlvQmxvYjogQmxvYiB8IFJlYWN0TmF0aXZlRmlsZTtcbiAgbWltZVR5cGU6IHN0cmluZztcbiAgbGFuZ3VhZ2U/OiBzdHJpbmc7XG4gIG1vZGVsPzogc3RyaW5nO1xuICByZXNwb25zZUZvcm1hdD86ICdqc29uJyB8ICd2ZXJib3NlX2pzb24nO1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgZW5kcG9pbnQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBHcm9xVGV4dFRyYW5zbGF0aW9uT3B0aW9ucyA9IHtcbiAgYXBpS2V5OiBzdHJpbmc7XG4gIHRleHQ6IHN0cmluZztcbiAgbGFuZ3VhZ2U/OiBzdHJpbmc7XG4gIHRhcmdldExhbmd1YWdlPzogc3RyaW5nO1xuICBtb2RlbD86IHN0cmluZztcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIGVuZHBvaW50Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0cmVhbUdyb3FUcmFuc2NyaXB0aW9uKHtcbiAgYXBpS2V5LFxuICBhdWRpb0Jsb2IsXG4gIG1pbWVUeXBlLFxuICBsYW5ndWFnZSA9ICdlbicsXG4gIG1vZGVsID0gJ3doaXNwZXItbGFyZ2UtdjMnLFxuICByZXNwb25zZUZvcm1hdCA9ICd2ZXJib3NlX2pzb24nLFxuICBzdHJlYW0gPSB0cnVlLFxuICBzaWduYWwsXG4gIGVuZHBvaW50ID0gREVGQVVMVF9FTkRQT0lOVCxcbiAgb25JbnRlcmltLFxufTogR3JvcVRyYW5zY3JpcHRpb25PcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZmlsZU5hbWUgPSBpc1JlYWN0TmF0aXZlRmlsZShhdWRpb0Jsb2IpXG4gICAgPyBhdWRpb0Jsb2IubmFtZSB8fCBgYXVkaW8uJHtnZXRGaWxlRXh0ZW5zaW9uKG1pbWVUeXBlKX1gXG4gICAgOiBgYXVkaW8uJHtnZXRGaWxlRXh0ZW5zaW9uKG1pbWVUeXBlKX1gO1xuICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuXG4gIGlmIChpc1JlYWN0TmF0aXZlRmlsZShhdWRpb0Jsb2IpKSB7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywge1xuICAgICAgdXJpOiBhdWRpb0Jsb2IudXJpLFxuICAgICAgbmFtZTogZmlsZU5hbWUsXG4gICAgICB0eXBlOiBhdWRpb0Jsb2IudHlwZSB8fCBtaW1lVHlwZSxcbiAgICB9IGFzIGFueSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZmlsZSA9IGNyZWF0ZUF1ZGlvRmlsZShhdWRpb0Jsb2IsIGZpbGVOYW1lLCBtaW1lVHlwZSk7XG4gICAgaWYgKGZpbGUgJiYgdHlwZW9mIChmaWxlIGFzIGFueSkgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoZmlsZSBpbnN0YW5jZW9mIEJsb2IgJiYgIShmaWxlIGFzIGFueSkubmFtZSkge1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlLCBmaWxlTmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlIGFzIGFueSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9ybURhdGEuYXBwZW5kKCdtb2RlbCcsIG1vZGVsKTtcbiAgZm9ybURhdGEuYXBwZW5kKCdsYW5ndWFnZScsIGxhbmd1YWdlKTtcbiAgZm9ybURhdGEuYXBwZW5kKCdyZXNwb25zZV9mb3JtYXQnLCByZXNwb25zZUZvcm1hdCk7XG5cbiAgY29uc3QgdXJsID0gc3RyZWFtID8gYCR7ZW5kcG9pbnR9P3N0cmVhbT10cnVlYCA6IGVuZHBvaW50O1xuXG4gIGlmIChzdHJlYW0gJiYgaXNSZWFjdE5hdGl2ZUVudigpICYmIHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBsb2dnZXIud2FybignW0dyb3EgU1NFXSB1c2luZyBYSFIgc3RyZWFtaW5nIChSZWFjdCBOYXRpdmUpJyk7XG4gICAgcmV0dXJuIHN0cmVhbUdyb3FUcmFuc2NyaXB0aW9uVmlhWGhyKHtcbiAgICAgIGFwaUtleSxcbiAgICAgIGZvcm1EYXRhLFxuICAgICAgdXJsLFxuICAgICAgc2lnbmFsLFxuICAgICAgb25JbnRlcmltLFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7XG4gICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YXBpS2V5fWAsXG4gICAgfSxcbiAgICBib2R5OiBmb3JtRGF0YSxcbiAgICBzaWduYWwsXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBlcnJvckJvZHkgPSBhd2FpdCByZXNwb25zZS50ZXh0KCkuY2F0Y2goKCkgPT4gJycpO1xuICAgIHRocm93IGJ1aWxkSHR0cEVycm9yKHJlc3BvbnNlLnN0YXR1cywgZXJyb3JCb2R5KTtcbiAgfVxuXG4gIGxldCBsYXN0VGV4dCA9ICcnO1xuXG4gIGNvbnN0IGhhbmRsZUxpbmUgPSAobGluZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuICAgIGlmICghdHJpbW1lZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcGF5bG9hZCA9IHRyaW1tZWQuc3RhcnRzV2l0aCgnZGF0YTonKSA/IHRyaW1tZWQuc2xpY2UoNSkudHJpbSgpIDogdHJpbW1lZDtcbiAgICBpZiAoIXBheWxvYWQpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHBheWxvYWQpO1xuICAgICAgY29uc3QgdGV4dCA9IGV4dHJhY3RUZXh0KHBhcnNlZCk7XG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICBsYXN0VGV4dCA9IHRleHQ7XG4gICAgICAgIGlmIChvbkludGVyaW0pIG9uSW50ZXJpbSh0ZXh0KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZSBub24tSlNPTiBsaW5lc1xuICAgIH1cbiAgfTtcblxuICBjb25zdCByZWFkZXIgPSByZXNwb25zZS5ib2R5Py5nZXRSZWFkZXI/LigpO1xuICBpZiAocmVhZGVyICYmIHR5cGVvZiBUZXh0RGVjb2RlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgbGV0IGJ1ZmZlciA9ICcnO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgICBpZiAoZG9uZSkgYnJlYWs7XG4gICAgICBidWZmZXIgKz0gZGVjb2Rlci5kZWNvZGUodmFsdWUsIHsgc3RyZWFtOiB0cnVlIH0pO1xuICAgICAgY29uc3QgbGluZXMgPSBidWZmZXIuc3BsaXQoJ1xcbicpO1xuICAgICAgYnVmZmVyID0gbGluZXMucG9wKCkgfHwgJyc7XG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgaGFuZGxlTGluZShsaW5lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYnVmZmVyKSB7XG4gICAgICBoYW5kbGVMaW5lKGJ1ZmZlcik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgY29uc3QgbGluZXMgPSB0ZXh0LnNwbGl0KCdcXG4nKTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGhhbmRsZUxpbmUobGluZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGxhc3RUZXh0O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhbnNsYXRlR3JvcUF1ZGlvKHtcbiAgYXBpS2V5LFxuICBhdWRpb0Jsb2IsXG4gIG1pbWVUeXBlLFxuICBsYW5ndWFnZSxcbiAgbW9kZWwgPSAnd2hpc3Blci1sYXJnZS12MycsXG4gIHJlc3BvbnNlRm9ybWF0ID0gJ2pzb24nLFxuICBzaWduYWwsXG4gIGVuZHBvaW50ID0gREVGQVVMVF9UUkFOU0xBVElPTl9FTkRQT0lOVCxcbn06IEdyb3FUcmFuc2xhdGlvbk9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlTmFtZSA9IGlzUmVhY3ROYXRpdmVGaWxlKGF1ZGlvQmxvYilcbiAgICA/IGF1ZGlvQmxvYi5uYW1lIHx8IGBhdWRpby4ke2dldEZpbGVFeHRlbnNpb24obWltZVR5cGUpfWBcbiAgICA6IGBhdWRpby4ke2dldEZpbGVFeHRlbnNpb24obWltZVR5cGUpfWA7XG4gIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG5cbiAgaWYgKGlzUmVhY3ROYXRpdmVGaWxlKGF1ZGlvQmxvYikpIHtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCB7XG4gICAgICB1cmk6IGF1ZGlvQmxvYi51cmksXG4gICAgICBuYW1lOiBmaWxlTmFtZSxcbiAgICAgIHR5cGU6IGF1ZGlvQmxvYi50eXBlIHx8IG1pbWVUeXBlLFxuICAgIH0gYXMgYW55KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBmaWxlID0gY3JlYXRlQXVkaW9GaWxlKGF1ZGlvQmxvYiwgZmlsZU5hbWUsIG1pbWVUeXBlKTtcbiAgICBpZiAoZmlsZSAmJiB0eXBlb2YgKGZpbGUgYXMgYW55KSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChmaWxlIGluc3RhbmNlb2YgQmxvYiAmJiAhKGZpbGUgYXMgYW55KS5uYW1lKSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUsIGZpbGVOYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUgYXMgYW55KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3JtRGF0YS5hcHBlbmQoJ21vZGVsJywgbW9kZWwpO1xuICBpZiAobGFuZ3VhZ2UpIHtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2xhbmd1YWdlJywgbGFuZ3VhZ2UpO1xuICB9XG4gIGZvcm1EYXRhLmFwcGVuZCgncmVzcG9uc2VfZm9ybWF0JywgcmVzcG9uc2VGb3JtYXQpO1xuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZW5kcG9pbnQsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7XG4gICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YXBpS2V5fWAsXG4gICAgfSxcbiAgICBib2R5OiBmb3JtRGF0YSxcbiAgICBzaWduYWwsXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBlcnJvckJvZHkgPSBhd2FpdCByZXNwb25zZS50ZXh0KCkuY2F0Y2goKCkgPT4gJycpO1xuICAgIHRocm93IGJ1aWxkSHR0cEVycm9yKHJlc3BvbnNlLnN0YXR1cywgZXJyb3JCb2R5KTtcbiAgfVxuXG4gIGxldCBwYXlsb2FkOiBhbnkgPSBudWxsO1xuICB0cnkge1xuICAgIHBheWxvYWQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gIH0gY2F0Y2gge1xuICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCkuY2F0Y2goKCkgPT4gJycpO1xuICAgIHJldHVybiB0ZXh0LnRyaW0oKTtcbiAgfVxuXG4gIHJldHVybiBleHRyYWN0VGV4dChwYXlsb2FkKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyYW5zbGF0ZUdyb3FUZXh0KHtcbiAgYXBpS2V5LFxuICB0ZXh0LFxuICBsYW5ndWFnZSxcbiAgdGFyZ2V0TGFuZ3VhZ2UgPSAnRW5nbGlzaCcsXG4gIG1vZGVsID0gJ2xsYW1hLTMuMS04Yi1pbnN0YW50JyxcbiAgc2lnbmFsLFxuICBlbmRwb2ludCA9IERFRkFVTFRfQ0hBVF9DT01QTEVUSU9OU19FTkRQT0lOVCxcbn06IEdyb3FUZXh0VHJhbnNsYXRpb25PcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgaW5wdXQgPSB0ZXh0LnRyaW0oKTtcbiAgaWYgKCFpbnB1dCkgcmV0dXJuICcnO1xuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZW5kcG9pbnQsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7XG4gICAgICBBdXRob3JpemF0aW9uOiAnQmVhcmVyICcgKyBhcGlLZXksXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgbW9kZWwsXG4gICAgICB0ZW1wZXJhdHVyZTogMCxcbiAgICAgIHN0cmVhbTogZmFsc2UsXG4gICAgICBtZXNzYWdlczogW1xuICAgICAgICB7XG4gICAgICAgICAgcm9sZTogJ3N5c3RlbScsXG4gICAgICAgICAgY29udGVudDpcbiAgICAgICAgICAgICdUcmFuc2xhdGUgdXNlciB0ZXh0IGFjY3VyYXRlbHkuIFJldHVybiBvbmx5IHRyYW5zbGF0ZWQgdGV4dCB3aXRob3V0IGNvbW1lbnRhcnkuJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHJvbGU6ICd1c2VyJyxcbiAgICAgICAgICBjb250ZW50OiBsYW5ndWFnZVxuICAgICAgICAgICAgPyAnVHJhbnNsYXRlIGZyb20gJyArIGxhbmd1YWdlICsgJyB0byAnICsgdGFyZ2V0TGFuZ3VhZ2UgKyAnOiAnICsgaW5wdXRcbiAgICAgICAgICAgIDogJ1RyYW5zbGF0ZSB0byAnICsgdGFyZ2V0TGFuZ3VhZ2UgKyAnOiAnICsgaW5wdXQsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pLFxuICAgIHNpZ25hbCxcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IGVycm9yQm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKS5jYXRjaCgoKSA9PiAnJyk7XG4gICAgdGhyb3cgYnVpbGRIdHRwRXJyb3IocmVzcG9uc2Uuc3RhdHVzLCBlcnJvckJvZHkpO1xuICB9XG5cbiAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiBudWxsKTtcbiAgY29uc3QgdHJhbnNsYXRlZCA9IGV4dHJhY3RDaGF0Q29tcGxldGlvblRleHQocGF5bG9hZCk7XG4gIGlmICh0cmFuc2xhdGVkKSByZXR1cm4gdHJhbnNsYXRlZC50cmltKCk7XG5cbiAgcmV0dXJuIGV4dHJhY3RUZXh0KHBheWxvYWQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VUcmFuc2NyaXB0UGFydHMoYmFzZTogc3RyaW5nLCBhZGRpdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgYSA9IGJhc2UudHJpbSgpO1xuICBjb25zdCBiID0gYWRkaXRpb24udHJpbSgpO1xuICBpZiAoIWEpIHJldHVybiBiO1xuICBpZiAoIWIpIHJldHVybiBhO1xuICBpZiAoYS5lbmRzV2l0aChiKSkgcmV0dXJuIGE7XG4gIGlmIChiLnN0YXJ0c1dpdGgoYSkpIHJldHVybiBiO1xuICByZXR1cm4gYCR7YX0gJHtifWAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVBdWRpb0ZpbGUoYXVkaW9CbG9iOiBCbG9iLCBuYW1lOiBzdHJpbmcsIG1pbWVUeXBlOiBzdHJpbmcpOiBCbG9iIHwgRmlsZSB7XG4gIGlmICh0eXBlb2YgRmlsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG5ldyBGaWxlKFthdWRpb0Jsb2JdLCBuYW1lLCB7IHR5cGU6IG1pbWVUeXBlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGF1ZGlvQmxvYjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGF1ZGlvQmxvYjtcbn1cblxuZnVuY3Rpb24gc3RyZWFtR3JvcVRyYW5zY3JpcHRpb25WaWFYaHIob3B0aW9uczoge1xuICBhcGlLZXk6IHN0cmluZztcbiAgZm9ybURhdGE6IEZvcm1EYXRhO1xuICB1cmw6IHN0cmluZztcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIG9uSW50ZXJpbT86ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQ7XG59KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICBsZXQgbGFzdFRleHQgPSAnJztcbiAgICBsZXQgcHJvY2Vzc2VkTGVuZ3RoID0gMDtcbiAgICBsZXQgYnVmZmVyID0gJyc7XG4gICAgY29uc3QgZGVidWcgPSBzaG91bGREZWJ1Z1NzZSgpO1xuICAgIGNvbnN0IGxvZyA9IGRlYnVnID8gbG9nZ2VyLndhcm4gOiBsb2dnZXIuZGVidWc7XG5cbiAgICBjb25zdCBoYW5kbGVMaW5lID0gKGxpbmU6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuICAgICAgaWYgKCF0cmltbWVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHBheWxvYWQgPSB0cmltbWVkLnN0YXJ0c1dpdGgoJ2RhdGE6JykgPyB0cmltbWVkLnNsaWNlKDUpLnRyaW0oKSA6IHRyaW1tZWQ7XG4gICAgICBpZiAoIXBheWxvYWQpIHJldHVybjtcbiAgICAgIGlmIChwYXlsb2FkID09PSAnW0RPTkVdJykgcmV0dXJuO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHBheWxvYWQpO1xuICAgICAgICBjb25zdCB0ZXh0ID0gZXh0cmFjdFRleHQocGFyc2VkKTtcbiAgICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgICBsYXN0VGV4dCA9IHRleHQ7XG4gICAgICAgICAgbG9nKCdbR3JvcSBTU0VdIGludGVyaW06JywgdGV4dCk7XG4gICAgICAgICAgaWYgKG9wdGlvbnMub25JbnRlcmltKSBvcHRpb25zLm9uSW50ZXJpbSh0ZXh0KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGlnbm9yZSBub24tSlNPTiBsaW5lc1xuICAgICAgfVxuICAgIH07XG5cbiAgICB4aHIub3BlbignUE9TVCcsIG9wdGlvbnMudXJsLCB0cnVlKTtcbiAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQXV0aG9yaXphdGlvbicsIGBCZWFyZXIgJHtvcHRpb25zLmFwaUtleX1gKTtcbiAgICB4aHIucmVzcG9uc2VUeXBlID0gJ3RleHQnO1xuXG4gICAgY29uc3QgcHJvY2Vzc0luY3JlbWVudGFsID0gKCkgPT4ge1xuICAgICAgY29uc3QgdGV4dCA9IHhoci5yZXNwb25zZVRleHQgfHwgJyc7XG4gICAgICBjb25zdCBjaHVuayA9IHRleHQuc2xpY2UocHJvY2Vzc2VkTGVuZ3RoKTtcbiAgICAgIGlmICghY2h1bmspIHJldHVybjtcbiAgICAgIHByb2Nlc3NlZExlbmd0aCA9IHRleHQubGVuZ3RoO1xuICAgICAgYnVmZmVyICs9IGNodW5rO1xuICAgICAgbG9nKCdbR3JvcSBTU0VdIGNodW5rIGJ5dGVzOicsIGNodW5rLmxlbmd0aCk7XG5cbiAgICAgIGNvbnN0IGxpbmVzID0gYnVmZmVyLnNwbGl0KCdcXG4nKTtcbiAgICAgIGJ1ZmZlciA9IGxpbmVzLnBvcCgpIHx8ICcnO1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgIGhhbmRsZUxpbmUobGluZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKSA9PiB7XG4gICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IFhNTEh0dHBSZXF1ZXN0LkxPQURJTkcpIHtcbiAgICAgICAgcHJvY2Vzc0luY3JlbWVudGFsKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gWE1MSHR0cFJlcXVlc3QuRE9ORSkge1xuICAgICAgICBpZiAoeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMCkge1xuICAgICAgICAgIGlmIChidWZmZXIpIHtcbiAgICAgICAgICAgIGhhbmRsZUxpbmUoYnVmZmVyKTtcbiAgICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcm9jZXNzSW5jcmVtZW50YWwoKTtcbiAgICAgICAgICByZXNvbHZlKGxhc3RUZXh0KTtcbiAgICAgICAgfSBlbHNlIGlmICh4aHIuc3RhdHVzID09PSAwKSB7XG4gICAgICAgICAgLy8gU3RhdHVzIDAgaW4gUmVhY3QgTmF0aXZlIHVzdWFsbHkgbWVhbnMgdGhlIHJlcXVlc3QgbmV2ZXIgcmVhY2hlZCB0aGUgc2VydmVyXG4gICAgICAgICAgcmVqZWN0KFxuICAgICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgR3JvcSBBUEkgbmV0d29yayBlcnJvciAoc3RhdHVzIDApLiBDaGVjayBkZXZpY2UgY29ubmVjdGl2aXR5LCBIVFRQL0FUUyBjbGVhcnRleHQgc2V0dGluZ3MsIGFuZCBlbmRwb2ludCBVUkw6ICR7b3B0aW9ucy51cmx9YFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KGJ1aWxkSHR0cEVycm9yKHhoci5zdGF0dXMsIHhoci5yZXNwb25zZVRleHQgfHwgJycpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB4aHIub25wcm9ncmVzcyA9ICgpID0+IHtcbiAgICAgIHByb2Nlc3NJbmNyZW1lbnRhbCgpO1xuICAgIH07XG5cbiAgICB4aHIub25lcnJvciA9ICgpID0+IHtcbiAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0dyb3EgQVBJIG5ldHdvcmsgZXJyb3InKSk7XG4gICAgfTtcblxuICAgIGlmIChvcHRpb25zLnNpZ25hbCkge1xuICAgICAgaWYgKG9wdGlvbnMuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgeGhyLmFib3J0KCk7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0Fib3J0RXJyb3InKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG9wdGlvbnMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICdhYm9ydCcsXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB4aHIuYWJvcnQoKTtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdBYm9ydEVycm9yJykpO1xuICAgICAgICB9LFxuICAgICAgICB7IG9uY2U6IHRydWUgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB4aHIuc2VuZChvcHRpb25zLmZvcm1EYXRhKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzUmVhY3ROYXRpdmVGaWxlKHZhbHVlOiBCbG9iIHwgUmVhY3ROYXRpdmVGaWxlKTogdmFsdWUgaXMgUmVhY3ROYXRpdmVGaWxlIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAndXJpJyBpbiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gaXNSZWFjdE5hdGl2ZUVudigpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIChuYXZpZ2F0b3IgYXMgYW55KS5wcm9kdWN0ID09PSAnUmVhY3ROYXRpdmUnO1xufVxuXG5mdW5jdGlvbiBzaG91bGREZWJ1Z1NzZSgpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBfX0RFVl9fICE9PSAndW5kZWZpbmVkJyA/IF9fREVWX18gOiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdENoYXRDb21wbGV0aW9uVGV4dChwYXlsb2FkOiBhbnkpOiBzdHJpbmcge1xuICBjb25zdCBjb250ZW50ID0gcGF5bG9hZD8uY2hvaWNlcz8uWzBdPy5tZXNzYWdlPy5jb250ZW50O1xuICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGNvbnRlbnQudHJpbSgpO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbnRlbnQpKSB7XG4gICAgY29uc3Qgam9pbmVkID0gY29udGVudFxuICAgICAgLm1hcCgocGFydDogYW55KSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcGFydD8udGV4dCA9PT0gJ3N0cmluZycpIHJldHVybiBwYXJ0LnRleHQ7XG4gICAgICAgIGlmICh0eXBlb2YgcGFydD8uY29udGVudCA9PT0gJ3N0cmluZycpIHJldHVybiBwYXJ0LmNvbnRlbnQ7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH0pXG4gICAgICAuam9pbignJylcbiAgICAgIC50cmltKCk7XG4gICAgcmV0dXJuIGpvaW5lZDtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RUZXh0KHBheWxvYWQ6IGFueSk6IHN0cmluZyB7XG4gIGlmICghcGF5bG9hZCB8fCB0eXBlb2YgcGF5bG9hZCAhPT0gJ29iamVjdCcpIHJldHVybiAnJztcbiAgY29uc3QgZGlyZWN0VGV4dCA9IHR5cGVvZiBwYXlsb2FkLnRleHQgPT09ICdzdHJpbmcnID8gcGF5bG9hZC50ZXh0IDogJyc7XG4gIGlmIChkaXJlY3RUZXh0KSByZXR1cm4gZGlyZWN0VGV4dC50cmltKCk7XG5cbiAgY29uc3QgZGVsdGFUZXh0ID1cbiAgICBwYXlsb2FkLmRlbHRhICYmIHR5cGVvZiBwYXlsb2FkLmRlbHRhLnRleHQgPT09ICdzdHJpbmcnXG4gICAgICA/IHBheWxvYWQuZGVsdGEudGV4dFxuICAgICAgOiAnJztcbiAgaWYgKGRlbHRhVGV4dCkgcmV0dXJuIGRlbHRhVGV4dC50cmltKCk7XG5cbiAgY29uc3QgZGF0YVRleHQgPVxuICAgIHBheWxvYWQuZGF0YSAmJiB0eXBlb2YgcGF5bG9hZC5kYXRhLnRleHQgPT09ICdzdHJpbmcnXG4gICAgICA/IHBheWxvYWQuZGF0YS50ZXh0XG4gICAgICA6ICcnO1xuICBpZiAoZGF0YVRleHQpIHJldHVybiBkYXRhVGV4dC50cmltKCk7XG5cbiAgY29uc3QgY2hvaWNlVGV4dCA9XG4gICAgcGF5bG9hZC5jaG9pY2VzPy5bMF0/LmRlbHRhPy5jb250ZW50IHx8XG4gICAgcGF5bG9hZC5jaG9pY2VzPy5bMF0/LnRleHQgfHxcbiAgICAnJztcbiAgcmV0dXJuIHR5cGVvZiBjaG9pY2VUZXh0ID09PSAnc3RyaW5nJyA/IGNob2ljZVRleHQudHJpbSgpIDogJyc7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSHR0cEVycm9yKHN0YXR1czogbnVtYmVyLCByYXdCb2R5Pzogc3RyaW5nKTogRXJyb3Ige1xuICBjb25zdCBkZXRhaWwgPSBleHRyYWN0RXJyb3JNZXNzYWdlKHJhd0JvZHkpO1xuICBjb25zdCBzdWZmaXggPSBkZXRhaWwgPyBgIC0gJHtkZXRhaWx9YCA6ICcnO1xuICByZXR1cm4gbmV3IEVycm9yKGBHcm9xIEFQSSBlcnJvcjogJHtzdGF0dXN9JHtzdWZmaXh9YCk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RFcnJvck1lc3NhZ2UocmF3Qm9keT86IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghcmF3Qm9keSkgcmV0dXJuICcnO1xuICBjb25zdCB0cmltbWVkID0gcmF3Qm9keS50cmltKCk7XG4gIGlmICghdHJpbW1lZCkgcmV0dXJuICcnO1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UodHJpbW1lZCk7XG4gICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICBwYXJzZWQ/LmVycm9yPy5tZXNzYWdlIHx8XG4gICAgICBwYXJzZWQ/LmVycm9yIHx8XG4gICAgICBwYXJzZWQ/Lm1lc3NhZ2UgfHxcbiAgICAgIHBhcnNlZD8uZGV0YWlsIHx8XG4gICAgICAnJztcbiAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnICYmIG1lc3NhZ2UudHJpbSgpKSB7XG4gICAgICByZXR1cm4gbWVzc2FnZS50cmltKCk7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBpZ25vcmUgSlNPTiBwYXJzZSBmYWlsdXJlc1xuICB9XG4gIHJldHVybiB0cmltbWVkLnNsaWNlKDAsIDMwMCk7XG59XG5cbmZ1bmN0aW9uIGdldEZpbGVFeHRlbnNpb24obWltZVR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChtaW1lVHlwZS5pbmNsdWRlcygnd2VibScpKSByZXR1cm4gJ3dlYm0nO1xuICBpZiAobWltZVR5cGUuaW5jbHVkZXMoJ29nZycpKSByZXR1cm4gJ29nZyc7XG4gIGlmIChtaW1lVHlwZS5pbmNsdWRlcygnbXA0JykpIHJldHVybiAnbXA0JztcbiAgaWYgKG1pbWVUeXBlLmluY2x1ZGVzKCd3YXYnKSkgcmV0dXJuICd3YXYnO1xuICBpZiAobWltZVR5cGUuaW5jbHVkZXMoJ200YScpKSByZXR1cm4g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
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.SpeechRecognizer = void 0;
|
|
7
|
+
require("regenerator-runtime");
|
|
8
|
+
var _reactSpeechRecognition = _interopRequireWildcard(require("react-speech-recognition"));
|
|
9
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
10
|
+
var _reactNative = require("react-native");
|
|
11
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
12
|
+
// import createSpeechServicesPonyfill from "web-speech-cognitive-services";
|
|
13
|
+
|
|
14
|
+
const SpeechRecognizer = props => {
|
|
15
|
+
const {
|
|
16
|
+
finalTranscript,
|
|
17
|
+
interimTranscript,
|
|
18
|
+
resetTranscript,
|
|
19
|
+
listening
|
|
20
|
+
} = (0, _reactSpeechRecognition.useSpeechRecognition)();
|
|
21
|
+
(0, _react.useEffect)(() => {
|
|
22
|
+
if (props.shouldListen && !listening) {
|
|
23
|
+
_reactSpeechRecognition.default.startListening({
|
|
24
|
+
continuous: true,
|
|
25
|
+
interimResults: true,
|
|
26
|
+
language: props.language || "en-US"
|
|
27
|
+
});
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (!props.shouldListen && listening) {
|
|
31
|
+
_reactSpeechRecognition.default.stopListening();
|
|
32
|
+
}
|
|
33
|
+
}, [props.shouldListen, props.language, listening]);
|
|
34
|
+
(0, _react.useEffect)(() => {
|
|
35
|
+
props.speechStatusCallback(interimTranscript !== "", interimTranscript);
|
|
36
|
+
}, [interimTranscript, props.speechStatusCallback]);
|
|
37
|
+
(0, _react.useEffect)(() => {
|
|
38
|
+
const trimmedFinal = finalTranscript.trim();
|
|
39
|
+
if (trimmedFinal !== "") {
|
|
40
|
+
props.speechResultCallback(trimmedFinal);
|
|
41
|
+
props.speechStatusCallback(false, "");
|
|
42
|
+
resetTranscript();
|
|
43
|
+
}
|
|
44
|
+
}, [finalTranscript, resetTranscript, props.speechResultCallback, props.speechStatusCallback]);
|
|
45
|
+
|
|
46
|
+
// // initialize Azure speech services by creating a ponyfill
|
|
47
|
+
// useEffect(() => {
|
|
48
|
+
// const { SpeechRecognition: AzureSpeechRecognition } =
|
|
49
|
+
// createSpeechServicesPonyfill({
|
|
50
|
+
// credentials: {
|
|
51
|
+
// region: props.azureSpeechRegion,
|
|
52
|
+
// subscriptionKey: props.azureSpeechKey,
|
|
53
|
+
// },
|
|
54
|
+
// });
|
|
55
|
+
// SpeechRecognition.applyPolyfill(AzureSpeechRecognition);
|
|
56
|
+
// }, []);
|
|
57
|
+
|
|
58
|
+
return /*#__PURE__*/_react.default.createElement(_reactNative.View, null);
|
|
59
|
+
};
|
|
60
|
+
exports.SpeechRecognizer = SpeechRecognizer;
|
|
61
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXF1aXJlIiwiX3JlYWN0U3BlZWNoUmVjb2duaXRpb24iLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9yZWFjdCIsIl9yZWFjdE5hdGl2ZSIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJzZXQiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIlNwZWVjaFJlY29nbml6ZXIiLCJwcm9wcyIsImZpbmFsVHJhbnNjcmlwdCIsImludGVyaW1UcmFuc2NyaXB0IiwicmVzZXRUcmFuc2NyaXB0IiwibGlzdGVuaW5nIiwidXNlU3BlZWNoUmVjb2duaXRpb24iLCJ1c2VFZmZlY3QiLCJzaG91bGRMaXN0ZW4iLCJTcGVlY2hSZWNvZ25pdGlvbiIsInN0YXJ0TGlzdGVuaW5nIiwiY29udGludW91cyIsImludGVyaW1SZXN1bHRzIiwibGFuZ3VhZ2UiLCJzdG9wTGlzdGVuaW5nIiwic3BlZWNoU3RhdHVzQ2FsbGJhY2siLCJ0cmltbWVkRmluYWwiLCJ0cmltIiwic3BlZWNoUmVzdWx0Q2FsbGJhY2siLCJjcmVhdGVFbGVtZW50IiwiVmlldyIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi9zcmMvc3BlZWNoLXJlY29nbml0aW9uLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXCJyZWdlbmVyYXRvci1ydW50aW1lXCI7XG5pbXBvcnQgU3BlZWNoUmVjb2duaXRpb24sIHtcbiAgdXNlU3BlZWNoUmVjb2duaXRpb24sXG59IGZyb20gXCJyZWFjdC1zcGVlY2gtcmVjb2duaXRpb25cIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFZpZXcgfSBmcm9tIFwicmVhY3QtbmF0aXZlXCI7XG4vLyBpbXBvcnQgY3JlYXRlU3BlZWNoU2VydmljZXNQb255ZmlsbCBmcm9tIFwid2ViLXNwZWVjaC1jb2duaXRpdmUtc2VydmljZXNcIjtcblxuZXhwb3J0IGNvbnN0IFNwZWVjaFJlY29nbml6ZXIgPSAocHJvcHM6IHtcbiAgc2hvdWxkTGlzdGVuOiBib29sZWFuO1xuICBzcGVlY2hTdGF0dXNDYWxsYmFjazogKHN0YXR1czogYm9vbGVhbiwgdHJhbnNjcmlwdDogc3RyaW5nKSA9PiB2b2lkO1xuICBzcGVlY2hSZXN1bHRDYWxsYmFjazogKHJlc3VsdDogc3RyaW5nKSA9PiB2b2lkO1xuICBsYW5ndWFnZT86IHN0cmluZztcbiAgLy8gYXp1cmVTcGVlY2hSZWdpb246IHN0cmluZztcbiAgLy8gYXp1cmVTcGVlY2hLZXk6IHN0cmluZztcbn0pID0+IHtcbiAgY29uc3QgeyBmaW5hbFRyYW5zY3JpcHQsIGludGVyaW1UcmFuc2NyaXB0LCByZXNldFRyYW5zY3JpcHQsIGxpc3RlbmluZyB9ID1cbiAgICB1c2VTcGVlY2hSZWNvZ25pdGlvbigpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHByb3BzLnNob3VsZExpc3RlbiAmJiAhbGlzdGVuaW5nKSB7XG4gICAgICBTcGVlY2hSZWNvZ25pdGlvbi5zdGFydExpc3RlbmluZyh7XG4gICAgICAgIGNvbnRpbnVvdXM6IHRydWUsXG4gICAgICAgIGludGVyaW1SZXN1bHRzOiB0cnVlLFxuICAgICAgICBsYW5ndWFnZTogcHJvcHMubGFuZ3VhZ2UgfHwgXCJlbi1VU1wiLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghcHJvcHMuc2hvdWxkTGlzdGVuICYmIGxpc3RlbmluZykge1xuICAgICAgU3BlZWNoUmVjb2duaXRpb24uc3RvcExpc3RlbmluZygpO1xuICAgIH1cbiAgfSwgW3Byb3BzLnNob3VsZExpc3RlbiwgcHJvcHMubGFuZ3VhZ2UsIGxpc3RlbmluZ10pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgcHJvcHMuc3BlZWNoU3RhdHVzQ2FsbGJhY2soaW50ZXJpbVRyYW5zY3JpcHQgIT09IFwiXCIsIGludGVyaW1UcmFuc2NyaXB0KTtcbiAgfSwgW2ludGVyaW1UcmFuc2NyaXB0LCBwcm9wcy5zcGVlY2hTdGF0dXNDYWxsYmFja10pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgdHJpbW1lZEZpbmFsID0gZmluYWxUcmFuc2NyaXB0LnRyaW0oKTtcbiAgICBpZiAodHJpbW1lZEZpbmFsICE9PSBcIlwiKSB7XG4gICAgICBwcm9wcy5zcGVlY2hSZXN1bHRDYWxsYmFjayh0cmltbWVkRmluYWwpO1xuICAgICAgcHJvcHMuc3BlZWNoU3RhdHVzQ2FsbGJhY2soZmFsc2UsIFwiXCIpO1xuICAgICAgcmVzZXRUcmFuc2NyaXB0KCk7XG4gICAgfVxuICB9LCBbZmluYWxUcmFuc2NyaXB0LCByZXNldFRyYW5zY3JpcHQsIHByb3BzLnNwZWVjaFJlc3VsdENhbGxiYWNrLCBwcm9wcy5zcGVlY2hTdGF0dXNDYWxsYmFja10pO1xuXG4gIC8vIC8vIGluaXRpYWxpemUgQXp1cmUgc3BlZWNoIHNlcnZpY2VzIGJ5IGNyZWF0aW5nIGEgcG9ueWZpbGxcbiAgLy8gdXNlRWZmZWN0KCgpID0+IHtcbiAgLy8gICBjb25zdCB7IFNwZWVjaFJlY29nbml0aW9uOiBBenVyZVNwZWVjaFJlY29nbml0aW9uIH0gPVxuICAvLyAgICAgY3JlYXRlU3BlZWNoU2VydmljZXNQb255ZmlsbCh7XG4gIC8vICAgICAgIGNyZWRlbnRpYWxzOiB7XG4gIC8vICAgICAgICAgcmVnaW9uOiBwcm9wcy5henVyZVNwZWVjaFJlZ2lvbixcbiAgLy8gICAgICAgICBzdWJzY3JpcHRpb25LZXk6IHByb3BzLmF6dXJlU3BlZWNoS2V5LFxuICAvLyAgICAgICB9LFxuICAvLyAgICAgfSk7XG4gIC8vICAgU3BlZWNoUmVjb2duaXRpb24uYXBwbHlQb2x5ZmlsbChBenVyZVNwZWVjaFJlY29nbml0aW9uKTtcbiAgLy8gfSwgW10pO1xuXG4gIHJldHVybiA8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
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export type VoicePipelineOutcome = "speech_response_sent" | "speech_response_timeout" | "error" | "aborted";
|
|
2
|
+
export type VoicePipelineStage = "voice.processing" | "stt.listen" | "stt.final_transcript" | "dsl.parse" | "dsl.execute" | "ui.display" | "speech.respond";
|
|
3
|
+
export type VoicePipelineStageStatus = "ok" | "error" | "skipped" | "cancelled";
|
|
4
|
+
export type VoicePipelineContext = {
|
|
5
|
+
sessionId: number;
|
|
6
|
+
threadId?: string | null;
|
|
7
|
+
turnId?: string | null;
|
|
8
|
+
provider?: string;
|
|
9
|
+
language?: string;
|
|
10
|
+
platform?: string;
|
|
11
|
+
};
|
|
12
|
+
export interface VoicePipelineStageHandle {
|
|
13
|
+
annotate?: (context?: Record<string, unknown>) => void;
|
|
14
|
+
finish?: (status: VoicePipelineStageStatus, context?: Record<string, unknown>) => void;
|
|
15
|
+
}
|
|
16
|
+
export interface VoicePipelineHandle {
|
|
17
|
+
annotate?: (context?: Record<string, unknown>) => void;
|
|
18
|
+
getRequestHeaders?: () => Record<string, string | undefined>;
|
|
19
|
+
startStage?: (stage: VoicePipelineStage, context?: Record<string, unknown>) => VoicePipelineStageHandle | null | void;
|
|
20
|
+
finish?: (outcome: VoicePipelineOutcome, context?: Record<string, unknown>) => void;
|
|
21
|
+
}
|
|
22
|
+
export interface VoicePipelineTelemetryBridge {
|
|
23
|
+
startPipeline?: (context: VoicePipelineContext) => VoicePipelineHandle | null | void;
|
|
24
|
+
}
|
|
25
|
+
export declare function setVoicePipelineTelemetryBridge(bridge?: VoicePipelineTelemetryBridge | null): void;
|
|
26
|
+
export declare function getVoicePipelineTelemetryBridge(): VoicePipelineTelemetryBridge | null;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getVoicePipelineTelemetryBridge = getVoicePipelineTelemetryBridge;
|
|
7
|
+
exports.setVoicePipelineTelemetryBridge = setVoicePipelineTelemetryBridge;
|
|
8
|
+
let activeVoicePipelineTelemetryBridge = null;
|
|
9
|
+
function setVoicePipelineTelemetryBridge(bridge) {
|
|
10
|
+
activeVoicePipelineTelemetryBridge = bridge ?? null;
|
|
11
|
+
}
|
|
12
|
+
function getVoicePipelineTelemetryBridge() {
|
|
13
|
+
return activeVoicePipelineTelemetryBridge;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhY3RpdmVWb2ljZVBpcGVsaW5lVGVsZW1ldHJ5QnJpZGdlIiwic2V0Vm9pY2VQaXBlbGluZVRlbGVtZXRyeUJyaWRnZSIsImJyaWRnZSIsImdldFZvaWNlUGlwZWxpbmVUZWxlbWV0cnlCcmlkZ2UiXSwic291cmNlcyI6WyIuLi9zcmMvdm9pY2UtcGlwZWxpbmUtdGVsZW1ldHJ5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFZvaWNlUGlwZWxpbmVPdXRjb21lID1cbiAgfCBcInNwZWVjaF9yZXNwb25zZV9zZW50XCJcbiAgfCBcInNwZWVjaF9yZXNwb25zZV90aW1lb3V0XCJcbiAgfCBcImVycm9yXCJcbiAgfCBcImFib3J0ZWRcIjtcblxuZXhwb3J0IHR5cGUgVm9pY2VQaXBlbGluZVN0YWdlID1cbiAgfCBcInZvaWNlLnByb2Nlc3NpbmdcIlxuICB8IFwic3R0Lmxpc3RlblwiXG4gIHwgXCJzdHQuZmluYWxfdHJhbnNjcmlwdFwiXG4gIHwgXCJkc2wucGFyc2VcIlxuICB8IFwiZHNsLmV4ZWN1dGVcIlxuICB8IFwidWkuZGlzcGxheVwiXG4gIHwgXCJzcGVlY2gucmVzcG9uZFwiO1xuXG5leHBvcnQgdHlwZSBWb2ljZVBpcGVsaW5lU3RhZ2VTdGF0dXMgPSBcIm9rXCIgfCBcImVycm9yXCIgfCBcInNraXBwZWRcIiB8IFwiY2FuY2VsbGVkXCI7XG5cbmV4cG9ydCB0eXBlIFZvaWNlUGlwZWxpbmVDb250ZXh0ID0ge1xuICBzZXNzaW9uSWQ6IG51bWJlcjtcbiAgdGhyZWFkSWQ/OiBzdHJpbmcgfCBudWxsO1xuICB0dXJuSWQ/OiBzdHJpbmcgfCBudWxsO1xuICBwcm92aWRlcj86IHN0cmluZztcbiAgbGFuZ3VhZ2U/OiBzdHJpbmc7XG4gIHBsYXRmb3JtPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBWb2ljZVBpcGVsaW5lU3RhZ2VIYW5kbGUge1xuICBhbm5vdGF0ZT86IChjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG4gIGZpbmlzaD86IChcbiAgICBzdGF0dXM6IFZvaWNlUGlwZWxpbmVTdGFnZVN0YXR1cyxcbiAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZvaWNlUGlwZWxpbmVIYW5kbGUge1xuICBhbm5vdGF0ZT86IChjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG4gIGdldFJlcXVlc3RIZWFkZXJzPzogKCkgPT4gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPjtcbiAgc3RhcnRTdGFnZT86IChcbiAgICBzdGFnZTogVm9pY2VQaXBlbGluZVN0YWdlLFxuICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApID0+IFZvaWNlUGlwZWxpbmVTdGFnZUhhbmRsZSB8IG51bGwgfCB2b2lkO1xuICBmaW5pc2g/OiAoXG4gICAgb3V0Y29tZTogVm9pY2VQaXBlbGluZU91dGNvbWUsXG4gICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWb2ljZVBpcGVsaW5lVGVsZW1ldHJ5QnJpZGdlIHtcbiAgc3RhcnRQaXBlbGluZT86IChcbiAgICBjb250ZXh0OiBWb2ljZVBpcGVsaW5lQ29udGV4dFxuICApID0+IFZvaWNlUGlwZWxpbmVIYW5kbGUgfCBudWxsIHwgdm9pZDtcbn1cblxubGV0IGFjdGl2ZVZvaWNlUGlwZWxpbmVUZWxlbWV0cnlCcmlkZ2U6IFZvaWNlUGlwZWxpbmVUZWxlbWV0cnlCcmlkZ2UgfCBudWxsID0gbnVsbDtcblxuZXhwb3J0IGZ1bmN0aW9uIHNldFZvaWNlUGlwZWxpbmVUZWxlbWV0cnlCcmlkZ2UoXG4gIGJyaWRnZT86IFZvaWNlUGlwZWxpbmVUZWxlbWV0cnlCcmlkZ2UgfCBudWxsXG4pIHtcbiAgYWN0aXZlVm9pY2VQaXBlbGluZVRlbGVtZXRyeUJyaWRnZSA9IGJyaWRnZSA/PyBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vm9pY2VQaXBlbGluZVRlbGVtZXRyeUJyaWRnZSgpOiBWb2ljZVBpcGVsaW5lVGVsZW1ldHJ5QnJpZGdlIHwgbnVsbCB7XG4gIHJldHVybiBhY3RpdmVWb2ljZVBpcGVsaW5lVGVsZW1ldHJ5QnJpZGdlO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBcURBLElBQUlBLGtDQUF1RSxHQUFHLElBQUk7QUFFM0UsU0FBU0MsK0JBQStCQSxDQUM3Q0MsTUFBNEMsRUFDNUM7RUFDQUYsa0NBQWtDLEdBQUdFLE1BQU0sSUFBSSxJQUFJO0FBQ3JEO0FBRU8sU0FBU0MsK0JBQStCQSxDQUFBLEVBQXdDO0VBQ3JGLE9BQU9ILGtDQUFrQztBQUMzQyIsImlnbm9yZUxpc3QiOltdfQ==
|
|
Binary file
|
package/metro/index.js
ADDED