@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.
Files changed (85) hide show
  1. package/.env.example +22 -0
  2. package/.github/workflows/publish.yml +20 -0
  3. package/LICENSE.txt +201 -0
  4. package/README.md +621 -0
  5. package/babel.config.js +29 -0
  6. package/dist/adapters/__tests__/expo-router-adapter.test.d.ts +1 -0
  7. package/dist/adapters/expo-router-adapter.d.ts +16 -0
  8. package/dist/adapters/expo-router-adapter.js +521 -0
  9. package/dist/adapters/navigation-adapter.d.ts +20 -0
  10. package/dist/adapters/navigation-adapter.js +137 -0
  11. package/dist/audio-visualizer.d.ts +14 -0
  12. package/dist/audio-visualizer.js +123 -0
  13. package/dist/current-selection.d.ts +27 -0
  14. package/dist/current-selection.js +94 -0
  15. package/dist/errors.d.ts +19 -0
  16. package/dist/errors.js +37 -0
  17. package/dist/genie/DateTime.d.ts +66 -0
  18. package/dist/genie/DateTime.js +399 -0
  19. package/dist/genie/TimeDelta.d.ts +35 -0
  20. package/dist/genie/TimeDelta.js +169 -0
  21. package/dist/genie-view-wrapper.d.ts +1 -0
  22. package/dist/genie-view-wrapper.js +377 -0
  23. package/dist/hooks/__tests__/useSpeechRecognition.test.d.ts +1 -0
  24. package/dist/hooks/useSpeechRecognition.d.ts +28 -0
  25. package/dist/hooks/useSpeechRecognition.js +118 -0
  26. package/dist/index.d.ts +30 -0
  27. package/dist/index.js +469 -0
  28. package/dist/logger.d.ts +23 -0
  29. package/dist/logger.js +597 -0
  30. package/dist/logger.remote.test.d.ts +0 -0
  31. package/dist/modality-provider-v2.d.ts +28 -0
  32. package/dist/modality-provider-v2.js +1321 -0
  33. package/dist/modality-provider.d.ts +22 -0
  34. package/dist/modality-provider.js +373 -0
  35. package/dist/native-visibility.d.ts +28 -0
  36. package/dist/native-visibility.js +50 -0
  37. package/dist/platform/VoiceRecognitionBar.d.ts +17 -0
  38. package/dist/platform/VoiceRecognitionBar.js +332 -0
  39. package/dist/platform/components.d.ts +32 -0
  40. package/dist/platform/components.js +351 -0
  41. package/dist/platform/events.d.ts +31 -0
  42. package/dist/platform/events.js +274 -0
  43. package/dist/platform/index.d.ts +3 -0
  44. package/dist/platform/index.js +39 -0
  45. package/dist/platform/types.d.ts +79 -0
  46. package/dist/platform/types.js +97 -0
  47. package/dist/react-decorators.d.ts +87 -0
  48. package/dist/react-decorators.js +368 -0
  49. package/dist/shared-store.d.ts +74 -0
  50. package/dist/shared-store.js +589 -0
  51. package/dist/speech-recognition/__tests__/speech-recognition-groq-transport.test.d.ts +1 -0
  52. package/dist/speech-recognition/__tests__/speech-recognition-native.test.d.ts +1 -0
  53. package/dist/speech-recognition/__tests__/speech-recognition-openai-native.test.d.ts +1 -0
  54. package/dist/speech-recognition/__tests__/speech-recognition-openai.test.d.ts +1 -0
  55. package/dist/speech-recognition/__tests__/speech-recognition-unified-import.test.d.ts +0 -0
  56. package/dist/speech-recognition/__tests__/speech-recognition-unified.test.d.ts +1 -0
  57. package/dist/speech-recognition/speech-recognition-groq.d.ts +21 -0
  58. package/dist/speech-recognition/speech-recognition-groq.js +409 -0
  59. package/dist/speech-recognition/speech-recognition-mlx.d.ts +15 -0
  60. package/dist/speech-recognition/speech-recognition-mlx.js +393 -0
  61. package/dist/speech-recognition/speech-recognition-native.d.ts +24 -0
  62. package/dist/speech-recognition/speech-recognition-native.js +632 -0
  63. package/dist/speech-recognition/speech-recognition-openai-native.d.ts +40 -0
  64. package/dist/speech-recognition/speech-recognition-openai-native.js +653 -0
  65. package/dist/speech-recognition/speech-recognition-openai.d.ts +39 -0
  66. package/dist/speech-recognition/speech-recognition-openai.js +718 -0
  67. package/dist/speech-recognition/speech-recognition-unified.d.ts +93 -0
  68. package/dist/speech-recognition/speech-recognition-unified.js +589 -0
  69. package/dist/speech-recognition/utils/groq-transcription.d.ts +41 -0
  70. package/dist/speech-recognition/utils/groq-transcription.js +382 -0
  71. package/dist/speech-recognition.d.ts +7 -0
  72. package/dist/speech-recognition.js +61 -0
  73. package/dist/voice-pipeline-telemetry.d.ts +26 -0
  74. package/dist/voice-pipeline-telemetry.js +15 -0
  75. package/garrix82-reactgenie-lib-1.3.0.tgz +0 -0
  76. package/metro/index.js +3 -0
  77. package/metro/with-genie-registry.js +47 -0
  78. package/package.json +111 -0
  79. package/scripts/dry-run.js +23 -0
  80. package/scripts/generate-genie-registry.js +278 -0
  81. package/scripts/log-file-test.js +51 -0
  82. package/scripts/parse.js +26 -0
  83. package/scripts/prompt.js +19 -0
  84. package/scripts/set-script.js +200 -0
  85. 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,7 @@
1
+ import "regenerator-runtime";
2
+ export declare const SpeechRecognizer: (props: {
3
+ shouldListen: boolean;
4
+ speechStatusCallback: (status: boolean, transcript: string) => void;
5
+ speechResultCallback: (result: string) => void;
6
+ language?: string;
7
+ }) => any;
@@ -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==
package/metro/index.js ADDED
@@ -0,0 +1,3 @@
1
+ module.exports = {
2
+ withGenieRegistry: require("./with-genie-registry").withGenieRegistry,
3
+ };