@projectcor/maia-components 2.11.31-2 → 2.11.31-3
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/lib/components/atoms/FeedbackButton/FeedbackButton.styles.js +2 -2
- package/lib/components/atoms/icons/ChatConversation.js +40 -0
- package/lib/components/atoms/icons/MaiaChatLayoutMenuIcon.js +33 -0
- package/lib/components/atoms/icons/index.js +3 -1
- package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.js +41 -10
- package/lib/components/molecules/ChatAIContent/ChatAIContent.js +7 -4
- package/lib/components/molecules/ChatAIHistory/ChatAIHistory.js +16 -3
- package/lib/components/molecules/ChatAIHome/ChatAIHome.js +54 -44
- package/lib/components/molecules/ChatAIHome/styles.js +43 -35
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +204 -205
- package/lib/components/molecules/ChatAIMessages/ChatDaySeparator.js +43 -0
- package/lib/components/molecules/ChatAIMessages/ChatDaySeparator.styles.js +11 -0
- package/lib/components/molecules/ChatAIMessages/chatMessageUtils.js +5 -0
- package/lib/components/molecules/ChatAIModal/ChatAIModal.js +343 -100
- package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +28 -15
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +91 -18
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.styles.js +17 -2
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.js +13 -0
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.styles.js +9 -0
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/constants.js +13 -0
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/index.js +3 -0
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.js +57 -0
- package/lib/components/molecules/ChatAIModal/layout.js +35 -0
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +10 -9
- package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.js +37 -6
- package/lib/components/molecules/Sidebar/Sidebar.js +269 -323
- package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +18 -23
- package/lib/components/molecules/Sidebar/Sidebar.styles.js +54 -37
- package/lib/components/molecules/Sidebar/SidebarChats.styles.js +73 -0
- package/lib/components/molecules/Sidebar/SidebarChatsSection.js +69 -0
- package/lib/components/molecules/Sidebar/SidebarChatsSectionModal.js +150 -0
- package/lib/components/molecules/Sidebar/SidebarHistoryChat.js +238 -0
- package/lib/components/molecules/Sidebar/sidebarChats.helpers.js +70 -0
- package/lib/components/molecules/Sidebar/sidebarChats.types.js +14 -0
- package/lib/dev/Providers.js +2 -2
- package/lib/dev/fixtures/devUser.js +173 -0
- package/lib/dev/fixtures/mockedUser.js +169 -0
- package/lib/hooks/useChatManager/useChatManager.js +35 -85
- package/lib/hooks/useChats/useChats.js +12 -4
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +76 -142
- package/lib/hooks/useProjectSearch.js +11 -4
- package/lib/lang/br/index.js +19 -2
- package/lib/lang/en/index.js +19 -2
- package/lib/lang/es/index.js +19 -2
- package/lib/lang/fr/index.js +19 -2
- package/lib/services/maia/Chats/getChatMessagesV2.js +114 -0
- package/lib/services/maia/Chats/getChatsByUserId.js +14 -8
- package/lib/services/maia/Chats/getSessionByAgent.js +66 -0
- package/lib/services/maia/Chats/getSessionsGroupedV2.js +70 -0
- package/lib/services/maia/Chats/index.js +7 -1
- package/lib/services/maia/Orchestrator/orchestrator.js +6 -4
- package/lib/services/maia/client.js +44 -9
- package/lib/services/query/projectSearchByValueQuery.js +2 -2
- package/lib/store/chatsStore.types.js +10 -2
- package/lib/store/useChatsStore.js +75 -37
- package/lib/types/Chat.js +3 -1
- package/lib/types/Project.js +1 -1
- package/package.json +1 -1
- package/lib/hooks/useSmoothStreamText/index.js +0 -2
- package/lib/hooks/useSmoothStreamText/useSmoothStreamText.js +0 -303
- package/lib/hooks/useStreamingMessage/index.js +0 -3
- package/lib/hooks/useStreamingMessage/streamingStore.js +0 -69
- package/lib/hooks/useStreamingMessage/useStreamingMessage.js +0 -22
- package/lib/mocks/mockChats.js +0 -395
- package/lib/mocks/mockedUser.js +0 -169
|
@@ -1,303 +0,0 @@
|
|
|
1
|
-
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
|
-
/* eslint-disable no-console */
|
|
3
|
-
import { useEffect, useRef, useState } from 'react';
|
|
4
|
-
/**
|
|
5
|
-
* Hook que desacopla la cadencia de llegada del texto (stream SSE) de la
|
|
6
|
-
* cadencia de renderizado. Usa `requestAnimationFrame` para liberar chars
|
|
7
|
-
* a ritmo constante hacia el DOM, eliminando los "frenos" que se producen
|
|
8
|
-
* cuando el backend emite ráfagas de tokens.
|
|
9
|
-
*
|
|
10
|
-
* Cuando `enabled` pasa a false (fin de stream), el texto se completa al
|
|
11
|
-
* instante. Durante el streaming, el buffer se vacía dinámicamente apuntando
|
|
12
|
-
* al lag configurado.
|
|
13
|
-
*/
|
|
14
|
-
export var useSmoothStreamText = function useSmoothStreamText(targetText, _ref) {
|
|
15
|
-
var enabled = _ref.enabled,
|
|
16
|
-
_ref$minCharsPerFrame = _ref.minCharsPerFrame,
|
|
17
|
-
minCharsPerFrame = _ref$minCharsPerFrame === void 0 ? 1 : _ref$minCharsPerFrame,
|
|
18
|
-
_ref$maxCharsPerFrame = _ref.maxCharsPerFrame,
|
|
19
|
-
maxCharsPerFrame = _ref$maxCharsPerFrame === void 0 ? 24 : _ref$maxCharsPerFrame,
|
|
20
|
-
_ref$targetLagMs = _ref.targetLagMs,
|
|
21
|
-
targetLagMs = _ref$targetLagMs === void 0 ? 450 : _ref$targetLagMs,
|
|
22
|
-
_ref$snapToWordBounda = _ref.snapToWordBoundary,
|
|
23
|
-
snapToWordBoundary = _ref$snapToWordBounda === void 0 ? false : _ref$snapToWordBounda,
|
|
24
|
-
_ref$adaptToBackendRa = _ref.adaptToBackendRate,
|
|
25
|
-
adaptToBackendRate = _ref$adaptToBackendRa === void 0 ? true : _ref$adaptToBackendRa,
|
|
26
|
-
_ref$backendRateFacto = _ref.backendRateFactor,
|
|
27
|
-
backendRateFactor = _ref$backendRateFacto === void 0 ? 0.95 : _ref$backendRateFacto,
|
|
28
|
-
_ref$targetBufferMs = _ref.targetBufferMs,
|
|
29
|
-
targetBufferMs = _ref$targetBufferMs === void 0 ? 600 : _ref$targetBufferMs,
|
|
30
|
-
_ref$bufferCorrection = _ref.bufferCorrectionMs,
|
|
31
|
-
bufferCorrectionMs = _ref$bufferCorrection === void 0 ? 500 : _ref$bufferCorrection,
|
|
32
|
-
_ref$minBufferChars = _ref.minBufferChars,
|
|
33
|
-
minBufferChars = _ref$minBufferChars === void 0 ? 70 : _ref$minBufferChars,
|
|
34
|
-
_ref$warmupMs = _ref.warmupMs,
|
|
35
|
-
warmupMs = _ref$warmupMs === void 0 ? 400 : _ref$warmupMs,
|
|
36
|
-
_ref$debug = _ref.debug,
|
|
37
|
-
debug = _ref$debug === void 0 ? false : _ref$debug,
|
|
38
|
-
_ref$debugLabel = _ref.debugLabel,
|
|
39
|
-
debugLabel = _ref$debugLabel === void 0 ? 'smoothStream' : _ref$debugLabel;
|
|
40
|
-
var _useState = useState(function () {
|
|
41
|
-
return enabled ? '' : targetText;
|
|
42
|
-
}),
|
|
43
|
-
_useState2 = _slicedToArray(_useState, 2),
|
|
44
|
-
displayed = _useState2[0],
|
|
45
|
-
setDisplayed = _useState2[1];
|
|
46
|
-
var targetRef = useRef(targetText);
|
|
47
|
-
var displayedLenRef = useRef(displayed.length);
|
|
48
|
-
var rafRef = useRef(null);
|
|
49
|
-
var lastTickRef = useRef(0);
|
|
50
|
-
|
|
51
|
-
// Medición de la cadencia del backend: se actualiza cuando cambia targetText.
|
|
52
|
-
var lastTargetLenRef = useRef(0);
|
|
53
|
-
var lastTargetUpdateRef = useRef(0);
|
|
54
|
-
// Estimación EMA de chars/ms producidos por el backend.
|
|
55
|
-
var backendCharsPerMsRef = useRef(0);
|
|
56
|
-
// Timestamp del primer chunk recibido (para warmup).
|
|
57
|
-
var firstChunkAtRef = useRef(0);
|
|
58
|
-
// Si el warmup ya terminó (una vez true, no vuelve a activarse en este stream).
|
|
59
|
-
var warmupDoneRef = useRef(false);
|
|
60
|
-
|
|
61
|
-
// Métricas para debug
|
|
62
|
-
var metricsRef = useRef({
|
|
63
|
-
framesWithBuffer: 0,
|
|
64
|
-
framesIdle: 0,
|
|
65
|
-
totalCharsEmitted: 0,
|
|
66
|
-
maxBuffer: 0,
|
|
67
|
-
idleTimeMs: 0,
|
|
68
|
-
chunksSeen: 0,
|
|
69
|
-
interChunkSum: 0,
|
|
70
|
-
interChunkMax: 0,
|
|
71
|
-
lastLogAt: 0,
|
|
72
|
-
streamStartAt: 0
|
|
73
|
-
});
|
|
74
|
-
useEffect(function () {
|
|
75
|
-
var now = typeof performance !== 'undefined' ? performance.now() : Date.now();
|
|
76
|
-
var prevTargetLen = lastTargetLenRef.current;
|
|
77
|
-
var deltaChars = targetText.length - prevTargetLen;
|
|
78
|
-
var prevTargetAt = lastTargetUpdateRef.current;
|
|
79
|
-
if (enabled && deltaChars > 0) {
|
|
80
|
-
if (firstChunkAtRef.current === 0) firstChunkAtRef.current = now;
|
|
81
|
-
}
|
|
82
|
-
if (enabled && deltaChars > 0 && prevTargetAt > 0) {
|
|
83
|
-
var dt = Math.max(1, now - prevTargetAt);
|
|
84
|
-
var rate = deltaChars / dt;
|
|
85
|
-
var prevRate = backendCharsPerMsRef.current;
|
|
86
|
-
// EMA suave (alpha = 0.2) para absorber jitter y seguir la tendencia.
|
|
87
|
-
backendCharsPerMsRef.current = prevRate === 0 ? rate : prevRate * 0.8 + rate * 0.2;
|
|
88
|
-
if (debug) {
|
|
89
|
-
var m = metricsRef.current;
|
|
90
|
-
m.chunksSeen += 1;
|
|
91
|
-
m.interChunkSum += dt;
|
|
92
|
-
if (dt > m.interChunkMax) m.interChunkMax = dt;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
if (enabled && targetText.length !== prevTargetLen) {
|
|
96
|
-
lastTargetLenRef.current = targetText.length;
|
|
97
|
-
lastTargetUpdateRef.current = now;
|
|
98
|
-
}
|
|
99
|
-
targetRef.current = targetText;
|
|
100
|
-
if (!enabled) {
|
|
101
|
-
if (rafRef.current != null) {
|
|
102
|
-
cancelAnimationFrame(rafRef.current);
|
|
103
|
-
rafRef.current = null;
|
|
104
|
-
}
|
|
105
|
-
lastTickRef.current = 0;
|
|
106
|
-
if (debug && metricsRef.current.streamStartAt > 0) {
|
|
107
|
-
var _m = metricsRef.current;
|
|
108
|
-
var totalMs = now - _m.streamStartAt;
|
|
109
|
-
console.log("[".concat(debugLabel, "] FINAL"), {
|
|
110
|
-
totalMs: Math.round(totalMs),
|
|
111
|
-
finalChars: targetText.length,
|
|
112
|
-
backendAvgCharsPerSec: _m.chunksSeen > 0 ? Math.round(targetText.length / totalMs * 1000) : 0,
|
|
113
|
-
chunksSeen: _m.chunksSeen,
|
|
114
|
-
avgInterChunkMs: _m.chunksSeen > 0 ? Math.round(_m.interChunkSum / _m.chunksSeen) : 0,
|
|
115
|
-
maxInterChunkMs: Math.round(_m.interChunkMax),
|
|
116
|
-
idleTimeMs: Math.round(_m.idleTimeMs),
|
|
117
|
-
idleRatio: totalMs > 0 ? (_m.idleTimeMs / totalMs).toFixed(2) : '0',
|
|
118
|
-
maxBuffer: _m.maxBuffer
|
|
119
|
-
});
|
|
120
|
-
metricsRef.current = {
|
|
121
|
-
framesWithBuffer: 0,
|
|
122
|
-
framesIdle: 0,
|
|
123
|
-
totalCharsEmitted: 0,
|
|
124
|
-
maxBuffer: 0,
|
|
125
|
-
idleTimeMs: 0,
|
|
126
|
-
chunksSeen: 0,
|
|
127
|
-
interChunkSum: 0,
|
|
128
|
-
interChunkMax: 0,
|
|
129
|
-
lastLogAt: 0,
|
|
130
|
-
streamStartAt: 0
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
if (displayedLenRef.current !== targetText.length) {
|
|
134
|
-
displayedLenRef.current = targetText.length;
|
|
135
|
-
setDisplayed(targetText);
|
|
136
|
-
}
|
|
137
|
-
// Reset de cadencia cuando se apaga para no contaminar el próximo stream.
|
|
138
|
-
lastTargetLenRef.current = 0;
|
|
139
|
-
lastTargetUpdateRef.current = 0;
|
|
140
|
-
backendCharsPerMsRef.current = 0;
|
|
141
|
-
firstChunkAtRef.current = 0;
|
|
142
|
-
warmupDoneRef.current = false;
|
|
143
|
-
return undefined;
|
|
144
|
-
}
|
|
145
|
-
if (debug && metricsRef.current.streamStartAt === 0) {
|
|
146
|
-
metricsRef.current.streamStartAt = now;
|
|
147
|
-
metricsRef.current.lastLogAt = now;
|
|
148
|
-
console.log("[".concat(debugLabel, "] START"), {
|
|
149
|
-
targetLagMs: targetLagMs,
|
|
150
|
-
maxCharsPerFrame: maxCharsPerFrame,
|
|
151
|
-
adaptToBackendRate: adaptToBackendRate,
|
|
152
|
-
backendRateFactor: backendRateFactor,
|
|
153
|
-
targetBufferMs: targetBufferMs,
|
|
154
|
-
bufferCorrectionMs: bufferCorrectionMs,
|
|
155
|
-
minBufferChars: minBufferChars,
|
|
156
|
-
warmupMs: warmupMs
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
if (displayedLenRef.current > targetText.length) {
|
|
160
|
-
displayedLenRef.current = 0;
|
|
161
|
-
setDisplayed('');
|
|
162
|
-
}
|
|
163
|
-
if (rafRef.current != null) return undefined;
|
|
164
|
-
var logMetrics = function logMetrics(tickNow) {
|
|
165
|
-
var m = metricsRef.current;
|
|
166
|
-
var el = targetRef.current;
|
|
167
|
-
var buffer = el.length - displayedLenRef.current;
|
|
168
|
-
var windowMs = Math.max(1, tickNow - m.lastLogAt);
|
|
169
|
-
var totalFrames = m.framesWithBuffer + m.framesIdle;
|
|
170
|
-
var fps = Math.round(totalFrames / windowMs * 1000);
|
|
171
|
-
var backendRate = backendCharsPerMsRef.current;
|
|
172
|
-
console.log("[".concat(debugLabel, "] tick"), {
|
|
173
|
-
elapsedMs: Math.round(tickNow - m.streamStartAt),
|
|
174
|
-
buffer: buffer,
|
|
175
|
-
displayed: displayedLenRef.current,
|
|
176
|
-
target: el.length,
|
|
177
|
-
framesWithBuffer: m.framesWithBuffer,
|
|
178
|
-
framesIdle: m.framesIdle,
|
|
179
|
-
idleRatio: totalFrames > 0 ? (m.framesIdle / totalFrames).toFixed(2) : '0',
|
|
180
|
-
fps: fps,
|
|
181
|
-
backendCharsPerSec: Math.round(backendRate * 1000),
|
|
182
|
-
avgInterChunkMs: m.chunksSeen > 0 ? Math.round(m.interChunkSum / m.chunksSeen) : 0,
|
|
183
|
-
maxInterChunkMs: Math.round(m.interChunkMax)
|
|
184
|
-
});
|
|
185
|
-
m.framesWithBuffer = 0;
|
|
186
|
-
m.framesIdle = 0;
|
|
187
|
-
m.lastLogAt = tickNow;
|
|
188
|
-
};
|
|
189
|
-
var _tick = function tick(tickNow) {
|
|
190
|
-
var prev = lastTickRef.current;
|
|
191
|
-
var dt = prev ? Math.min(tickNow - prev, 64) : 16;
|
|
192
|
-
lastTickRef.current = tickNow;
|
|
193
|
-
var target = targetRef.current;
|
|
194
|
-
var currentLen = displayedLenRef.current;
|
|
195
|
-
var remaining = target.length - currentLen;
|
|
196
|
-
if (remaining <= 0) {
|
|
197
|
-
if (debug) {
|
|
198
|
-
metricsRef.current.framesIdle += 1;
|
|
199
|
-
metricsRef.current.idleTimeMs += dt;
|
|
200
|
-
}
|
|
201
|
-
rafRef.current = requestAnimationFrame(_tick);
|
|
202
|
-
// Log periódico aún estando idle (para ver si estamos esperando chunks)
|
|
203
|
-
if (debug && tickNow - metricsRef.current.lastLogAt > 500) {
|
|
204
|
-
logMetrics(tickNow);
|
|
205
|
-
}
|
|
206
|
-
return;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
// Warmup: al comienzo del stream esperamos `warmupMs` desde el primer
|
|
210
|
-
// chunk antes de empezar a pintar. Esto construye un colchón inicial y
|
|
211
|
-
// evita arrancar rápido para congelarnos acto seguido si el backend
|
|
212
|
-
// tarda mucho en emitir el segundo chunk.
|
|
213
|
-
if (!warmupDoneRef.current) {
|
|
214
|
-
var firstAt = firstChunkAtRef.current;
|
|
215
|
-
var waitedMs = firstAt > 0 ? tickNow - firstAt : 0;
|
|
216
|
-
var warmupComplete = warmupMs <= 0 || waitedMs >= warmupMs || target.length >= minBufferChars * 2;
|
|
217
|
-
if (!warmupComplete) {
|
|
218
|
-
if (debug) {
|
|
219
|
-
metricsRef.current.framesIdle += 1;
|
|
220
|
-
metricsRef.current.idleTimeMs += dt;
|
|
221
|
-
}
|
|
222
|
-
rafRef.current = requestAnimationFrame(_tick);
|
|
223
|
-
if (debug && tickNow - metricsRef.current.lastLogAt > 500) {
|
|
224
|
-
logMetrics(tickNow);
|
|
225
|
-
}
|
|
226
|
-
return;
|
|
227
|
-
}
|
|
228
|
-
warmupDoneRef.current = true;
|
|
229
|
-
}
|
|
230
|
-
if (debug) {
|
|
231
|
-
metricsRef.current.framesWithBuffer += 1;
|
|
232
|
-
if (remaining > metricsRef.current.maxBuffer) metricsRef.current.maxBuffer = remaining;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
// Velocidad base: vaciar el buffer en ~targetLagMs.
|
|
236
|
-
var charsPerMs = remaining / targetLagMs;
|
|
237
|
-
var effectiveCharsPerMs = charsPerMs;
|
|
238
|
-
var backendRate = backendCharsPerMsRef.current;
|
|
239
|
-
if (adaptToBackendRate && backendRate > 0) {
|
|
240
|
-
if (typeof targetBufferMs === 'number') {
|
|
241
|
-
// Control proporcional: mantener el buffer en torno al colchón
|
|
242
|
-
// objetivo. Si bufferMs < target → frenamos por debajo del backend
|
|
243
|
-
// para acumular; si bufferMs > target → aceleramos para descargar.
|
|
244
|
-
// En equilibrio, pintamos al ritmo promedio del backend.
|
|
245
|
-
//
|
|
246
|
-
// El colchón objetivo se calcula sobre la tasa **efectiva** que
|
|
247
|
-
// podemos pintar (capeada por `maxCharsPerFrame` a 60fps), no sobre
|
|
248
|
-
// la del backend pura. Esto evita el caso patológico de ráfagas:
|
|
249
|
-
// si el backend tira a 6500 ch/s, el target NO se vuelve 3900 chars
|
|
250
|
-
// (que el render jamás podría sostener), sino algo razonable que
|
|
251
|
-
// la animación pueda mantener.
|
|
252
|
-
//
|
|
253
|
-
// Piso absoluto: el colchón nunca baja de `minBufferChars` aunque
|
|
254
|
-
// el backend esté mandando lento al inicio del stream.
|
|
255
|
-
var renderRateCap = maxCharsPerFrame * 60 / 1000;
|
|
256
|
-
var effectiveBufferRate = Math.min(backendRate, renderRateCap);
|
|
257
|
-
var targetBufferChars = Math.max(minBufferChars, targetBufferMs * effectiveBufferRate);
|
|
258
|
-
var bufferDelta = remaining - targetBufferChars;
|
|
259
|
-
// Corrección tiene unidades de chars/ms. bufferCorrectionMs controla
|
|
260
|
-
// qué tan rápido el buffer real converge al objetivo.
|
|
261
|
-
var correction = bufferDelta / Math.max(1, bufferCorrectionMs);
|
|
262
|
-
effectiveCharsPerMs = Math.max(0, backendRate + correction);
|
|
263
|
-
// Acotar por la velocidad de "vaciar en targetLagMs" para que si
|
|
264
|
-
// de pronto hay un pico gigante de buffer no salgamos disparados.
|
|
265
|
-
effectiveCharsPerMs = Math.min(effectiveCharsPerMs, charsPerMs);
|
|
266
|
-
} else {
|
|
267
|
-
// Modo simple: cap a la tasa del backend * factor.
|
|
268
|
-
var cap = backendRate * backendRateFactor;
|
|
269
|
-
effectiveCharsPerMs = Math.min(effectiveCharsPerMs, cap);
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
var rawStep = Math.ceil(effectiveCharsPerMs * dt);
|
|
273
|
-
var step = Math.max(minCharsPerFrame, Math.min(maxCharsPerFrame, rawStep));
|
|
274
|
-
var nextLen = Math.min(target.length, currentLen + step);
|
|
275
|
-
if (snapToWordBoundary && nextLen < target.length) {
|
|
276
|
-
var slice = target.slice(currentLen, nextLen);
|
|
277
|
-
var lastBoundary = Math.max(slice.lastIndexOf(' '), slice.lastIndexOf('\n'), slice.lastIndexOf('\t'));
|
|
278
|
-
if (lastBoundary >= 0) {
|
|
279
|
-
nextLen = currentLen + lastBoundary + 1;
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
if (nextLen !== currentLen) {
|
|
283
|
-
if (debug) metricsRef.current.totalCharsEmitted += nextLen - currentLen;
|
|
284
|
-
displayedLenRef.current = nextLen;
|
|
285
|
-
setDisplayed(target.slice(0, nextLen));
|
|
286
|
-
}
|
|
287
|
-
if (debug && tickNow - metricsRef.current.lastLogAt > 500) {
|
|
288
|
-
logMetrics(tickNow);
|
|
289
|
-
}
|
|
290
|
-
rafRef.current = requestAnimationFrame(_tick);
|
|
291
|
-
};
|
|
292
|
-
rafRef.current = requestAnimationFrame(_tick);
|
|
293
|
-
return function () {
|
|
294
|
-
if (rafRef.current != null) {
|
|
295
|
-
cancelAnimationFrame(rafRef.current);
|
|
296
|
-
rafRef.current = null;
|
|
297
|
-
}
|
|
298
|
-
lastTickRef.current = 0;
|
|
299
|
-
};
|
|
300
|
-
}, [targetText, enabled, minCharsPerFrame, maxCharsPerFrame, targetLagMs, snapToWordBoundary, adaptToBackendRate, backendRateFactor, targetBufferMs, bufferCorrectionMs, minBufferChars, warmupMs, debug, debugLabel]);
|
|
301
|
-
return displayed;
|
|
302
|
-
};
|
|
303
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VFZmZlY3QiLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsInVzZVNtb290aFN0cmVhbVRleHQiLCJ0YXJnZXRUZXh0IiwiX3JlZiIsImVuYWJsZWQiLCJfcmVmJG1pbkNoYXJzUGVyRnJhbWUiLCJtaW5DaGFyc1BlckZyYW1lIiwiX3JlZiRtYXhDaGFyc1BlckZyYW1lIiwibWF4Q2hhcnNQZXJGcmFtZSIsIl9yZWYkdGFyZ2V0TGFnTXMiLCJ0YXJnZXRMYWdNcyIsIl9yZWYkc25hcFRvV29yZEJvdW5kYSIsInNuYXBUb1dvcmRCb3VuZGFyeSIsIl9yZWYkYWRhcHRUb0JhY2tlbmRSYSIsImFkYXB0VG9CYWNrZW5kUmF0ZSIsIl9yZWYkYmFja2VuZFJhdGVGYWN0byIsImJhY2tlbmRSYXRlRmFjdG9yIiwiX3JlZiR0YXJnZXRCdWZmZXJNcyIsInRhcmdldEJ1ZmZlck1zIiwiX3JlZiRidWZmZXJDb3JyZWN0aW9uIiwiYnVmZmVyQ29ycmVjdGlvbk1zIiwiX3JlZiRtaW5CdWZmZXJDaGFycyIsIm1pbkJ1ZmZlckNoYXJzIiwiX3JlZiR3YXJtdXBNcyIsIndhcm11cE1zIiwiX3JlZiRkZWJ1ZyIsImRlYnVnIiwiX3JlZiRkZWJ1Z0xhYmVsIiwiZGVidWdMYWJlbCIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsImRpc3BsYXllZCIsInNldERpc3BsYXllZCIsInRhcmdldFJlZiIsImRpc3BsYXllZExlblJlZiIsImxlbmd0aCIsInJhZlJlZiIsImxhc3RUaWNrUmVmIiwibGFzdFRhcmdldExlblJlZiIsImxhc3RUYXJnZXRVcGRhdGVSZWYiLCJiYWNrZW5kQ2hhcnNQZXJNc1JlZiIsImZpcnN0Q2h1bmtBdFJlZiIsIndhcm11cERvbmVSZWYiLCJtZXRyaWNzUmVmIiwiZnJhbWVzV2l0aEJ1ZmZlciIsImZyYW1lc0lkbGUiLCJ0b3RhbENoYXJzRW1pdHRlZCIsIm1heEJ1ZmZlciIsImlkbGVUaW1lTXMiLCJjaHVua3NTZWVuIiwiaW50ZXJDaHVua1N1bSIsImludGVyQ2h1bmtNYXgiLCJsYXN0TG9nQXQiLCJzdHJlYW1TdGFydEF0Iiwibm93IiwicGVyZm9ybWFuY2UiLCJEYXRlIiwicHJldlRhcmdldExlbiIsImN1cnJlbnQiLCJkZWx0YUNoYXJzIiwicHJldlRhcmdldEF0IiwiZHQiLCJNYXRoIiwibWF4IiwicmF0ZSIsInByZXZSYXRlIiwibSIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIiwidG90YWxNcyIsImNvbnNvbGUiLCJsb2ciLCJjb25jYXQiLCJyb3VuZCIsImZpbmFsQ2hhcnMiLCJiYWNrZW5kQXZnQ2hhcnNQZXJTZWMiLCJhdmdJbnRlckNodW5rTXMiLCJtYXhJbnRlckNodW5rTXMiLCJpZGxlUmF0aW8iLCJ0b0ZpeGVkIiwidW5kZWZpbmVkIiwibG9nTWV0cmljcyIsInRpY2tOb3ciLCJlbCIsImJ1ZmZlciIsIndpbmRvd01zIiwidG90YWxGcmFtZXMiLCJmcHMiLCJiYWNrZW5kUmF0ZSIsImVsYXBzZWRNcyIsInRhcmdldCIsImJhY2tlbmRDaGFyc1BlclNlYyIsInRpY2siLCJwcmV2IiwibWluIiwiY3VycmVudExlbiIsInJlbWFpbmluZyIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImZpcnN0QXQiLCJ3YWl0ZWRNcyIsIndhcm11cENvbXBsZXRlIiwiY2hhcnNQZXJNcyIsImVmZmVjdGl2ZUNoYXJzUGVyTXMiLCJyZW5kZXJSYXRlQ2FwIiwiZWZmZWN0aXZlQnVmZmVyUmF0ZSIsInRhcmdldEJ1ZmZlckNoYXJzIiwiYnVmZmVyRGVsdGEiLCJjb3JyZWN0aW9uIiwiY2FwIiwicmF3U3RlcCIsImNlaWwiLCJzdGVwIiwibmV4dExlbiIsInNsaWNlIiwibGFzdEJvdW5kYXJ5IiwibGFzdEluZGV4T2YiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaG9va3MvdXNlU21vb3RoU3RyZWFtVGV4dC91c2VTbW9vdGhTdHJlYW1UZXh0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuXG50eXBlIFVzZVNtb290aFN0cmVhbVRleHRPcHRpb25zID0ge1xuICAvKiogU2kgZXN0w6EgZGVzaGFiaWxpdGFkbywgZGV2dWVsdmUgZWwgdGFyZ2V0IHRhbCBjdWFsIChzaW4gYW5pbWFjacOzbikuICovXG4gIGVuYWJsZWQ6IGJvb2xlYW5cbiAgLyoqIENhbnRpZGFkIG3DrW5pbWEgZGUgY2hhcnMgYSBsaWJlcmFyIHBvciBmcmFtZSBjdWFuZG8gaGF5IGJ1ZmZlci4gKi9cbiAgbWluQ2hhcnNQZXJGcmFtZT86IG51bWJlclxuICAvKiogQ290YSBzdXBlcmlvciBkZSBjaGFycyBwb3IgZnJhbWUgcGFyYSBldml0YXIgc2FsdG9zIGdyYW5kZXMuICovXG4gIG1heENoYXJzUGVyRnJhbWU/OiBudW1iZXJcbiAgLyoqXG4gICAqIExhZyBvYmpldGl2byAobXMpIGVudHJlIGVsIHRleHRvIHJlY2liaWRvIHkgZWwgbW9zdHJhZG8uIEVsIGhvb2sgY2FsY3VsYVxuICAgKiBkaW7DoW1pY2FtZW50ZSBlbCBzdGVwIHBvciBmcmFtZSBwYXJhIHZhY2lhciBlbCBidWZmZXIgZW4gfnRhcmdldExhZ01zLlxuICAgKiBWYWxvcmVzIG3DoXMgYmFqb3MgPSBzZSBwb25lIGFsIGTDrWEgbcOhcyByw6FwaWRvIChtZW5vcyBcInN1YXZlXCIpLlxuICAgKi9cbiAgdGFyZ2V0TGFnTXM/OiBudW1iZXJcbiAgLyoqXG4gICAqIFNpIGVzdMOhIGFjdGl2bywgYWwgYXZhbnphciBzZSBkZXRpZW5lIGVuIGVsIMO6bHRpbW8gc2VwYXJhZG9yIGRlIHBhbGFicmFcbiAgICogKGVzcGFjaW8sIHNhbHRvIGRlIGzDrW5lYSwgc2lnbm9zIGRlIHB1bnR1YWNpw7NuKSBwYXJhIGV2aXRhciByZW5kZXJpemFyXG4gICAqIG1hcmtkb3duIFwiY29ydGFkbyBhIGxhIG1pdGFkXCIgeSBkYXIgdW5hIHNlbnNhY2nDs24gbcOhcyBuYXR1cmFsLlxuICAgKi9cbiAgc25hcFRvV29yZEJvdW5kYXJ5PzogYm9vbGVhblxuICAvKipcbiAgICogU2kgZXN0w6EgYWN0aXZvLCBtaWRlIGxhIHRhc2EgcHJvbWVkaW8gYSBsYSBxdWUgY3JlY2UgZWwgdGFyZ2V0IChjYWRlbmNpYVxuICAgKiBkZWwgYmFja2VuZCBlbiBjaGFycy9tcykgeSBsaW1pdGEgbGEgdmVsb2NpZGFkIGRlIHBpbnRhZG8gYSBlc2EgdGFzYVxuICAgKiAobXVsdGlwbGljYWRhIHBvciBgYmFja2VuZFJhdGVGYWN0b3JgKS4gRXN0byBldml0YSBlbCBjYXNvIHTDrXBpY28gZGVcbiAgICogXCJwaW50byByw6FwaWRvIGhhc3RhIHZhY2lhciBlbCBidWZmZXIgeSBkZXNwdcOpcyBzZSBjb25nZWxhIGVzcGVyYW5kb1xuICAgKiBhbCBwcsOzeGltbyBjaHVuayBkZWwgYmFja2VuZFwiLlxuICAgKi9cbiAgYWRhcHRUb0JhY2tlbmRSYXRlPzogYm9vbGVhblxuICAvKipcbiAgICogRmFjdG9yIGFwbGljYWRvIGEgbGEgdGFzYSBkZWwgYmFja2VuZCBjdWFuZG8gYGFkYXB0VG9CYWNrZW5kUmF0ZWAgZXN0w6FcbiAgICogYWN0aXZvLiBWYWxvcmVzIDwgMSBkZWphbiB1biBjb2xjaMOzbiBjcmVjaWVudGUgKG3DoXMgdG9sZXJhbnRlIGEgcGF1c2FzKTtcbiAgICogdmFsb3JlcyA+IDEgaW50ZW50YW4gYWxjYW56YXIuIERlZmF1bHQ6IDAuOTUuXG4gICAqL1xuICBiYWNrZW5kUmF0ZUZhY3Rvcj86IG51bWJlclxuICAvKipcbiAgICogQ29sY2jDs24gb2JqZXRpdm8gZGUgYnVmZmVyIGV4cHJlc2FkbyBlbiBtcyAoY3XDoW50byB0aWVtcG8gZGUgdGV4dG8gcXVlcmVtb3NcbiAgICogdGVuZXIgc2llbXByZSBhZGVsYW50YWRvIGFsIHBpbnRhZG8pLiBTaSBlc3TDoSBkZWZpbmlkbyBqdW50byBjb25cbiAgICogYGFkYXB0VG9CYWNrZW5kUmF0ZWAsIHNlIHVzYSB1biBjb250cm9sIHByb3BvcmNpb25hbDogY3VhbmRvIGVsIGJ1ZmZlclxuICAgKiBiYWphIGRlbCBvYmpldGl2bywgbGEgdmVsb2NpZGFkIGNhZSBwb3IgZGViYWpvIGRlIGxhIGRlbCBiYWNrZW5kIHBhcmFcbiAgICogcmVsbGVuYXJsbzsgY3VhbmRvIGxvIHN1cGVyYSwgc2UgYWNlbGVyYSBwYXJhIGRlc2NhcmdhcmxvLiBBc8OtIGxhXG4gICAqIGFuaW1hY2nDs24gYWJzb3JiZSBwYXVzYXMgZGVsIGJhY2tlbmQgc2luIHF1ZWRhcnNlIGlkbGUuXG4gICAqXG4gICAqIFZhbG9yIHJlY29tZW5kYWRvOiAzMDDigJM1MDBtcyBzZWfDum4gbGEgZXN0YWJpbGlkYWQgZGVsIGJhY2tlbmQuXG4gICAqL1xuICB0YXJnZXRCdWZmZXJNcz86IG51bWJlclxuICAvKipcbiAgICogQ29uc3RhbnRlIGRlIHRpZW1wbyAobXMpIGRlbCBjb250cm9sYWRvciBkZWwgYnVmZmVyLiBDdWFudG8gbcOhcyBiYWpvLFxuICAgKiBtw6FzIGFncmVzaXZhbWVudGUgY29ycmlnZSBkZXN2w61vcy4gRGVmYXVsdDogNTAwLlxuICAgKi9cbiAgYnVmZmVyQ29ycmVjdGlvbk1zPzogbnVtYmVyXG4gIC8qKlxuICAgKiBQaXNvIGFic29sdXRvIGRlbCBjb2xjaMOzbiBlbiBjaGFyczogZWwgYHRhcmdldEJ1ZmZlckNoYXJzYCBjYWxjdWxhZG8gYVxuICAgKiBwYXJ0aXIgZGUgYHRhcmdldEJ1ZmZlck1zIMOXIGJhY2tlbmRSYXRlYCBudW5jYSBiYWphIGRlIGVzdGUgdmFsb3IuIMOadGlsXG4gICAqIGFsIGNvbWllbnpvIGRlbCBzdHJlYW0gY3VhbmRvIGxhIHRhc2EgZXN0aW1hZGEgZGVsIGJhY2tlbmQgZXMgYmFqYS5cbiAgICogRGVmYXVsdDogNDAuXG4gICAqL1xuICBtaW5CdWZmZXJDaGFycz86IG51bWJlclxuICAvKipcbiAgICogV2FybXVwOiBtcyBxdWUgZWwgaG9vayBlc3BlcmEgXCJhY3VtdWxhbmRvXCIgYW50ZXMgZGUgZW1wZXphciBhIHBpbnRhcixcbiAgICogaW5jbHVzbyBzaSB5YSBoYXkgY2hhcnMgZW4gZWwgYnVmZmVyLiBFdml0YSBlbCB0w61waWNvIFwiYXJyYW5xdWUgcsOhcGlkbyxcbiAgICogY29uZ2VsYW1pZW50b1wiIGN1YW5kbyBlbCBwcmltZXIgY2h1bmsgbGxlZ2EgYW50ZXMgcXVlIGVsIHNlZ3VuZG8gc2VcbiAgICogdGFyZGEgbXVjaG8uIFNpIHNlIGRlZmluZSBjb21vIDAsIG5vIGhheSB3YXJtdXAuIERlZmF1bHQ6IDAuXG4gICAqL1xuICB3YXJtdXBNcz86IG51bWJlclxuICAvKipcbiAgICogTW9kbyBkZWJ1ZzogaW1wcmltZSBtw6l0cmljYXMgY2FkYSB+NTAwbXMgbWllbnRyYXMgYGVuYWJsZWQgPT09IHRydWVgLlxuICAgKiDDmnRpbCBwYXJhIGFqdXN0YXIgYHRhcmdldExhZ01zYCwgYG1heENoYXJzUGVyRnJhbWVgIHkgZXZhbHVhciBzaSBjb252aWVuZVxuICAgKiBhY3RpdmFyIGBhZGFwdFRvQmFja2VuZFJhdGVgLlxuICAgKi9cbiAgZGVidWc/OiBib29sZWFuXG4gIC8qKiBFdGlxdWV0YSBvcGNpb25hbCBwYXJhIGRpc3Rpbmd1aXIgbcO6bHRpcGxlcyBpbnN0YW5jaWFzIGVuIGxvcyBsb2dzLiAqL1xuICBkZWJ1Z0xhYmVsPzogc3RyaW5nXG59XG5cbi8qKlxuICogSG9vayBxdWUgZGVzYWNvcGxhIGxhIGNhZGVuY2lhIGRlIGxsZWdhZGEgZGVsIHRleHRvIChzdHJlYW0gU1NFKSBkZSBsYVxuICogY2FkZW5jaWEgZGUgcmVuZGVyaXphZG8uIFVzYSBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYCBwYXJhIGxpYmVyYXIgY2hhcnNcbiAqIGEgcml0bW8gY29uc3RhbnRlIGhhY2lhIGVsIERPTSwgZWxpbWluYW5kbyBsb3MgXCJmcmVub3NcIiBxdWUgc2UgcHJvZHVjZW5cbiAqIGN1YW5kbyBlbCBiYWNrZW5kIGVtaXRlIHLDoWZhZ2FzIGRlIHRva2Vucy5cbiAqXG4gKiBDdWFuZG8gYGVuYWJsZWRgIHBhc2EgYSBmYWxzZSAoZmluIGRlIHN0cmVhbSksIGVsIHRleHRvIHNlIGNvbXBsZXRhIGFsXG4gKiBpbnN0YW50ZS4gRHVyYW50ZSBlbCBzdHJlYW1pbmcsIGVsIGJ1ZmZlciBzZSB2YWPDrWEgZGluw6FtaWNhbWVudGUgYXB1bnRhbmRvXG4gKiBhbCBsYWcgY29uZmlndXJhZG8uXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VTbW9vdGhTdHJlYW1UZXh0ID0gKFxuICB0YXJnZXRUZXh0OiBzdHJpbmcsXG4gIHtcbiAgICBlbmFibGVkLFxuICAgIG1pbkNoYXJzUGVyRnJhbWUgPSAxLFxuICAgIG1heENoYXJzUGVyRnJhbWUgPSAyNCxcbiAgICB0YXJnZXRMYWdNcyA9IDQ1MCxcbiAgICBzbmFwVG9Xb3JkQm91bmRhcnkgPSBmYWxzZSxcbiAgICBhZGFwdFRvQmFja2VuZFJhdGUgPSB0cnVlLFxuICAgIGJhY2tlbmRSYXRlRmFjdG9yID0gMC45NSxcbiAgICB0YXJnZXRCdWZmZXJNcyA9IDYwMCxcbiAgICBidWZmZXJDb3JyZWN0aW9uTXMgPSA1MDAsXG4gICAgbWluQnVmZmVyQ2hhcnMgPSA3MCxcbiAgICB3YXJtdXBNcyA9IDQwMCxcbiAgICBkZWJ1ZyA9IGZhbHNlLFxuICAgIGRlYnVnTGFiZWwgPSAnc21vb3RoU3RyZWFtJyxcbiAgfTogVXNlU21vb3RoU3RyZWFtVGV4dE9wdGlvbnNcbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IFtkaXNwbGF5ZWQsIHNldERpc3BsYXllZF0gPSB1c2VTdGF0ZTxzdHJpbmc+KCgpID0+IChlbmFibGVkID8gJycgOiB0YXJnZXRUZXh0KSlcblxuICBjb25zdCB0YXJnZXRSZWYgPSB1c2VSZWYodGFyZ2V0VGV4dClcbiAgY29uc3QgZGlzcGxheWVkTGVuUmVmID0gdXNlUmVmKGRpc3BsYXllZC5sZW5ndGgpXG4gIGNvbnN0IHJhZlJlZiA9IHVzZVJlZjxudW1iZXIgfCBudWxsPihudWxsKVxuICBjb25zdCBsYXN0VGlja1JlZiA9IHVzZVJlZjxudW1iZXI+KDApXG5cbiAgLy8gTWVkaWNpw7NuIGRlIGxhIGNhZGVuY2lhIGRlbCBiYWNrZW5kOiBzZSBhY3R1YWxpemEgY3VhbmRvIGNhbWJpYSB0YXJnZXRUZXh0LlxuICBjb25zdCBsYXN0VGFyZ2V0TGVuUmVmID0gdXNlUmVmPG51bWJlcj4oMClcbiAgY29uc3QgbGFzdFRhcmdldFVwZGF0ZVJlZiA9IHVzZVJlZjxudW1iZXI+KDApXG4gIC8vIEVzdGltYWNpw7NuIEVNQSBkZSBjaGFycy9tcyBwcm9kdWNpZG9zIHBvciBlbCBiYWNrZW5kLlxuICBjb25zdCBiYWNrZW5kQ2hhcnNQZXJNc1JlZiA9IHVzZVJlZjxudW1iZXI+KDApXG4gIC8vIFRpbWVzdGFtcCBkZWwgcHJpbWVyIGNodW5rIHJlY2liaWRvIChwYXJhIHdhcm11cCkuXG4gIGNvbnN0IGZpcnN0Q2h1bmtBdFJlZiA9IHVzZVJlZjxudW1iZXI+KDApXG4gIC8vIFNpIGVsIHdhcm11cCB5YSB0ZXJtaW7DsyAodW5hIHZleiB0cnVlLCBubyB2dWVsdmUgYSBhY3RpdmFyc2UgZW4gZXN0ZSBzdHJlYW0pLlxuICBjb25zdCB3YXJtdXBEb25lUmVmID0gdXNlUmVmPGJvb2xlYW4+KGZhbHNlKVxuXG4gIC8vIE3DqXRyaWNhcyBwYXJhIGRlYnVnXG4gIGNvbnN0IG1ldHJpY3NSZWYgPSB1c2VSZWYoe1xuICAgIGZyYW1lc1dpdGhCdWZmZXI6IDAsXG4gICAgZnJhbWVzSWRsZTogMCxcbiAgICB0b3RhbENoYXJzRW1pdHRlZDogMCxcbiAgICBtYXhCdWZmZXI6IDAsXG4gICAgaWRsZVRpbWVNczogMCxcbiAgICBjaHVua3NTZWVuOiAwLFxuICAgIGludGVyQ2h1bmtTdW06IDAsXG4gICAgaW50ZXJDaHVua01heDogMCxcbiAgICBsYXN0TG9nQXQ6IDAsXG4gICAgc3RyZWFtU3RhcnRBdDogMCxcbiAgfSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG5vdyA9IHR5cGVvZiBwZXJmb3JtYW5jZSAhPT0gJ3VuZGVmaW5lZCcgPyBwZXJmb3JtYW5jZS5ub3coKSA6IERhdGUubm93KClcbiAgICBjb25zdCBwcmV2VGFyZ2V0TGVuID0gbGFzdFRhcmdldExlblJlZi5jdXJyZW50XG4gICAgY29uc3QgZGVsdGFDaGFycyA9IHRhcmdldFRleHQubGVuZ3RoIC0gcHJldlRhcmdldExlblxuICAgIGNvbnN0IHByZXZUYXJnZXRBdCA9IGxhc3RUYXJnZXRVcGRhdGVSZWYuY3VycmVudFxuXG4gICAgaWYgKGVuYWJsZWQgJiYgZGVsdGFDaGFycyA+IDApIHtcbiAgICAgIGlmIChmaXJzdENodW5rQXRSZWYuY3VycmVudCA9PT0gMCkgZmlyc3RDaHVua0F0UmVmLmN1cnJlbnQgPSBub3dcbiAgICB9XG5cbiAgICBpZiAoZW5hYmxlZCAmJiBkZWx0YUNoYXJzID4gMCAmJiBwcmV2VGFyZ2V0QXQgPiAwKSB7XG4gICAgICBjb25zdCBkdCA9IE1hdGgubWF4KDEsIG5vdyAtIHByZXZUYXJnZXRBdClcbiAgICAgIGNvbnN0IHJhdGUgPSBkZWx0YUNoYXJzIC8gZHRcbiAgICAgIGNvbnN0IHByZXZSYXRlID0gYmFja2VuZENoYXJzUGVyTXNSZWYuY3VycmVudFxuICAgICAgLy8gRU1BIHN1YXZlIChhbHBoYSA9IDAuMikgcGFyYSBhYnNvcmJlciBqaXR0ZXIgeSBzZWd1aXIgbGEgdGVuZGVuY2lhLlxuICAgICAgYmFja2VuZENoYXJzUGVyTXNSZWYuY3VycmVudCA9IHByZXZSYXRlID09PSAwID8gcmF0ZSA6IHByZXZSYXRlICogMC44ICsgcmF0ZSAqIDAuMlxuXG4gICAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgY29uc3QgbSA9IG1ldHJpY3NSZWYuY3VycmVudFxuICAgICAgICBtLmNodW5rc1NlZW4gKz0gMVxuICAgICAgICBtLmludGVyQ2h1bmtTdW0gKz0gZHRcbiAgICAgICAgaWYgKGR0ID4gbS5pbnRlckNodW5rTWF4KSBtLmludGVyQ2h1bmtNYXggPSBkdFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW5hYmxlZCAmJiB0YXJnZXRUZXh0Lmxlbmd0aCAhPT0gcHJldlRhcmdldExlbikge1xuICAgICAgbGFzdFRhcmdldExlblJlZi5jdXJyZW50ID0gdGFyZ2V0VGV4dC5sZW5ndGhcbiAgICAgIGxhc3RUYXJnZXRVcGRhdGVSZWYuY3VycmVudCA9IG5vd1xuICAgIH1cblxuICAgIHRhcmdldFJlZi5jdXJyZW50ID0gdGFyZ2V0VGV4dFxuXG4gICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICBpZiAocmFmUmVmLmN1cnJlbnQgIT0gbnVsbCkge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShyYWZSZWYuY3VycmVudClcbiAgICAgICAgcmFmUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICB9XG4gICAgICBsYXN0VGlja1JlZi5jdXJyZW50ID0gMFxuICAgICAgaWYgKGRlYnVnICYmIG1ldHJpY3NSZWYuY3VycmVudC5zdHJlYW1TdGFydEF0ID4gMCkge1xuICAgICAgICBjb25zdCBtID0gbWV0cmljc1JlZi5jdXJyZW50XG4gICAgICAgIGNvbnN0IHRvdGFsTXMgPSBub3cgLSBtLnN0cmVhbVN0YXJ0QXRcbiAgICAgICAgY29uc29sZS5sb2coYFske2RlYnVnTGFiZWx9XSBGSU5BTGAsIHtcbiAgICAgICAgICB0b3RhbE1zOiBNYXRoLnJvdW5kKHRvdGFsTXMpLFxuICAgICAgICAgIGZpbmFsQ2hhcnM6IHRhcmdldFRleHQubGVuZ3RoLFxuICAgICAgICAgIGJhY2tlbmRBdmdDaGFyc1BlclNlYzogbS5jaHVua3NTZWVuID4gMCA/IE1hdGgucm91bmQoKHRhcmdldFRleHQubGVuZ3RoIC8gdG90YWxNcykgKiAxMDAwKSA6IDAsXG4gICAgICAgICAgY2h1bmtzU2VlbjogbS5jaHVua3NTZWVuLFxuICAgICAgICAgIGF2Z0ludGVyQ2h1bmtNczogbS5jaHVua3NTZWVuID4gMCA/IE1hdGgucm91bmQobS5pbnRlckNodW5rU3VtIC8gbS5jaHVua3NTZWVuKSA6IDAsXG4gICAgICAgICAgbWF4SW50ZXJDaHVua01zOiBNYXRoLnJvdW5kKG0uaW50ZXJDaHVua01heCksXG4gICAgICAgICAgaWRsZVRpbWVNczogTWF0aC5yb3VuZChtLmlkbGVUaW1lTXMpLFxuICAgICAgICAgIGlkbGVSYXRpbzogdG90YWxNcyA+IDAgPyAobS5pZGxlVGltZU1zIC8gdG90YWxNcykudG9GaXhlZCgyKSA6ICcwJyxcbiAgICAgICAgICBtYXhCdWZmZXI6IG0ubWF4QnVmZmVyLFxuICAgICAgICB9KVxuICAgICAgICBtZXRyaWNzUmVmLmN1cnJlbnQgPSB7XG4gICAgICAgICAgZnJhbWVzV2l0aEJ1ZmZlcjogMCxcbiAgICAgICAgICBmcmFtZXNJZGxlOiAwLFxuICAgICAgICAgIHRvdGFsQ2hhcnNFbWl0dGVkOiAwLFxuICAgICAgICAgIG1heEJ1ZmZlcjogMCxcbiAgICAgICAgICBpZGxlVGltZU1zOiAwLFxuICAgICAgICAgIGNodW5rc1NlZW46IDAsXG4gICAgICAgICAgaW50ZXJDaHVua1N1bTogMCxcbiAgICAgICAgICBpbnRlckNodW5rTWF4OiAwLFxuICAgICAgICAgIGxhc3RMb2dBdDogMCxcbiAgICAgICAgICBzdHJlYW1TdGFydEF0OiAwLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlzcGxheWVkTGVuUmVmLmN1cnJlbnQgIT09IHRhcmdldFRleHQubGVuZ3RoKSB7XG4gICAgICAgIGRpc3BsYXllZExlblJlZi5jdXJyZW50ID0gdGFyZ2V0VGV4dC5sZW5ndGhcbiAgICAgICAgc2V0RGlzcGxheWVkKHRhcmdldFRleHQpXG4gICAgICB9XG4gICAgICAvLyBSZXNldCBkZSBjYWRlbmNpYSBjdWFuZG8gc2UgYXBhZ2EgcGFyYSBubyBjb250YW1pbmFyIGVsIHByw7N4aW1vIHN0cmVhbS5cbiAgICAgIGxhc3RUYXJnZXRMZW5SZWYuY3VycmVudCA9IDBcbiAgICAgIGxhc3RUYXJnZXRVcGRhdGVSZWYuY3VycmVudCA9IDBcbiAgICAgIGJhY2tlbmRDaGFyc1Blck1zUmVmLmN1cnJlbnQgPSAwXG4gICAgICBmaXJzdENodW5rQXRSZWYuY3VycmVudCA9IDBcbiAgICAgIHdhcm11cERvbmVSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgaWYgKGRlYnVnICYmIG1ldHJpY3NSZWYuY3VycmVudC5zdHJlYW1TdGFydEF0ID09PSAwKSB7XG4gICAgICBtZXRyaWNzUmVmLmN1cnJlbnQuc3RyZWFtU3RhcnRBdCA9IG5vd1xuICAgICAgbWV0cmljc1JlZi5jdXJyZW50Lmxhc3RMb2dBdCA9IG5vd1xuICAgICAgY29uc29sZS5sb2coYFske2RlYnVnTGFiZWx9XSBTVEFSVGAsIHtcbiAgICAgICAgdGFyZ2V0TGFnTXMsXG4gICAgICAgIG1heENoYXJzUGVyRnJhbWUsXG4gICAgICAgIGFkYXB0VG9CYWNrZW5kUmF0ZSxcbiAgICAgICAgYmFja2VuZFJhdGVGYWN0b3IsXG4gICAgICAgIHRhcmdldEJ1ZmZlck1zLFxuICAgICAgICBidWZmZXJDb3JyZWN0aW9uTXMsXG4gICAgICAgIG1pbkJ1ZmZlckNoYXJzLFxuICAgICAgICB3YXJtdXBNcyxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGRpc3BsYXllZExlblJlZi5jdXJyZW50ID4gdGFyZ2V0VGV4dC5sZW5ndGgpIHtcbiAgICAgIGRpc3BsYXllZExlblJlZi5jdXJyZW50ID0gMFxuICAgICAgc2V0RGlzcGxheWVkKCcnKVxuICAgIH1cblxuICAgIGlmIChyYWZSZWYuY3VycmVudCAhPSBudWxsKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICBjb25zdCBsb2dNZXRyaWNzID0gKHRpY2tOb3c6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgbSA9IG1ldHJpY3NSZWYuY3VycmVudFxuICAgICAgY29uc3QgZWwgPSB0YXJnZXRSZWYuY3VycmVudFxuICAgICAgY29uc3QgYnVmZmVyID0gZWwubGVuZ3RoIC0gZGlzcGxheWVkTGVuUmVmLmN1cnJlbnRcbiAgICAgIGNvbnN0IHdpbmRvd01zID0gTWF0aC5tYXgoMSwgdGlja05vdyAtIG0ubGFzdExvZ0F0KVxuICAgICAgY29uc3QgdG90YWxGcmFtZXMgPSBtLmZyYW1lc1dpdGhCdWZmZXIgKyBtLmZyYW1lc0lkbGVcbiAgICAgIGNvbnN0IGZwcyA9IE1hdGgucm91bmQoKHRvdGFsRnJhbWVzIC8gd2luZG93TXMpICogMTAwMClcbiAgICAgIGNvbnN0IGJhY2tlbmRSYXRlID0gYmFja2VuZENoYXJzUGVyTXNSZWYuY3VycmVudFxuICAgICAgY29uc29sZS5sb2coYFske2RlYnVnTGFiZWx9XSB0aWNrYCwge1xuICAgICAgICBlbGFwc2VkTXM6IE1hdGgucm91bmQodGlja05vdyAtIG0uc3RyZWFtU3RhcnRBdCksXG4gICAgICAgIGJ1ZmZlcixcbiAgICAgICAgZGlzcGxheWVkOiBkaXNwbGF5ZWRMZW5SZWYuY3VycmVudCxcbiAgICAgICAgdGFyZ2V0OiBlbC5sZW5ndGgsXG4gICAgICAgIGZyYW1lc1dpdGhCdWZmZXI6IG0uZnJhbWVzV2l0aEJ1ZmZlcixcbiAgICAgICAgZnJhbWVzSWRsZTogbS5mcmFtZXNJZGxlLFxuICAgICAgICBpZGxlUmF0aW86IHRvdGFsRnJhbWVzID4gMCA/IChtLmZyYW1lc0lkbGUgLyB0b3RhbEZyYW1lcykudG9GaXhlZCgyKSA6ICcwJyxcbiAgICAgICAgZnBzLFxuICAgICAgICBiYWNrZW5kQ2hhcnNQZXJTZWM6IE1hdGgucm91bmQoYmFja2VuZFJhdGUgKiAxMDAwKSxcbiAgICAgICAgYXZnSW50ZXJDaHVua01zOiBtLmNodW5rc1NlZW4gPiAwID8gTWF0aC5yb3VuZChtLmludGVyQ2h1bmtTdW0gLyBtLmNodW5rc1NlZW4pIDogMCxcbiAgICAgICAgbWF4SW50ZXJDaHVua01zOiBNYXRoLnJvdW5kKG0uaW50ZXJDaHVua01heCksXG4gICAgICB9KVxuICAgICAgbS5mcmFtZXNXaXRoQnVmZmVyID0gMFxuICAgICAgbS5mcmFtZXNJZGxlID0gMFxuICAgICAgbS5sYXN0TG9nQXQgPSB0aWNrTm93XG4gICAgfVxuXG4gICAgY29uc3QgdGljayA9ICh0aWNrTm93OiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IHByZXYgPSBsYXN0VGlja1JlZi5jdXJyZW50XG4gICAgICBjb25zdCBkdCA9IHByZXYgPyBNYXRoLm1pbih0aWNrTm93IC0gcHJldiwgNjQpIDogMTZcbiAgICAgIGxhc3RUaWNrUmVmLmN1cnJlbnQgPSB0aWNrTm93XG5cbiAgICAgIGNvbnN0IHRhcmdldCA9IHRhcmdldFJlZi5jdXJyZW50XG4gICAgICBjb25zdCBjdXJyZW50TGVuID0gZGlzcGxheWVkTGVuUmVmLmN1cnJlbnRcbiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IHRhcmdldC5sZW5ndGggLSBjdXJyZW50TGVuXG5cbiAgICAgIGlmIChyZW1haW5pbmcgPD0gMCkge1xuICAgICAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgICBtZXRyaWNzUmVmLmN1cnJlbnQuZnJhbWVzSWRsZSArPSAxXG4gICAgICAgICAgbWV0cmljc1JlZi5jdXJyZW50LmlkbGVUaW1lTXMgKz0gZHRcbiAgICAgICAgfVxuICAgICAgICByYWZSZWYuY3VycmVudCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKVxuICAgICAgICAvLyBMb2cgcGVyacOzZGljbyBhw7puIGVzdGFuZG8gaWRsZSAocGFyYSB2ZXIgc2kgZXN0YW1vcyBlc3BlcmFuZG8gY2h1bmtzKVxuICAgICAgICBpZiAoZGVidWcgJiYgdGlja05vdyAtIG1ldHJpY3NSZWYuY3VycmVudC5sYXN0TG9nQXQgPiA1MDApIHtcbiAgICAgICAgICBsb2dNZXRyaWNzKHRpY2tOb3cpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIFdhcm11cDogYWwgY29taWVuem8gZGVsIHN0cmVhbSBlc3BlcmFtb3MgYHdhcm11cE1zYCBkZXNkZSBlbCBwcmltZXJcbiAgICAgIC8vIGNodW5rIGFudGVzIGRlIGVtcGV6YXIgYSBwaW50YXIuIEVzdG8gY29uc3RydXllIHVuIGNvbGNow7NuIGluaWNpYWwgeVxuICAgICAgLy8gZXZpdGEgYXJyYW5jYXIgcsOhcGlkbyBwYXJhIGNvbmdlbGFybm9zIGFjdG8gc2VndWlkbyBzaSBlbCBiYWNrZW5kXG4gICAgICAvLyB0YXJkYSBtdWNobyBlbiBlbWl0aXIgZWwgc2VndW5kbyBjaHVuay5cbiAgICAgIGlmICghd2FybXVwRG9uZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNvbnN0IGZpcnN0QXQgPSBmaXJzdENodW5rQXRSZWYuY3VycmVudFxuICAgICAgICBjb25zdCB3YWl0ZWRNcyA9IGZpcnN0QXQgPiAwID8gdGlja05vdyAtIGZpcnN0QXQgOiAwXG4gICAgICAgIGNvbnN0IHdhcm11cENvbXBsZXRlID0gd2FybXVwTXMgPD0gMCB8fCB3YWl0ZWRNcyA+PSB3YXJtdXBNcyB8fCB0YXJnZXQubGVuZ3RoID49IG1pbkJ1ZmZlckNoYXJzICogMlxuICAgICAgICBpZiAoIXdhcm11cENvbXBsZXRlKSB7XG4gICAgICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgICAgICBtZXRyaWNzUmVmLmN1cnJlbnQuZnJhbWVzSWRsZSArPSAxXG4gICAgICAgICAgICBtZXRyaWNzUmVmLmN1cnJlbnQuaWRsZVRpbWVNcyArPSBkdFxuICAgICAgICAgIH1cbiAgICAgICAgICByYWZSZWYuY3VycmVudCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKVxuICAgICAgICAgIGlmIChkZWJ1ZyAmJiB0aWNrTm93IC0gbWV0cmljc1JlZi5jdXJyZW50Lmxhc3RMb2dBdCA+IDUwMCkge1xuICAgICAgICAgICAgbG9nTWV0cmljcyh0aWNrTm93KVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB3YXJtdXBEb25lUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICBtZXRyaWNzUmVmLmN1cnJlbnQuZnJhbWVzV2l0aEJ1ZmZlciArPSAxXG4gICAgICAgIGlmIChyZW1haW5pbmcgPiBtZXRyaWNzUmVmLmN1cnJlbnQubWF4QnVmZmVyKSBtZXRyaWNzUmVmLmN1cnJlbnQubWF4QnVmZmVyID0gcmVtYWluaW5nXG4gICAgICB9XG5cbiAgICAgIC8vIFZlbG9jaWRhZCBiYXNlOiB2YWNpYXIgZWwgYnVmZmVyIGVuIH50YXJnZXRMYWdNcy5cbiAgICAgIGNvbnN0IGNoYXJzUGVyTXMgPSByZW1haW5pbmcgLyB0YXJnZXRMYWdNc1xuICAgICAgbGV0IGVmZmVjdGl2ZUNoYXJzUGVyTXMgPSBjaGFyc1Blck1zXG5cbiAgICAgIGNvbnN0IGJhY2tlbmRSYXRlID0gYmFja2VuZENoYXJzUGVyTXNSZWYuY3VycmVudFxuXG4gICAgICBpZiAoYWRhcHRUb0JhY2tlbmRSYXRlICYmIGJhY2tlbmRSYXRlID4gMCkge1xuICAgICAgICBpZiAodHlwZW9mIHRhcmdldEJ1ZmZlck1zID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIC8vIENvbnRyb2wgcHJvcG9yY2lvbmFsOiBtYW50ZW5lciBlbCBidWZmZXIgZW4gdG9ybm8gYWwgY29sY2jDs25cbiAgICAgICAgICAvLyBvYmpldGl2by4gU2kgYnVmZmVyTXMgPCB0YXJnZXQg4oaSIGZyZW5hbW9zIHBvciBkZWJham8gZGVsIGJhY2tlbmRcbiAgICAgICAgICAvLyBwYXJhIGFjdW11bGFyOyBzaSBidWZmZXJNcyA+IHRhcmdldCDihpIgYWNlbGVyYW1vcyBwYXJhIGRlc2Nhcmdhci5cbiAgICAgICAgICAvLyBFbiBlcXVpbGlicmlvLCBwaW50YW1vcyBhbCByaXRtbyBwcm9tZWRpbyBkZWwgYmFja2VuZC5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIEVsIGNvbGNow7NuIG9iamV0aXZvIHNlIGNhbGN1bGEgc29icmUgbGEgdGFzYSAqKmVmZWN0aXZhKiogcXVlXG4gICAgICAgICAgLy8gcG9kZW1vcyBwaW50YXIgKGNhcGVhZGEgcG9yIGBtYXhDaGFyc1BlckZyYW1lYCBhIDYwZnBzKSwgbm8gc29icmVcbiAgICAgICAgICAvLyBsYSBkZWwgYmFja2VuZCBwdXJhLiBFc3RvIGV2aXRhIGVsIGNhc28gcGF0b2zDs2dpY28gZGUgcsOhZmFnYXM6XG4gICAgICAgICAgLy8gc2kgZWwgYmFja2VuZCB0aXJhIGEgNjUwMCBjaC9zLCBlbCB0YXJnZXQgTk8gc2UgdnVlbHZlIDM5MDAgY2hhcnNcbiAgICAgICAgICAvLyAocXVlIGVsIHJlbmRlciBqYW3DoXMgcG9kcsOtYSBzb3N0ZW5lciksIHNpbm8gYWxnbyByYXpvbmFibGUgcXVlXG4gICAgICAgICAgLy8gbGEgYW5pbWFjacOzbiBwdWVkYSBtYW50ZW5lci5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFBpc28gYWJzb2x1dG86IGVsIGNvbGNow7NuIG51bmNhIGJhamEgZGUgYG1pbkJ1ZmZlckNoYXJzYCBhdW5xdWVcbiAgICAgICAgICAvLyBlbCBiYWNrZW5kIGVzdMOpIG1hbmRhbmRvIGxlbnRvIGFsIGluaWNpbyBkZWwgc3RyZWFtLlxuICAgICAgICAgIGNvbnN0IHJlbmRlclJhdGVDYXAgPSAobWF4Q2hhcnNQZXJGcmFtZSAqIDYwKSAvIDEwMDBcbiAgICAgICAgICBjb25zdCBlZmZlY3RpdmVCdWZmZXJSYXRlID0gTWF0aC5taW4oYmFja2VuZFJhdGUsIHJlbmRlclJhdGVDYXApXG4gICAgICAgICAgY29uc3QgdGFyZ2V0QnVmZmVyQ2hhcnMgPSBNYXRoLm1heChtaW5CdWZmZXJDaGFycywgdGFyZ2V0QnVmZmVyTXMgKiBlZmZlY3RpdmVCdWZmZXJSYXRlKVxuICAgICAgICAgIGNvbnN0IGJ1ZmZlckRlbHRhID0gcmVtYWluaW5nIC0gdGFyZ2V0QnVmZmVyQ2hhcnNcbiAgICAgICAgICAvLyBDb3JyZWNjacOzbiB0aWVuZSB1bmlkYWRlcyBkZSBjaGFycy9tcy4gYnVmZmVyQ29ycmVjdGlvbk1zIGNvbnRyb2xhXG4gICAgICAgICAgLy8gcXXDqSB0YW4gcsOhcGlkbyBlbCBidWZmZXIgcmVhbCBjb252ZXJnZSBhbCBvYmpldGl2by5cbiAgICAgICAgICBjb25zdCBjb3JyZWN0aW9uID0gYnVmZmVyRGVsdGEgLyBNYXRoLm1heCgxLCBidWZmZXJDb3JyZWN0aW9uTXMpXG4gICAgICAgICAgZWZmZWN0aXZlQ2hhcnNQZXJNcyA9IE1hdGgubWF4KDAsIGJhY2tlbmRSYXRlICsgY29ycmVjdGlvbilcbiAgICAgICAgICAvLyBBY290YXIgcG9yIGxhIHZlbG9jaWRhZCBkZSBcInZhY2lhciBlbiB0YXJnZXRMYWdNc1wiIHBhcmEgcXVlIHNpXG4gICAgICAgICAgLy8gZGUgcHJvbnRvIGhheSB1biBwaWNvIGdpZ2FudGUgZGUgYnVmZmVyIG5vIHNhbGdhbW9zIGRpc3BhcmFkb3MuXG4gICAgICAgICAgZWZmZWN0aXZlQ2hhcnNQZXJNcyA9IE1hdGgubWluKGVmZmVjdGl2ZUNoYXJzUGVyTXMsIGNoYXJzUGVyTXMpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTW9kbyBzaW1wbGU6IGNhcCBhIGxhIHRhc2EgZGVsIGJhY2tlbmQgKiBmYWN0b3IuXG4gICAgICAgICAgY29uc3QgY2FwID0gYmFja2VuZFJhdGUgKiBiYWNrZW5kUmF0ZUZhY3RvclxuICAgICAgICAgIGVmZmVjdGl2ZUNoYXJzUGVyTXMgPSBNYXRoLm1pbihlZmZlY3RpdmVDaGFyc1Blck1zLCBjYXApXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmF3U3RlcCA9IE1hdGguY2VpbChlZmZlY3RpdmVDaGFyc1Blck1zICogZHQpXG4gICAgICBjb25zdCBzdGVwID0gTWF0aC5tYXgobWluQ2hhcnNQZXJGcmFtZSwgTWF0aC5taW4obWF4Q2hhcnNQZXJGcmFtZSwgcmF3U3RlcCkpXG5cbiAgICAgIGxldCBuZXh0TGVuID0gTWF0aC5taW4odGFyZ2V0Lmxlbmd0aCwgY3VycmVudExlbiArIHN0ZXApXG5cbiAgICAgIGlmIChzbmFwVG9Xb3JkQm91bmRhcnkgJiYgbmV4dExlbiA8IHRhcmdldC5sZW5ndGgpIHtcbiAgICAgICAgY29uc3Qgc2xpY2UgPSB0YXJnZXQuc2xpY2UoY3VycmVudExlbiwgbmV4dExlbilcbiAgICAgICAgY29uc3QgbGFzdEJvdW5kYXJ5ID0gTWF0aC5tYXgoc2xpY2UubGFzdEluZGV4T2YoJyAnKSwgc2xpY2UubGFzdEluZGV4T2YoJ1xcbicpLCBzbGljZS5sYXN0SW5kZXhPZignXFx0JykpXG4gICAgICAgIGlmIChsYXN0Qm91bmRhcnkgPj0gMCkge1xuICAgICAgICAgIG5leHRMZW4gPSBjdXJyZW50TGVuICsgbGFzdEJvdW5kYXJ5ICsgMVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXh0TGVuICE9PSBjdXJyZW50TGVuKSB7XG4gICAgICAgIGlmIChkZWJ1ZykgbWV0cmljc1JlZi5jdXJyZW50LnRvdGFsQ2hhcnNFbWl0dGVkICs9IG5leHRMZW4gLSBjdXJyZW50TGVuXG4gICAgICAgIGRpc3BsYXllZExlblJlZi5jdXJyZW50ID0gbmV4dExlblxuICAgICAgICBzZXREaXNwbGF5ZWQodGFyZ2V0LnNsaWNlKDAsIG5leHRMZW4pKVxuICAgICAgfVxuXG4gICAgICBpZiAoZGVidWcgJiYgdGlja05vdyAtIG1ldHJpY3NSZWYuY3VycmVudC5sYXN0TG9nQXQgPiA1MDApIHtcbiAgICAgICAgbG9nTWV0cmljcyh0aWNrTm93KVxuICAgICAgfVxuXG4gICAgICByYWZSZWYuY3VycmVudCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKVxuICAgIH1cblxuICAgIHJhZlJlZi5jdXJyZW50ID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spXG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKHJhZlJlZi5jdXJyZW50ICE9IG51bGwpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmUmVmLmN1cnJlbnQpXG4gICAgICAgIHJhZlJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgfVxuICAgICAgbGFzdFRpY2tSZWYuY3VycmVudCA9IDBcbiAgICB9XG4gIH0sIFtcbiAgICB0YXJnZXRUZXh0LFxuICAgIGVuYWJsZWQsXG4gICAgbWluQ2hhcnNQZXJGcmFtZSxcbiAgICBtYXhDaGFyc1BlckZyYW1lLFxuICAgIHRhcmdldExhZ01zLFxuICAgIHNuYXBUb1dvcmRCb3VuZGFyeSxcbiAgICBhZGFwdFRvQmFja2VuZFJhdGUsXG4gICAgYmFja2VuZFJhdGVGYWN0b3IsXG4gICAgdGFyZ2V0QnVmZmVyTXMsXG4gICAgYnVmZmVyQ29ycmVjdGlvbk1zLFxuICAgIG1pbkJ1ZmZlckNoYXJzLFxuICAgIHdhcm11cE1zLFxuICAgIGRlYnVnLFxuICAgIGRlYnVnTGFiZWwsXG4gIF0pXG5cbiAgcmV0dXJuIGRpc3BsYXllZFxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQSxTQUFTQSxTQUFTLEVBQUVDLE1BQU0sRUFBRUMsUUFBUSxRQUFRLE9BQU87QUEyRW5EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxJQUFNQyxtQkFBbUIsR0FBRyxTQUF0QkEsbUJBQW1CQSxDQUM5QkMsVUFBa0IsRUFBQUMsSUFBQSxFQWdCUDtFQUFBLElBZFRDLE9BQU8sR0FBQUQsSUFBQSxDQUFQQyxPQUFPO0lBQUFDLHFCQUFBLEdBQUFGLElBQUEsQ0FDUEcsZ0JBQWdCO0lBQWhCQSxnQkFBZ0IsR0FBQUQscUJBQUEsY0FBRyxDQUFDLEdBQUFBLHFCQUFBO0lBQUFFLHFCQUFBLEdBQUFKLElBQUEsQ0FDcEJLLGdCQUFnQjtJQUFoQkEsZ0JBQWdCLEdBQUFELHFCQUFBLGNBQUcsRUFBRSxHQUFBQSxxQkFBQTtJQUFBRSxnQkFBQSxHQUFBTixJQUFBLENBQ3JCTyxXQUFXO0lBQVhBLFdBQVcsR0FBQUQsZ0JBQUEsY0FBRyxHQUFHLEdBQUFBLGdCQUFBO0lBQUFFLHFCQUFBLEdBQUFSLElBQUEsQ0FDakJTLGtCQUFrQjtJQUFsQkEsa0JBQWtCLEdBQUFELHFCQUFBLGNBQUcsS0FBSyxHQUFBQSxxQkFBQTtJQUFBRSxxQkFBQSxHQUFBVixJQUFBLENBQzFCVyxrQkFBa0I7SUFBbEJBLGtCQUFrQixHQUFBRCxxQkFBQSxjQUFHLElBQUksR0FBQUEscUJBQUE7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Q0FBQ0MsR0FBRyxDQUFDaUQsS0FBSyxDQUFDRSxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUVGLEtBQUssQ0FBQ0UsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFRixLQUFLLENBQUNFLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2RyxJQUFJRCxZQUFZLElBQUksQ0FBQyxFQUFFO1VBQ3JCRixPQUFPLEdBQUdqQixVQUFVLEdBQUdtQixZQUFZLEdBQUcsQ0FBQztRQUN6QztNQUNGO01BRUEsSUFBSUYsT0FBTyxLQUFLakIsVUFBVSxFQUFFO1FBQzFCLElBQUlyRSxLQUFLLEVBQUVrQixVQUFVLENBQUNlLE9BQU8sQ0FBQ1osaUJBQWlCLElBQUlpRSxPQUFPLEdBQUdqQixVQUFVO1FBQ3ZFNUQsZUFBZSxDQUFDd0IsT0FBTyxHQUFHcUQsT0FBTztRQUNqQy9FLFlBQVksQ0FBQ3lELE1BQU0sQ0FBQ3VCLEtBQUssQ0FBQyxDQUFDLEVBQUVELE9BQU8sQ0FBQyxDQUFDO01BQ3hDO01BRUEsSUFBSXRGLEtBQUssSUFBSXdELE9BQU8sR0FBR3RDLFVBQVUsQ0FBQ2UsT0FBTyxDQUFDTixTQUFTLEdBQUcsR0FBRyxFQUFFO1FBQ3pENEIsVUFBVSxDQUFDQyxPQUFPLENBQUM7TUFDckI7TUFFQTdDLE1BQU0sQ0FBQ3NCLE9BQU8sR0FBR3NDLHFCQUFxQixDQUFDTCxLQUFJLENBQUM7SUFDOUMsQ0FBQztJQUVEdkQsTUFBTSxDQUFDc0IsT0FBTyxHQUFHc0MscUJBQXFCLENBQUNMLEtBQUksQ0FBQztJQUU1QyxPQUFPLFlBQU07TUFDWCxJQUFJdkQsTUFBTSxDQUFDc0IsT0FBTyxJQUFJLElBQUksRUFBRTtRQUMxQlMsb0JBQW9CLENBQUMvQixNQUFNLENBQUNzQixPQUFPLENBQUM7UUFDcEN0QixNQUFNLENBQUNzQixPQUFPLEdBQUcsSUFBSTtNQUN2QjtNQUNBckIsV0FBVyxDQUFDcUIsT0FBTyxHQUFHLENBQUM7SUFDekIsQ0FBQztFQUNILENBQUMsRUFBRSxDQUNEekQsVUFBVSxFQUNWRSxPQUFPLEVBQ1BFLGdCQUFnQixFQUNoQkUsZ0JBQWdCLEVBQ2hCRSxXQUFXLEVBQ1hFLGtCQUFrQixFQUNsQkUsa0JBQWtCLEVBQ2xCRSxpQkFBaUIsRUFDakJFLGNBQWMsRUFDZEUsa0JBQWtCLEVBQ2xCRSxjQUFjLEVBQ2RFLFFBQVEsRUFDUkUsS0FBSyxFQUNMRSxVQUFVLENBQ1gsQ0FBQztFQUVGLE9BQU9JLFNBQVM7QUFDbEIsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
export { useStreamingMessage, useStreamingMessageId } from './useStreamingMessage';
|
|
2
|
-
export { streamingStore } from './streamingStore';
|
|
3
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VTdHJlYW1pbmdNZXNzYWdlIiwidXNlU3RyZWFtaW5nTWVzc2FnZUlkIiwic3RyZWFtaW5nU3RvcmUiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaG9va3MvdXNlU3RyZWFtaW5nTWVzc2FnZS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyB1c2VTdHJlYW1pbmdNZXNzYWdlLCB1c2VTdHJlYW1pbmdNZXNzYWdlSWQgfSBmcm9tICcuL3VzZVN0cmVhbWluZ01lc3NhZ2UnXG5leHBvcnQgeyBzdHJlYW1pbmdTdG9yZSB9IGZyb20gJy4vc3RyZWFtaW5nU3RvcmUnXG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLG1CQUFtQixFQUFFQyxxQkFBcUIsUUFBUSx1QkFBdUI7QUFDbEYsU0FBU0MsY0FBYyxRQUFRLGtCQUFrQiIsImlnbm9yZUxpc3QiOltdfQ==
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Store externo (module-level) para el mensaje actualmente en streaming.
|
|
3
|
-
*
|
|
4
|
-
* Desacopla el texto del stream del array de `messages` de React: durante
|
|
5
|
-
* el streaming, el texto se mantiene acá y solo los componentes suscritos
|
|
6
|
-
* (vía `useStreamingMessage` / `useSyncExternalStore`) re-renderizan cuando
|
|
7
|
-
* cambia. El array `messages` no se muta en cada token, evitando ráfagas
|
|
8
|
-
* de re-renders del padre y ejecuciones innecesarias de useEffects.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
var snapshot = {
|
|
12
|
-
id: null,
|
|
13
|
-
text: ''
|
|
14
|
-
};
|
|
15
|
-
var listeners = new Set();
|
|
16
|
-
var emitChange = function emitChange() {
|
|
17
|
-
listeners.forEach(function (listener) {
|
|
18
|
-
listener();
|
|
19
|
-
});
|
|
20
|
-
};
|
|
21
|
-
export var streamingStore = {
|
|
22
|
-
/** Inicia una nueva sesión de streaming para el mensaje con este id. */start: function start(id) {
|
|
23
|
-
snapshot = {
|
|
24
|
-
id: id,
|
|
25
|
-
text: ''
|
|
26
|
-
};
|
|
27
|
-
emitChange();
|
|
28
|
-
},
|
|
29
|
-
/** Setea el texto del mensaje en streaming. Solo aplica si el id coincide. */setText: function setText(id, text) {
|
|
30
|
-
if (snapshot.id !== id) {
|
|
31
|
-
snapshot = {
|
|
32
|
-
id: id,
|
|
33
|
-
text: text
|
|
34
|
-
};
|
|
35
|
-
} else if (snapshot.text !== text) {
|
|
36
|
-
snapshot = {
|
|
37
|
-
id: id,
|
|
38
|
-
text: text
|
|
39
|
-
};
|
|
40
|
-
} else {
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
emitChange();
|
|
44
|
-
},
|
|
45
|
-
/** Limpia el estado de streaming (fin de stream, error o aprobación). */clear: function clear() {
|
|
46
|
-
if (snapshot.id == null && snapshot.text === '') return;
|
|
47
|
-
snapshot = {
|
|
48
|
-
id: null,
|
|
49
|
-
text: ''
|
|
50
|
-
};
|
|
51
|
-
emitChange();
|
|
52
|
-
},
|
|
53
|
-
/** API para useSyncExternalStore. */subscribe: function subscribe(listener) {
|
|
54
|
-
listeners.add(listener);
|
|
55
|
-
return function () {
|
|
56
|
-
listeners["delete"](listener);
|
|
57
|
-
};
|
|
58
|
-
},
|
|
59
|
-
/** Snapshot referencialmente estable mientras no haya cambios. */getSnapshot: function getSnapshot() {
|
|
60
|
-
return snapshot;
|
|
61
|
-
},
|
|
62
|
-
/** Server snapshot (SSR): siempre vacío. */getServerSnapshot: function getServerSnapshot() {
|
|
63
|
-
return {
|
|
64
|
-
id: null,
|
|
65
|
-
text: ''
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzbmFwc2hvdCIsImlkIiwidGV4dCIsImxpc3RlbmVycyIsIlNldCIsImVtaXRDaGFuZ2UiLCJmb3JFYWNoIiwibGlzdGVuZXIiLCJzdHJlYW1pbmdTdG9yZSIsInN0YXJ0Iiwic2V0VGV4dCIsImNsZWFyIiwic3Vic2NyaWJlIiwiYWRkIiwiZ2V0U25hcHNob3QiLCJnZXRTZXJ2ZXJTbmFwc2hvdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ob29rcy91c2VTdHJlYW1pbmdNZXNzYWdlL3N0cmVhbWluZ1N0b3JlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3RvcmUgZXh0ZXJubyAobW9kdWxlLWxldmVsKSBwYXJhIGVsIG1lbnNhamUgYWN0dWFsbWVudGUgZW4gc3RyZWFtaW5nLlxuICpcbiAqIERlc2Fjb3BsYSBlbCB0ZXh0byBkZWwgc3RyZWFtIGRlbCBhcnJheSBkZSBgbWVzc2FnZXNgIGRlIFJlYWN0OiBkdXJhbnRlXG4gKiBlbCBzdHJlYW1pbmcsIGVsIHRleHRvIHNlIG1hbnRpZW5lIGFjw6EgeSBzb2xvIGxvcyBjb21wb25lbnRlcyBzdXNjcml0b3NcbiAqICh2w61hIGB1c2VTdHJlYW1pbmdNZXNzYWdlYCAvIGB1c2VTeW5jRXh0ZXJuYWxTdG9yZWApIHJlLXJlbmRlcml6YW4gY3VhbmRvXG4gKiBjYW1iaWEuIEVsIGFycmF5IGBtZXNzYWdlc2Agbm8gc2UgbXV0YSBlbiBjYWRhIHRva2VuLCBldml0YW5kbyByw6FmYWdhc1xuICogZGUgcmUtcmVuZGVycyBkZWwgcGFkcmUgeSBlamVjdWNpb25lcyBpbm5lY2VzYXJpYXMgZGUgdXNlRWZmZWN0cy5cbiAqL1xuXG50eXBlIFN0cmVhbWluZ1NuYXBzaG90ID0ge1xuICBpZDogc3RyaW5nIHwgbnVsbFxuICB0ZXh0OiBzdHJpbmdcbn1cblxubGV0IHNuYXBzaG90OiBTdHJlYW1pbmdTbmFwc2hvdCA9IHsgaWQ6IG51bGwsIHRleHQ6ICcnIH1cbmNvbnN0IGxpc3RlbmVycyA9IG5ldyBTZXQ8KCkgPT4gdm9pZD4oKVxuXG5jb25zdCBlbWl0Q2hhbmdlID0gKCkgPT4ge1xuICBsaXN0ZW5lcnMuZm9yRWFjaChsaXN0ZW5lciA9PiB7XG4gICAgbGlzdGVuZXIoKVxuICB9KVxufVxuXG5leHBvcnQgY29uc3Qgc3RyZWFtaW5nU3RvcmUgPSB7XG4gIC8qKiBJbmljaWEgdW5hIG51ZXZhIHNlc2nDs24gZGUgc3RyZWFtaW5nIHBhcmEgZWwgbWVuc2FqZSBjb24gZXN0ZSBpZC4gKi9cbiAgc3RhcnQoaWQ6IHN0cmluZykge1xuICAgIHNuYXBzaG90ID0geyBpZCwgdGV4dDogJycgfVxuICAgIGVtaXRDaGFuZ2UoKVxuICB9LFxuICAvKiogU2V0ZWEgZWwgdGV4dG8gZGVsIG1lbnNhamUgZW4gc3RyZWFtaW5nLiBTb2xvIGFwbGljYSBzaSBlbCBpZCBjb2luY2lkZS4gKi9cbiAgc2V0VGV4dChpZDogc3RyaW5nLCB0ZXh0OiBzdHJpbmcpIHtcbiAgICBpZiAoc25hcHNob3QuaWQgIT09IGlkKSB7XG4gICAgICBzbmFwc2hvdCA9IHsgaWQsIHRleHQgfVxuICAgIH0gZWxzZSBpZiAoc25hcHNob3QudGV4dCAhPT0gdGV4dCkge1xuICAgICAgc25hcHNob3QgPSB7IGlkLCB0ZXh0IH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGVtaXRDaGFuZ2UoKVxuICB9LFxuICAvKiogTGltcGlhIGVsIGVzdGFkbyBkZSBzdHJlYW1pbmcgKGZpbiBkZSBzdHJlYW0sIGVycm9yIG8gYXByb2JhY2nDs24pLiAqL1xuICBjbGVhcigpIHtcbiAgICBpZiAoc25hcHNob3QuaWQgPT0gbnVsbCAmJiBzbmFwc2hvdC50ZXh0ID09PSAnJykgcmV0dXJuXG4gICAgc25hcHNob3QgPSB7IGlkOiBudWxsLCB0ZXh0OiAnJyB9XG4gICAgZW1pdENoYW5nZSgpXG4gIH0sXG4gIC8qKiBBUEkgcGFyYSB1c2VTeW5jRXh0ZXJuYWxTdG9yZS4gKi9cbiAgc3Vic2NyaWJlKGxpc3RlbmVyOiAoKSA9PiB2b2lkKSB7XG4gICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcilcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgbGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcilcbiAgICB9XG4gIH0sXG4gIC8qKiBTbmFwc2hvdCByZWZlcmVuY2lhbG1lbnRlIGVzdGFibGUgbWllbnRyYXMgbm8gaGF5YSBjYW1iaW9zLiAqL1xuICBnZXRTbmFwc2hvdCgpOiBTdHJlYW1pbmdTbmFwc2hvdCB7XG4gICAgcmV0dXJuIHNuYXBzaG90XG4gIH0sXG4gIC8qKiBTZXJ2ZXIgc25hcHNob3QgKFNTUik6IHNpZW1wcmUgdmFjw61vLiAqL1xuICBnZXRTZXJ2ZXJTbmFwc2hvdCgpOiBTdHJlYW1pbmdTbmFwc2hvdCB7XG4gICAgcmV0dXJuIHsgaWQ6IG51bGwsIHRleHQ6ICcnIH1cbiAgfSxcbn1cblxuZXhwb3J0IHR5cGUgeyBTdHJlYW1pbmdTbmFwc2hvdCB9XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFPQSxJQUFJQSxRQUEyQixHQUFHO0VBQUVDLEVBQUUsRUFBRSxJQUFJO0VBQUVDLElBQUksRUFBRTtBQUFHLENBQUM7QUFDeEQsSUFBTUMsU0FBUyxHQUFHLElBQUlDLEdBQUcsQ0FBYSxDQUFDO0FBRXZDLElBQU1DLFVBQVUsR0FBRyxTQUFiQSxVQUFVQSxDQUFBLEVBQVM7RUFDdkJGLFNBQVMsQ0FBQ0csT0FBTyxDQUFDLFVBQUFDLFFBQVEsRUFBSTtJQUM1QkEsUUFBUSxDQUFDLENBQUM7RUFDWixDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsT0FBTyxJQUFNQyxjQUFjLEdBQUc7RUFDNUIsd0VBQ0FDLEtBQUssV0FBTEEsS0FBS0EsQ0FBQ1IsRUFBVSxFQUFFO0lBQ2hCRCxRQUFRLEdBQUc7TUFBRUMsRUFBRSxFQUFGQSxFQUFFO01BQUVDLElBQUksRUFBRTtJQUFHLENBQUM7SUFDM0JHLFVBQVUsQ0FBQyxDQUFDO0VBQ2QsQ0FBQztFQUNELDhFQUNBSyxPQUFPLFdBQVBBLE9BQU9BLENBQUNULEVBQVUsRUFBRUMsSUFBWSxFQUFFO0lBQ2hDLElBQUlGLFFBQVEsQ0FBQ0MsRUFBRSxLQUFLQSxFQUFFLEVBQUU7TUFDdEJELFFBQVEsR0FBRztRQUFFQyxFQUFFLEVBQUZBLEVBQUU7UUFBRUMsSUFBSSxFQUFKQTtNQUFLLENBQUM7SUFDekIsQ0FBQyxNQUFNLElBQUlGLFFBQVEsQ0FBQ0UsSUFBSSxLQUFLQSxJQUFJLEVBQUU7TUFDakNGLFFBQVEsR0FBRztRQUFFQyxFQUFFLEVBQUZBLEVBQUU7UUFBRUMsSUFBSSxFQUFKQTtNQUFLLENBQUM7SUFDekIsQ0FBQyxNQUFNO01BQ0w7SUFDRjtJQUNBRyxVQUFVLENBQUMsQ0FBQztFQUNkLENBQUM7RUFDRCx5RUFDQU0sS0FBSyxXQUFMQSxLQUFLQSxDQUFBLEVBQUc7SUFDTixJQUFJWCxRQUFRLENBQUNDLEVBQUUsSUFBSSxJQUFJLElBQUlELFFBQVEsQ0FBQ0UsSUFBSSxLQUFLLEVBQUUsRUFBRTtJQUNqREYsUUFBUSxHQUFHO01BQUVDLEVBQUUsRUFBRSxJQUFJO01BQUVDLElBQUksRUFBRTtJQUFHLENBQUM7SUFDakNHLFVBQVUsQ0FBQyxDQUFDO0VBQ2QsQ0FBQztFQUNELHFDQUNBTyxTQUFTLFdBQVRBLFNBQVNBLENBQUNMLFFBQW9CLEVBQUU7SUFDOUJKLFNBQVMsQ0FBQ1UsR0FBRyxDQUFDTixRQUFRLENBQUM7SUFDdkIsT0FBTyxZQUFNO01BQ1hKLFNBQVMsVUFBTyxDQUFDSSxRQUFRLENBQUM7SUFDNUIsQ0FBQztFQUNILENBQUM7RUFDRCxrRUFDQU8sV0FBVyxXQUFYQSxXQUFXQSxDQUFBLEVBQXNCO0lBQy9CLE9BQU9kLFFBQVE7RUFDakIsQ0FBQztFQUNELDRDQUNBZSxpQkFBaUIsV0FBakJBLGlCQUFpQkEsQ0FBQSxFQUFzQjtJQUNyQyxPQUFPO01BQUVkLEVBQUUsRUFBRSxJQUFJO01BQUVDLElBQUksRUFBRTtJQUFHLENBQUM7RUFDL0I7QUFDRixDQUFDIiwiaWdub3JlTGlzdCI6W119
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { useSyncExternalStore } from 'react';
|
|
2
|
-
import { streamingStore } from './streamingStore';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Devuelve el texto actual del mensaje en streaming si el `id` coincide con
|
|
6
|
-
* el mensaje activo. Si no hay streaming activo o el id no coincide, devuelve
|
|
7
|
-
* una cadena vacía. Esto permite que solo el componente del mensaje en
|
|
8
|
-
* streaming se re-renderice, sin afectar al resto del árbol.
|
|
9
|
-
*/
|
|
10
|
-
export var useStreamingMessage = function useStreamingMessage(messageId) {
|
|
11
|
-
var snapshot = useSyncExternalStore(streamingStore.subscribe, streamingStore.getSnapshot, streamingStore.getServerSnapshot);
|
|
12
|
-
if (!messageId) return '';
|
|
13
|
-
if (snapshot.id !== messageId) return '';
|
|
14
|
-
return snapshot.text;
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
/** Devuelve el id del mensaje que está actualmente en streaming (o null). */
|
|
18
|
-
export var useStreamingMessageId = function useStreamingMessageId() {
|
|
19
|
-
var snapshot = useSyncExternalStore(streamingStore.subscribe, streamingStore.getSnapshot, streamingStore.getServerSnapshot);
|
|
20
|
-
return snapshot.id;
|
|
21
|
-
};
|
|
22
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VTeW5jRXh0ZXJuYWxTdG9yZSIsInN0cmVhbWluZ1N0b3JlIiwidXNlU3RyZWFtaW5nTWVzc2FnZSIsIm1lc3NhZ2VJZCIsInNuYXBzaG90Iiwic3Vic2NyaWJlIiwiZ2V0U25hcHNob3QiLCJnZXRTZXJ2ZXJTbmFwc2hvdCIsImlkIiwidGV4dCIsInVzZVN0cmVhbWluZ01lc3NhZ2VJZCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ob29rcy91c2VTdHJlYW1pbmdNZXNzYWdlL3VzZVN0cmVhbWluZ01lc3NhZ2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlU3luY0V4dGVybmFsU3RvcmUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHN0cmVhbWluZ1N0b3JlIH0gZnJvbSAnLi9zdHJlYW1pbmdTdG9yZSdcblxuLyoqXG4gKiBEZXZ1ZWx2ZSBlbCB0ZXh0byBhY3R1YWwgZGVsIG1lbnNhamUgZW4gc3RyZWFtaW5nIHNpIGVsIGBpZGAgY29pbmNpZGUgY29uXG4gKiBlbCBtZW5zYWplIGFjdGl2by4gU2kgbm8gaGF5IHN0cmVhbWluZyBhY3Rpdm8gbyBlbCBpZCBubyBjb2luY2lkZSwgZGV2dWVsdmVcbiAqIHVuYSBjYWRlbmEgdmFjw61hLiBFc3RvIHBlcm1pdGUgcXVlIHNvbG8gZWwgY29tcG9uZW50ZSBkZWwgbWVuc2FqZSBlblxuICogc3RyZWFtaW5nIHNlIHJlLXJlbmRlcmljZSwgc2luIGFmZWN0YXIgYWwgcmVzdG8gZGVsIMOhcmJvbC5cbiAqL1xuZXhwb3J0IGNvbnN0IHVzZVN0cmVhbWluZ01lc3NhZ2UgPSAobWVzc2FnZUlkOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgc25hcHNob3QgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZShcbiAgICBzdHJlYW1pbmdTdG9yZS5zdWJzY3JpYmUsXG4gICAgc3RyZWFtaW5nU3RvcmUuZ2V0U25hcHNob3QsXG4gICAgc3RyZWFtaW5nU3RvcmUuZ2V0U2VydmVyU25hcHNob3RcbiAgKVxuICBpZiAoIW1lc3NhZ2VJZCkgcmV0dXJuICcnXG4gIGlmIChzbmFwc2hvdC5pZCAhPT0gbWVzc2FnZUlkKSByZXR1cm4gJydcbiAgcmV0dXJuIHNuYXBzaG90LnRleHRcbn1cblxuLyoqIERldnVlbHZlIGVsIGlkIGRlbCBtZW5zYWplIHF1ZSBlc3TDoSBhY3R1YWxtZW50ZSBlbiBzdHJlYW1pbmcgKG8gbnVsbCkuICovXG5leHBvcnQgY29uc3QgdXNlU3RyZWFtaW5nTWVzc2FnZUlkID0gKCk6IHN0cmluZyB8IG51bGwgPT4ge1xuICBjb25zdCBzbmFwc2hvdCA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlKFxuICAgIHN0cmVhbWluZ1N0b3JlLnN1YnNjcmliZSxcbiAgICBzdHJlYW1pbmdTdG9yZS5nZXRTbmFwc2hvdCxcbiAgICBzdHJlYW1pbmdTdG9yZS5nZXRTZXJ2ZXJTbmFwc2hvdFxuICApXG4gIHJldHVybiBzbmFwc2hvdC5pZFxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxvQkFBb0IsUUFBUSxPQUFPO0FBQzVDLFNBQVNDLGNBQWMsUUFBUSxrQkFBa0I7O0FBRWpEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sSUFBTUMsbUJBQW1CLEdBQUcsU0FBdEJBLG1CQUFtQkEsQ0FBSUMsU0FBb0MsRUFBYTtFQUNuRixJQUFNQyxRQUFRLEdBQUdKLG9CQUFvQixDQUNuQ0MsY0FBYyxDQUFDSSxTQUFTLEVBQ3hCSixjQUFjLENBQUNLLFdBQVcsRUFDMUJMLGNBQWMsQ0FBQ00saUJBQ2pCLENBQUM7RUFDRCxJQUFJLENBQUNKLFNBQVMsRUFBRSxPQUFPLEVBQUU7RUFDekIsSUFBSUMsUUFBUSxDQUFDSSxFQUFFLEtBQUtMLFNBQVMsRUFBRSxPQUFPLEVBQUU7RUFDeEMsT0FBT0MsUUFBUSxDQUFDSyxJQUFJO0FBQ3RCLENBQUM7O0FBRUQ7QUFDQSxPQUFPLElBQU1DLHFCQUFxQixHQUFHLFNBQXhCQSxxQkFBcUJBLENBQUEsRUFBd0I7RUFDeEQsSUFBTU4sUUFBUSxHQUFHSixvQkFBb0IsQ0FDbkNDLGNBQWMsQ0FBQ0ksU0FBUyxFQUN4QkosY0FBYyxDQUFDSyxXQUFXLEVBQzFCTCxjQUFjLENBQUNNLGlCQUNqQixDQUFDO0VBQ0QsT0FBT0gsUUFBUSxDQUFDSSxFQUFFO0FBQ3BCLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
|