valtech-components 4.0.219 → 4.0.221
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/esm2022/lib/components/molecules/chat-input/chat-input.component.mjs +157 -0
- package/esm2022/lib/components/molecules/chat-input/types.mjs +2 -0
- package/esm2022/lib/components/molecules/message-bubble/message-bubble.component.mjs +244 -0
- package/esm2022/lib/components/molecules/message-bubble/types.mjs +2 -0
- package/esm2022/lib/components/molecules/typing-indicator/typing-indicator.component.mjs +76 -0
- package/esm2022/lib/components/organisms/chat-window/chat-window.component.mjs +246 -0
- package/esm2022/lib/components/organisms/chat-window/types.mjs +2 -0
- package/esm2022/lib/components/organisms/thread-panel/thread-panel.component.mjs +211 -0
- package/esm2022/lib/services/chat/config.mjs +35 -0
- package/esm2022/lib/services/chat/conversation.service.mjs +274 -0
- package/esm2022/lib/services/chat/types.mjs +10 -0
- package/esm2022/lib/services/entity-feed/entity-feed.service.mjs +103 -0
- package/esm2022/lib/services/entity-feed/index.mjs +2 -0
- package/esm2022/lib/services/entity-feed/types.mjs +2 -0
- package/esm2022/lib/services/i18n/default-content.mjs +65 -1
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/public-api.mjs +16 -1
- package/fesm2022/valtech-components.mjs +1370 -3
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/atoms/rights-footer/rights-footer.component.d.ts +2 -2
- package/lib/components/atoms/text/text.component.d.ts +1 -1
- package/lib/components/atoms/user-avatar/user-avatar.component.d.ts +1 -1
- package/lib/components/molecules/chat-input/chat-input.component.d.ts +38 -0
- package/lib/components/molecules/chat-input/types.d.ts +20 -0
- package/lib/components/molecules/cta-card/cta-card.component.d.ts +1 -1
- package/lib/components/molecules/features-list/features-list.component.d.ts +1 -1
- package/lib/components/molecules/load-more/load-more.component.d.ts +1 -1
- package/lib/components/molecules/message-bubble/message-bubble.component.d.ts +40 -0
- package/lib/components/molecules/message-bubble/types.d.ts +64 -0
- package/lib/components/molecules/metric-card/metric-card.component.d.ts +1 -1
- package/lib/components/molecules/typing-indicator/typing-indicator.component.d.ts +19 -0
- package/lib/components/organisms/article/article.component.d.ts +7 -7
- package/lib/components/organisms/auth-cta/auth-cta.component.d.ts +1 -1
- package/lib/components/organisms/chat-window/chat-window.component.d.ts +63 -0
- package/lib/components/organisms/chat-window/types.d.ts +36 -0
- package/lib/components/organisms/landing-steps/landing-steps.component.d.ts +1 -1
- package/lib/components/organisms/thread-panel/thread-panel.component.d.ts +55 -0
- package/lib/services/chat/config.d.ts +37 -0
- package/lib/services/chat/conversation.service.d.ts +147 -0
- package/lib/services/chat/types.d.ts +145 -0
- package/lib/services/entity-feed/entity-feed.service.d.ts +71 -0
- package/lib/services/entity-feed/index.d.ts +2 -0
- package/lib/services/entity-feed/types.d.ts +26 -0
- package/lib/version.d.ts +1 -1
- package/package.json +2 -2
- package/public-api.d.ts +13 -0
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { Injectable, inject, isDevMode } from '@angular/core';
|
|
2
|
+
import { HttpClient } from '@angular/common/http';
|
|
3
|
+
import { map } from 'rxjs';
|
|
4
|
+
import { serverTimestamp, deleteDoc, doc, setDoc, updateDoc } from '@angular/fire/firestore';
|
|
5
|
+
import { Firestore } from '@angular/fire/firestore';
|
|
6
|
+
import { VALTECH_CHAT_CONFIG } from './config';
|
|
7
|
+
import { FirestoreService } from '../firebase/firestore.service';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
/**
|
|
10
|
+
* ConversationService
|
|
11
|
+
*
|
|
12
|
+
* Gestiona conversaciones y mensajes del chat.
|
|
13
|
+
*
|
|
14
|
+
* Dos capas:
|
|
15
|
+
* - HTTP (via backend /v2/chat/*): operaciones de escritura y consulta.
|
|
16
|
+
* - Firestore real-time (directa): escucha mensajes y estado de escritura.
|
|
17
|
+
*
|
|
18
|
+
* Paths Firestore:
|
|
19
|
+
* /apps/{appId}/orgs/{orgId}/conversations/{convId}/messages/{msgId}
|
|
20
|
+
* /apps/{appId}/orgs/{orgId}/conversations/{convId}/typing/{userId}
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* // Enviar y escuchar mensajes
|
|
24
|
+
* const svc = inject(ConversationService);
|
|
25
|
+
*
|
|
26
|
+
* // Enviar (HTTP)
|
|
27
|
+
* svc.sendMessage(convId, 'Hola!').subscribe();
|
|
28
|
+
*
|
|
29
|
+
* // Escuchar en tiempo real (Firestore)
|
|
30
|
+
* svc.watchMessages(convId, orgId, appId).subscribe(msgs => this.messages.set(msgs));
|
|
31
|
+
*/
|
|
32
|
+
export class ConversationService {
|
|
33
|
+
constructor() {
|
|
34
|
+
this.config = inject(VALTECH_CHAT_CONFIG, { optional: true });
|
|
35
|
+
this.http = inject(HttpClient);
|
|
36
|
+
this.firestoreService = inject(FirestoreService, { optional: true });
|
|
37
|
+
this.firestore = inject(Firestore, { optional: true });
|
|
38
|
+
if (!this.config && isDevMode()) {
|
|
39
|
+
console.warn('[valtech-components] ConversationService: provideValtechChat() no esta en main.ts. ' +
|
|
40
|
+
'El chat no funcionara.');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// ===========================================================================
|
|
44
|
+
// HTTP — operaciones de escritura y consulta al backend
|
|
45
|
+
// ===========================================================================
|
|
46
|
+
get baseUrl() {
|
|
47
|
+
return `${this.config?.apiUrl}${this.config?.chatPrefix ?? '/v2/chat'}`;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Crea una nueva conversacion.
|
|
51
|
+
*/
|
|
52
|
+
createConversation(req) {
|
|
53
|
+
return this.http.post(`${this.baseUrl}/conversations`, req);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Obtiene o crea una conversacion asociada a una entidad (post, request, etc.).
|
|
57
|
+
* Usa el patron upsert del backend: si ya existe una conversacion para esa entidad,
|
|
58
|
+
* la devuelve; si no, la crea.
|
|
59
|
+
*/
|
|
60
|
+
getOrCreateForEntity(entityType, entityId, type = 'entity') {
|
|
61
|
+
return this.http.post(`${this.baseUrl}/conversations/entity-conversations`, {
|
|
62
|
+
entityType,
|
|
63
|
+
entityId,
|
|
64
|
+
type,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Lista las conversaciones del usuario autenticado.
|
|
69
|
+
*/
|
|
70
|
+
listConversations(cursor) {
|
|
71
|
+
const params = {};
|
|
72
|
+
if (cursor)
|
|
73
|
+
params['cursor'] = cursor;
|
|
74
|
+
return this.http.get(`${this.baseUrl}/conversations`, { params });
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Obtiene una conversacion por ID.
|
|
78
|
+
*/
|
|
79
|
+
getConversation(convId) {
|
|
80
|
+
return this.http.get(`${this.baseUrl}/conversations/${convId}`);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Actualiza el titulo o estado de una conversacion.
|
|
84
|
+
*/
|
|
85
|
+
updateConversation(convId, req) {
|
|
86
|
+
return this.http.patch(`${this.baseUrl}/conversations/${convId}`, req);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Abre una conversacion cerrada.
|
|
90
|
+
*/
|
|
91
|
+
openConversation(convId) {
|
|
92
|
+
return this.http.post(`${this.baseUrl}/conversations/${convId}/open`, {});
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Cierra una conversacion.
|
|
96
|
+
*/
|
|
97
|
+
closeConversation(convId) {
|
|
98
|
+
return this.http.post(`${this.baseUrl}/conversations/${convId}/close`, {});
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Agrega un participante a la conversacion.
|
|
102
|
+
*/
|
|
103
|
+
addParticipant(convId, userId) {
|
|
104
|
+
return this.http.post(`${this.baseUrl}/conversations/${convId}/participants`, { userId });
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Elimina un participante de la conversacion.
|
|
108
|
+
*/
|
|
109
|
+
removeParticipant(convId, userId) {
|
|
110
|
+
return this.http.delete(`${this.baseUrl}/conversations/${convId}/participants/${userId}`);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Envia un mensaje a una conversacion.
|
|
114
|
+
*/
|
|
115
|
+
sendMessage(convId, body) {
|
|
116
|
+
return this.http.post(`${this.baseUrl}/conversations/${convId}/messages`, { body });
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Elimina (marca como eliminado) un mensaje.
|
|
120
|
+
*/
|
|
121
|
+
deleteMessage(convId, msgId) {
|
|
122
|
+
return this.http.delete(`${this.baseUrl}/conversations/${convId}/messages/${msgId}`);
|
|
123
|
+
}
|
|
124
|
+
// ===========================================================================
|
|
125
|
+
// Firestore — escucha en tiempo real (sin pasar por el backend)
|
|
126
|
+
// ===========================================================================
|
|
127
|
+
/**
|
|
128
|
+
* Construye el path base para los datos de una conversacion.
|
|
129
|
+
* Nota: usamos el path completo con skipPrefix porque el path ya incluye
|
|
130
|
+
* apps/{appId}/orgs/{orgId} que el FirestoreService prefijaria de nuevo.
|
|
131
|
+
* En cambio armamos el path como sub-coleccion directamente.
|
|
132
|
+
*/
|
|
133
|
+
convMessagesPath(convId, orgId, appId) {
|
|
134
|
+
return `apps/${appId}/orgs/${orgId}/conversations/${convId}/messages`;
|
|
135
|
+
}
|
|
136
|
+
convTypingPath(convId, orgId, appId) {
|
|
137
|
+
return `apps/${appId}/orgs/${orgId}/conversations/${convId}/typing`;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Escucha los mensajes de una conversacion en tiempo real.
|
|
141
|
+
*
|
|
142
|
+
* @param convId - ID de la conversacion
|
|
143
|
+
* @param orgId - ID de la organizacion
|
|
144
|
+
* @param appId - ID de la aplicacion
|
|
145
|
+
* @param limit - Cantidad maxima de mensajes a cargar (default 50)
|
|
146
|
+
*/
|
|
147
|
+
watchMessages(convId, orgId, appId, limit = 50) {
|
|
148
|
+
if (!this.firestoreService) {
|
|
149
|
+
throw new Error('[ConversationService] FirestoreService no disponible. Asegurate de provideValtechFirebase().');
|
|
150
|
+
}
|
|
151
|
+
// Usamos ABS_PATH_SENTINEL para evitar que FirestoreService anteponga el prefijo
|
|
152
|
+
// porque el path ya contiene la ruta completa con appId/orgId.
|
|
153
|
+
const { ABS_PATH_SENTINEL } = this.getAbsPathSentinel();
|
|
154
|
+
const collectionPath = `${ABS_PATH_SENTINEL}${this.convMessagesPath(convId, orgId, appId)}`;
|
|
155
|
+
return this.firestoreService.collectionChanges(collectionPath, {
|
|
156
|
+
orderBy: [{ field: 'createdAt', direction: 'asc' }],
|
|
157
|
+
limit,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Escucha los usuarios que estan escribiendo en una conversacion.
|
|
162
|
+
* Devuelve un array de displayNames.
|
|
163
|
+
*
|
|
164
|
+
* @param convId - ID de la conversacion
|
|
165
|
+
* @param orgId - ID de la organizacion
|
|
166
|
+
* @param appId - ID de la aplicacion
|
|
167
|
+
*/
|
|
168
|
+
watchTyping(convId, orgId, appId) {
|
|
169
|
+
if (!this.firestoreService) {
|
|
170
|
+
throw new Error('[ConversationService] FirestoreService no disponible. Asegurate de provideValtechFirebase().');
|
|
171
|
+
}
|
|
172
|
+
const { ABS_PATH_SENTINEL } = this.getAbsPathSentinel();
|
|
173
|
+
const collectionPath = `${ABS_PATH_SENTINEL}${this.convTypingPath(convId, orgId, appId)}`;
|
|
174
|
+
return this.firestoreService
|
|
175
|
+
.collectionChanges(collectionPath)
|
|
176
|
+
.pipe(map(docs => docs.map(d => d.displayName)));
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Registra que el usuario actual esta escribiendo.
|
|
180
|
+
* El documento se sobreescribe para actualizar el timestamp.
|
|
181
|
+
* Debe llamarse con un TTL/cleanup (ver stopTyping).
|
|
182
|
+
*
|
|
183
|
+
* @param convId - ID de la conversacion
|
|
184
|
+
* @param orgId - ID de la organizacion
|
|
185
|
+
* @param appId - ID de la aplicacion
|
|
186
|
+
* @param displayName - Nombre visible del usuario
|
|
187
|
+
*/
|
|
188
|
+
startTyping(convId, orgId, appId, displayName) {
|
|
189
|
+
if (!this.firestore)
|
|
190
|
+
return;
|
|
191
|
+
const userId = this.getCurrentUserId();
|
|
192
|
+
if (!userId)
|
|
193
|
+
return;
|
|
194
|
+
const path = `${this.convTypingPath(convId, orgId, appId)}/${userId}`;
|
|
195
|
+
const docRef = doc(this.firestore, path);
|
|
196
|
+
void setDoc(docRef, {
|
|
197
|
+
displayName,
|
|
198
|
+
updatedAt: serverTimestamp(),
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Elimina el documento de "escribiendo" del usuario actual.
|
|
203
|
+
*
|
|
204
|
+
* @param convId - ID de la conversacion
|
|
205
|
+
* @param orgId - ID de la organizacion
|
|
206
|
+
* @param appId - ID de la aplicacion
|
|
207
|
+
*/
|
|
208
|
+
stopTyping(convId, orgId, appId) {
|
|
209
|
+
if (!this.firestore)
|
|
210
|
+
return;
|
|
211
|
+
const userId = this.getCurrentUserId();
|
|
212
|
+
if (!userId)
|
|
213
|
+
return;
|
|
214
|
+
const path = `${this.convTypingPath(convId, orgId, appId)}/${userId}`;
|
|
215
|
+
const docRef = doc(this.firestore, path);
|
|
216
|
+
void deleteDoc(docRef);
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Marca un mensaje como leido por el usuario actual.
|
|
220
|
+
* Escribe directamente en Firestore sin pasar por el backend.
|
|
221
|
+
*
|
|
222
|
+
* @param convId - ID de la conversacion
|
|
223
|
+
* @param msgId - ID del ultimo mensaje leido
|
|
224
|
+
* @param orgId - ID de la organizacion
|
|
225
|
+
* @param appId - ID de la aplicacion
|
|
226
|
+
*/
|
|
227
|
+
markRead(convId, msgId, orgId, appId) {
|
|
228
|
+
if (!this.firestore)
|
|
229
|
+
return;
|
|
230
|
+
const userId = this.getCurrentUserId();
|
|
231
|
+
if (!userId)
|
|
232
|
+
return;
|
|
233
|
+
const convPath = `apps/${appId}/orgs/${orgId}/conversations/${convId}`;
|
|
234
|
+
const convRef = doc(this.firestore, convPath);
|
|
235
|
+
// Usa dot-notation de Firestore para actualizar solo el campo del usuario
|
|
236
|
+
const updateData = {
|
|
237
|
+
[`participants_readMap.${userId}`]: msgId,
|
|
238
|
+
updatedAt: serverTimestamp(),
|
|
239
|
+
};
|
|
240
|
+
void updateDoc(convRef, updateData);
|
|
241
|
+
}
|
|
242
|
+
// ===========================================================================
|
|
243
|
+
// Helpers privados
|
|
244
|
+
// ===========================================================================
|
|
245
|
+
/**
|
|
246
|
+
* Importa ABS_PATH_SENTINEL de forma lazy para evitar dependencias circulares.
|
|
247
|
+
*/
|
|
248
|
+
getAbsPathSentinel() {
|
|
249
|
+
// La sentinel se define en firestore.service.ts — replicamos el valor aqui
|
|
250
|
+
// para no crear una dependencia circular en el import estatico.
|
|
251
|
+
return { ABS_PATH_SENTINEL: '__abs__:' };
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Obtiene el userId del usuario actual desde sessionStorage / localStorage
|
|
255
|
+
* como fallback no-DI para el contexto de escritura de Firestore.
|
|
256
|
+
* En prod, el AuthService actualiza el userId en el contexto de la app.
|
|
257
|
+
*/
|
|
258
|
+
getCurrentUserId() {
|
|
259
|
+
// Intentar obtenerlo desde sessionStorage (el AuthService lo guarda ahi)
|
|
260
|
+
if (typeof sessionStorage !== 'undefined') {
|
|
261
|
+
const uid = sessionStorage.getItem('uid') ?? sessionStorage.getItem('userId');
|
|
262
|
+
if (uid)
|
|
263
|
+
return uid;
|
|
264
|
+
}
|
|
265
|
+
return null;
|
|
266
|
+
}
|
|
267
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ConversationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
268
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ConversationService, providedIn: 'root' }); }
|
|
269
|
+
}
|
|
270
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ConversationService, decorators: [{
|
|
271
|
+
type: Injectable,
|
|
272
|
+
args: [{ providedIn: 'root' }]
|
|
273
|
+
}], ctorParameters: () => [] });
|
|
274
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVyc2F0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2NoYXQvY29udmVyc2F0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQWMsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0YsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXBELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQVUvQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7QUFFakU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFFSCxNQUFNLE9BQU8sbUJBQW1CO0lBTTlCO1FBTFEsV0FBTSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELFNBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUIscUJBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDaEUsY0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUd4RCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxTQUFTLEVBQUUsRUFBRSxDQUFDO1lB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QWUsRUFBRTtTQUM3QixDQUFDO1FBRUYsS0FBSyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsbUJBQW1CO0lBQ25CLDhFQUE4RTtJQUU5RTs7T0FFRztJQUNLLGtCQUFrQjtRQUN4QiwyRUFBMkU7UUFDM0UsZ0VBQWdFO1FBQ2hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGdCQUFnQjtRQUN0Qix5RUFBeUU7UUFDekUsSUFBSSxPQUFPLGNBQWMsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUMxQyxNQUFNLEdBQUcsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDOUUsSUFBSSxHQUFHO2dCQUFFLE9BQU8sR0FBRyxDQUFDO1FBQ3RCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7K0dBeFJVLG1CQUFtQjttSEFBbkIsbUJBQW1CLGNBRE4sTUFBTTs7NEZBQ25CLG1CQUFtQjtrQkFEL0IsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QsIGlzRGV2TW9kZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG1hcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc2VydmVyVGltZXN0YW1wLCBkZWxldGVEb2MsIGRvYywgc2V0RG9jLCB1cGRhdGVEb2MgfSBmcm9tICdAYW5ndWxhci9maXJlL2ZpcmVzdG9yZSc7XG5pbXBvcnQgeyBGaXJlc3RvcmUgfSBmcm9tICdAYW5ndWxhci9maXJlL2ZpcmVzdG9yZSc7XG5cbmltcG9ydCB7IFZBTFRFQ0hfQ0hBVF9DT05GSUcgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQge1xuICBDb252ZXJzYXRpb24sXG4gIENvbnZlcnNhdGlvblR5cGUsXG4gIENyZWF0ZUNvbnZlcnNhdGlvblJlcXVlc3QsXG4gIExpc3RDb252ZXJzYXRpb25zUmVzcG9uc2UsXG4gIE1lc3NhZ2UsXG4gIFVwZGF0ZUNvbnZlcnNhdGlvblJlcXVlc3QsXG4gIFR5cGluZ0RvY3VtZW50LFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IEZpcmVzdG9yZVNlcnZpY2UgfSBmcm9tICcuLi9maXJlYmFzZS9maXJlc3RvcmUuc2VydmljZSc7XG5cbi8qKlxuICogQ29udmVyc2F0aW9uU2VydmljZVxuICpcbiAqIEdlc3Rpb25hIGNvbnZlcnNhY2lvbmVzIHkgbWVuc2FqZXMgZGVsIGNoYXQuXG4gKlxuICogRG9zIGNhcGFzOlxuICogICAtIEhUVFAgKHZpYSBiYWNrZW5kIC92Mi9jaGF0LyopOiBvcGVyYWNpb25lcyBkZSBlc2NyaXR1cmEgeSBjb25zdWx0YS5cbiAqICAgLSBGaXJlc3RvcmUgcmVhbC10aW1lIChkaXJlY3RhKTogZXNjdWNoYSBtZW5zYWplcyB5IGVzdGFkbyBkZSBlc2NyaXR1cmEuXG4gKlxuICogUGF0aHMgRmlyZXN0b3JlOlxuICogICAvYXBwcy97YXBwSWR9L29yZ3Mve29yZ0lkfS9jb252ZXJzYXRpb25zL3tjb252SWR9L21lc3NhZ2VzL3ttc2dJZH1cbiAqICAgL2FwcHMve2FwcElkfS9vcmdzL3tvcmdJZH0vY29udmVyc2F0aW9ucy97Y29udklkfS90eXBpbmcve3VzZXJJZH1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRW52aWFyIHkgZXNjdWNoYXIgbWVuc2FqZXNcbiAqIGNvbnN0IHN2YyA9IGluamVjdChDb252ZXJzYXRpb25TZXJ2aWNlKTtcbiAqXG4gKiAvLyBFbnZpYXIgKEhUVFApXG4gKiBzdmMuc2VuZE1lc3NhZ2UoY29udklkLCAnSG9sYSEnKS5zdWJzY3JpYmUoKTtcbiAqXG4gKiAvLyBFc2N1Y2hhciBlbiB0aWVtcG8gcmVhbCAoRmlyZXN0b3JlKVxuICogc3ZjLndhdGNoTWVzc2FnZXMoY29udklkLCBvcmdJZCwgYXBwSWQpLnN1YnNjcmliZShtc2dzID0+IHRoaXMubWVzc2FnZXMuc2V0KG1zZ3MpKTtcbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBDb252ZXJzYXRpb25TZXJ2aWNlIHtcbiAgcHJpdmF0ZSBjb25maWcgPSBpbmplY3QoVkFMVEVDSF9DSEFUX0NPTkZJRywgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSBodHRwID0gaW5qZWN0KEh0dHBDbGllbnQpO1xuICBwcml2YXRlIGZpcmVzdG9yZVNlcnZpY2UgPSBpbmplY3QoRmlyZXN0b3JlU2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSBmaXJlc3RvcmUgPSBpbmplY3QoRmlyZXN0b3JlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICghdGhpcy5jb25maWcgJiYgaXNEZXZNb2RlKCkpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ1t2YWx0ZWNoLWNvbXBvbmVudHNdIENvbnZlcnNhdGlvblNlcnZpY2U6IHByb3ZpZGVWYWx0ZWNoQ2hhdCgpIG5vIGVzdGEgZW4gbWFpbi50cy4gJyArXG4gICAgICAgICAgJ0VsIGNoYXQgbm8gZnVuY2lvbmFyYS4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIVFRQIOKAlCBvcGVyYWNpb25lcyBkZSBlc2NyaXR1cmEgeSBjb25zdWx0YSBhbCBiYWNrZW5kXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgZ2V0IGJhc2VVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5jb25maWc/LmFwaVVybH0ke3RoaXMuY29uZmlnPy5jaGF0UHJlZml4ID8/ICcvdjIvY2hhdCd9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhIHVuYSBudWV2YSBjb252ZXJzYWNpb24uXG4gICAqL1xuICBjcmVhdGVDb252ZXJzYXRpb24ocmVxOiBDcmVhdGVDb252ZXJzYXRpb25SZXF1ZXN0KTogT2JzZXJ2YWJsZTxDb252ZXJzYXRpb24+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8Q29udmVyc2F0aW9uPihgJHt0aGlzLmJhc2VVcmx9L2NvbnZlcnNhdGlvbnNgLCByZXEpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgbyBjcmVhIHVuYSBjb252ZXJzYWNpb24gYXNvY2lhZGEgYSB1bmEgZW50aWRhZCAocG9zdCwgcmVxdWVzdCwgZXRjLikuXG4gICAqIFVzYSBlbCBwYXRyb24gdXBzZXJ0IGRlbCBiYWNrZW5kOiBzaSB5YSBleGlzdGUgdW5hIGNvbnZlcnNhY2lvbiBwYXJhIGVzYSBlbnRpZGFkLFxuICAgKiBsYSBkZXZ1ZWx2ZTsgc2kgbm8sIGxhIGNyZWEuXG4gICAqL1xuICBnZXRPckNyZWF0ZUZvckVudGl0eShcbiAgICBlbnRpdHlUeXBlOiBzdHJpbmcsXG4gICAgZW50aXR5SWQ6IHN0cmluZyxcbiAgICB0eXBlOiBDb252ZXJzYXRpb25UeXBlID0gJ2VudGl0eSdcbiAgKTogT2JzZXJ2YWJsZTxDb252ZXJzYXRpb24+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8Q29udmVyc2F0aW9uPihgJHt0aGlzLmJhc2VVcmx9L2NvbnZlcnNhdGlvbnMvZW50aXR5LWNvbnZlcnNhdGlvbnNgLCB7XG4gICAgICBlbnRpdHlUeXBlLFxuICAgICAgZW50aXR5SWQsXG4gICAgICB0eXBlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RhIGxhcyBjb252ZXJzYWNpb25lcyBkZWwgdXN1YXJpbyBhdXRlbnRpY2Fkby5cbiAgICovXG4gIGxpc3RDb252ZXJzYXRpb25zKGN1cnNvcj86IHN0cmluZyk6IE9ic2VydmFibGU8TGlzdENvbnZlcnNhdGlvbnNSZXNwb25zZT4ge1xuICAgIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGlmIChjdXJzb3IpIHBhcmFtc1snY3Vyc29yJ10gPSBjdXJzb3I7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TGlzdENvbnZlcnNhdGlvbnNSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9jb252ZXJzYXRpb25zYCwgeyBwYXJhbXMgfSk7XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSB1bmEgY29udmVyc2FjaW9uIHBvciBJRC5cbiAgICovXG4gIGdldENvbnZlcnNhdGlvbihjb252SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Q29udmVyc2F0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8Q29udmVyc2F0aW9uPihgJHt0aGlzLmJhc2VVcmx9L2NvbnZlcnNhdGlvbnMvJHtjb252SWR9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWN0dWFsaXphIGVsIHRpdHVsbyBvIGVzdGFkbyBkZSB1bmEgY29udmVyc2FjaW9uLlxuICAgKi9cbiAgdXBkYXRlQ29udmVyc2F0aW9uKGNvbnZJZDogc3RyaW5nLCByZXE6IFVwZGF0ZUNvbnZlcnNhdGlvblJlcXVlc3QpOiBPYnNlcnZhYmxlPENvbnZlcnNhdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucGF0Y2g8Q29udmVyc2F0aW9uPihgJHt0aGlzLmJhc2VVcmx9L2NvbnZlcnNhdGlvbnMvJHtjb252SWR9YCwgcmVxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYnJlIHVuYSBjb252ZXJzYWNpb24gY2VycmFkYS5cbiAgICovXG4gIG9wZW5Db252ZXJzYXRpb24oY29udklkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8dm9pZD4oYCR7dGhpcy5iYXNlVXJsfS9jb252ZXJzYXRpb25zLyR7Y29udklkfS9vcGVuYCwge30pO1xuICB9XG5cbiAgLyoqXG4gICAqIENpZXJyYSB1bmEgY29udmVyc2FjaW9uLlxuICAgKi9cbiAgY2xvc2VDb252ZXJzYXRpb24oY29udklkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8dm9pZD4oYCR7dGhpcy5iYXNlVXJsfS9jb252ZXJzYXRpb25zLyR7Y29udklkfS9jbG9zZWAsIHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZ3JlZ2EgdW4gcGFydGljaXBhbnRlIGEgbGEgY29udmVyc2FjaW9uLlxuICAgKi9cbiAgYWRkUGFydGljaXBhbnQoY29udklkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PHZvaWQ+KGAke3RoaXMuYmFzZVVybH0vY29udmVyc2F0aW9ucy8ke2NvbnZJZH0vcGFydGljaXBhbnRzYCwgeyB1c2VySWQgfSk7XG4gIH1cblxuICAvKipcbiAgICogRWxpbWluYSB1biBwYXJ0aWNpcGFudGUgZGUgbGEgY29udmVyc2FjaW9uLlxuICAgKi9cbiAgcmVtb3ZlUGFydGljaXBhbnQoY29udklkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGU8dm9pZD4oYCR7dGhpcy5iYXNlVXJsfS9jb252ZXJzYXRpb25zLyR7Y29udklkfS9wYXJ0aWNpcGFudHMvJHt1c2VySWR9YCk7XG4gIH1cblxuICAvKipcbiAgICogRW52aWEgdW4gbWVuc2FqZSBhIHVuYSBjb252ZXJzYWNpb24uXG4gICAqL1xuICBzZW5kTWVzc2FnZShjb252SWQ6IHN0cmluZywgYm9keTogc3RyaW5nKTogT2JzZXJ2YWJsZTxNZXNzYWdlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PE1lc3NhZ2U+KGAke3RoaXMuYmFzZVVybH0vY29udmVyc2F0aW9ucy8ke2NvbnZJZH0vbWVzc2FnZXNgLCB7IGJvZHkgfSk7XG4gIH1cblxuICAvKipcbiAgICogRWxpbWluYSAobWFyY2EgY29tbyBlbGltaW5hZG8pIHVuIG1lbnNhamUuXG4gICAqL1xuICBkZWxldGVNZXNzYWdlKGNvbnZJZDogc3RyaW5nLCBtc2dJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGU8dm9pZD4oYCR7dGhpcy5iYXNlVXJsfS9jb252ZXJzYXRpb25zLyR7Y29udklkfS9tZXNzYWdlcy8ke21zZ0lkfWApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEZpcmVzdG9yZSDigJQgZXNjdWNoYSBlbiB0aWVtcG8gcmVhbCAoc2luIHBhc2FyIHBvciBlbCBiYWNrZW5kKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQ29uc3RydXllIGVsIHBhdGggYmFzZSBwYXJhIGxvcyBkYXRvcyBkZSB1bmEgY29udmVyc2FjaW9uLlxuICAgKiBOb3RhOiB1c2Ftb3MgZWwgcGF0aCBjb21wbGV0byBjb24gc2tpcFByZWZpeCBwb3JxdWUgZWwgcGF0aCB5YSBpbmNsdXllXG4gICAqIGFwcHMve2FwcElkfS9vcmdzL3tvcmdJZH0gcXVlIGVsIEZpcmVzdG9yZVNlcnZpY2UgcHJlZmlqYXJpYSBkZSBudWV2by5cbiAgICogRW4gY2FtYmlvIGFybWFtb3MgZWwgcGF0aCBjb21vIHN1Yi1jb2xlY2Npb24gZGlyZWN0YW1lbnRlLlxuICAgKi9cbiAgcHJpdmF0ZSBjb252TWVzc2FnZXNQYXRoKGNvbnZJZDogc3RyaW5nLCBvcmdJZDogc3RyaW5nLCBhcHBJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGFwcHMvJHthcHBJZH0vb3Jncy8ke29yZ0lkfS9jb252ZXJzYXRpb25zLyR7Y29udklkfS9tZXNzYWdlc2A7XG4gIH1cblxuICBwcml2YXRlIGNvbnZUeXBpbmdQYXRoKGNvbnZJZDogc3RyaW5nLCBvcmdJZDogc3RyaW5nLCBhcHBJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGFwcHMvJHthcHBJZH0vb3Jncy8ke29yZ0lkfS9jb252ZXJzYXRpb25zLyR7Y29udklkfS90eXBpbmdgO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzY3VjaGEgbG9zIG1lbnNhamVzIGRlIHVuYSBjb252ZXJzYWNpb24gZW4gdGllbXBvIHJlYWwuXG4gICAqXG4gICAqIEBwYXJhbSBjb252SWQgLSBJRCBkZSBsYSBjb252ZXJzYWNpb25cbiAgICogQHBhcmFtIG9yZ0lkIC0gSUQgZGUgbGEgb3JnYW5pemFjaW9uXG4gICAqIEBwYXJhbSBhcHBJZCAtIElEIGRlIGxhIGFwbGljYWNpb25cbiAgICogQHBhcmFtIGxpbWl0IC0gQ2FudGlkYWQgbWF4aW1hIGRlIG1lbnNhamVzIGEgY2FyZ2FyIChkZWZhdWx0IDUwKVxuICAgKi9cbiAgd2F0Y2hNZXNzYWdlcyhcbiAgICBjb252SWQ6IHN0cmluZyxcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIGFwcElkOiBzdHJpbmcsXG4gICAgbGltaXQ6IG51bWJlciA9IDUwXG4gICk6IE9ic2VydmFibGU8TWVzc2FnZVtdPiB7XG4gICAgaWYgKCF0aGlzLmZpcmVzdG9yZVNlcnZpY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1tDb252ZXJzYXRpb25TZXJ2aWNlXSBGaXJlc3RvcmVTZXJ2aWNlIG5vIGRpc3BvbmlibGUuIEFzZWd1cmF0ZSBkZSBwcm92aWRlVmFsdGVjaEZpcmViYXNlKCkuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBVc2Ftb3MgQUJTX1BBVEhfU0VOVElORUwgcGFyYSBldml0YXIgcXVlIEZpcmVzdG9yZVNlcnZpY2UgYW50ZXBvbmdhIGVsIHByZWZpam9cbiAgICAvLyBwb3JxdWUgZWwgcGF0aCB5YSBjb250aWVuZSBsYSBydXRhIGNvbXBsZXRhIGNvbiBhcHBJZC9vcmdJZC5cbiAgICBjb25zdCB7IEFCU19QQVRIX1NFTlRJTkVMIH0gPSB0aGlzLmdldEFic1BhdGhTZW50aW5lbCgpO1xuICAgIGNvbnN0IGNvbGxlY3Rpb25QYXRoID0gYCR7QUJTX1BBVEhfU0VOVElORUx9JHt0aGlzLmNvbnZNZXNzYWdlc1BhdGgoY29udklkLCBvcmdJZCwgYXBwSWQpfWA7XG5cbiAgICByZXR1cm4gdGhpcy5maXJlc3RvcmVTZXJ2aWNlLmNvbGxlY3Rpb25DaGFuZ2VzPE1lc3NhZ2U+KGNvbGxlY3Rpb25QYXRoLCB7XG4gICAgICBvcmRlckJ5OiBbeyBmaWVsZDogJ2NyZWF0ZWRBdCcsIGRpcmVjdGlvbjogJ2FzYycgfV0sXG4gICAgICBsaW1pdCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFc2N1Y2hhIGxvcyB1c3VhcmlvcyBxdWUgZXN0YW4gZXNjcmliaWVuZG8gZW4gdW5hIGNvbnZlcnNhY2lvbi5cbiAgICogRGV2dWVsdmUgdW4gYXJyYXkgZGUgZGlzcGxheU5hbWVzLlxuICAgKlxuICAgKiBAcGFyYW0gY29udklkIC0gSUQgZGUgbGEgY29udmVyc2FjaW9uXG4gICAqIEBwYXJhbSBvcmdJZCAtIElEIGRlIGxhIG9yZ2FuaXphY2lvblxuICAgKiBAcGFyYW0gYXBwSWQgLSBJRCBkZSBsYSBhcGxpY2FjaW9uXG4gICAqL1xuICB3YXRjaFR5cGluZyhjb252SWQ6IHN0cmluZywgb3JnSWQ6IHN0cmluZywgYXBwSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nW10+IHtcbiAgICBpZiAoIXRoaXMuZmlyZXN0b3JlU2VydmljZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnW0NvbnZlcnNhdGlvblNlcnZpY2VdIEZpcmVzdG9yZVNlcnZpY2Ugbm8gZGlzcG9uaWJsZS4gQXNlZ3VyYXRlIGRlIHByb3ZpZGVWYWx0ZWNoRmlyZWJhc2UoKS4nXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHsgQUJTX1BBVEhfU0VOVElORUwgfSA9IHRoaXMuZ2V0QWJzUGF0aFNlbnRpbmVsKCk7XG4gICAgY29uc3QgY29sbGVjdGlvblBhdGggPSBgJHtBQlNfUEFUSF9TRU5USU5FTH0ke3RoaXMuY29udlR5cGluZ1BhdGgoY29udklkLCBvcmdJZCwgYXBwSWQpfWA7XG5cbiAgICByZXR1cm4gdGhpcy5maXJlc3RvcmVTZXJ2aWNlXG4gICAgICAuY29sbGVjdGlvbkNoYW5nZXM8VHlwaW5nRG9jdW1lbnQ+KGNvbGxlY3Rpb25QYXRoKVxuICAgICAgLnBpcGUobWFwKGRvY3MgPT4gZG9jcy5tYXAoZCA9PiBkLmRpc3BsYXlOYW1lKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdHJhIHF1ZSBlbCB1c3VhcmlvIGFjdHVhbCBlc3RhIGVzY3JpYmllbmRvLlxuICAgKiBFbCBkb2N1bWVudG8gc2Ugc29icmVlc2NyaWJlIHBhcmEgYWN0dWFsaXphciBlbCB0aW1lc3RhbXAuXG4gICAqIERlYmUgbGxhbWFyc2UgY29uIHVuIFRUTC9jbGVhbnVwICh2ZXIgc3RvcFR5cGluZykuXG4gICAqXG4gICAqIEBwYXJhbSBjb252SWQgLSBJRCBkZSBsYSBjb252ZXJzYWNpb25cbiAgICogQHBhcmFtIG9yZ0lkIC0gSUQgZGUgbGEgb3JnYW5pemFjaW9uXG4gICAqIEBwYXJhbSBhcHBJZCAtIElEIGRlIGxhIGFwbGljYWNpb25cbiAgICogQHBhcmFtIGRpc3BsYXlOYW1lIC0gTm9tYnJlIHZpc2libGUgZGVsIHVzdWFyaW9cbiAgICovXG4gIHN0YXJ0VHlwaW5nKGNvbnZJZDogc3RyaW5nLCBvcmdJZDogc3RyaW5nLCBhcHBJZDogc3RyaW5nLCBkaXNwbGF5TmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmZpcmVzdG9yZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5nZXRDdXJyZW50VXNlcklkKCk7XG4gICAgaWYgKCF1c2VySWQpIHJldHVybjtcblxuICAgIGNvbnN0IHBhdGggPSBgJHt0aGlzLmNvbnZUeXBpbmdQYXRoKGNvbnZJZCwgb3JnSWQsIGFwcElkKX0vJHt1c2VySWR9YDtcbiAgICBjb25zdCBkb2NSZWYgPSBkb2ModGhpcy5maXJlc3RvcmUsIHBhdGgpO1xuXG4gICAgdm9pZCBzZXREb2MoZG9jUmVmLCB7XG4gICAgICBkaXNwbGF5TmFtZSxcbiAgICAgIHVwZGF0ZWRBdDogc2VydmVyVGltZXN0YW1wKCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRWxpbWluYSBlbCBkb2N1bWVudG8gZGUgXCJlc2NyaWJpZW5kb1wiIGRlbCB1c3VhcmlvIGFjdHVhbC5cbiAgICpcbiAgICogQHBhcmFtIGNvbnZJZCAtIElEIGRlIGxhIGNvbnZlcnNhY2lvblxuICAgKiBAcGFyYW0gb3JnSWQgLSBJRCBkZSBsYSBvcmdhbml6YWNpb25cbiAgICogQHBhcmFtIGFwcElkIC0gSUQgZGUgbGEgYXBsaWNhY2lvblxuICAgKi9cbiAgc3RvcFR5cGluZyhjb252SWQ6IHN0cmluZywgb3JnSWQ6IHN0cmluZywgYXBwSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5maXJlc3RvcmUpIHJldHVybjtcblxuICAgIGNvbnN0IHVzZXJJZCA9IHRoaXMuZ2V0Q3VycmVudFVzZXJJZCgpO1xuICAgIGlmICghdXNlcklkKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXRoID0gYCR7dGhpcy5jb252VHlwaW5nUGF0aChjb252SWQsIG9yZ0lkLCBhcHBJZCl9LyR7dXNlcklkfWA7XG4gICAgY29uc3QgZG9jUmVmID0gZG9jKHRoaXMuZmlyZXN0b3JlLCBwYXRoKTtcblxuICAgIHZvaWQgZGVsZXRlRG9jKGRvY1JlZik7XG4gIH1cblxuICAvKipcbiAgICogTWFyY2EgdW4gbWVuc2FqZSBjb21vIGxlaWRvIHBvciBlbCB1c3VhcmlvIGFjdHVhbC5cbiAgICogRXNjcmliZSBkaXJlY3RhbWVudGUgZW4gRmlyZXN0b3JlIHNpbiBwYXNhciBwb3IgZWwgYmFja2VuZC5cbiAgICpcbiAgICogQHBhcmFtIGNvbnZJZCAtIElEIGRlIGxhIGNvbnZlcnNhY2lvblxuICAgKiBAcGFyYW0gbXNnSWQgLSBJRCBkZWwgdWx0aW1vIG1lbnNhamUgbGVpZG9cbiAgICogQHBhcmFtIG9yZ0lkIC0gSUQgZGUgbGEgb3JnYW5pemFjaW9uXG4gICAqIEBwYXJhbSBhcHBJZCAtIElEIGRlIGxhIGFwbGljYWNpb25cbiAgICovXG4gIG1hcmtSZWFkKGNvbnZJZDogc3RyaW5nLCBtc2dJZDogc3RyaW5nLCBvcmdJZDogc3RyaW5nLCBhcHBJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmZpcmVzdG9yZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5nZXRDdXJyZW50VXNlcklkKCk7XG4gICAgaWYgKCF1c2VySWQpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnZQYXRoID0gYGFwcHMvJHthcHBJZH0vb3Jncy8ke29yZ0lkfS9jb252ZXJzYXRpb25zLyR7Y29udklkfWA7XG4gICAgY29uc3QgY29udlJlZiA9IGRvYyh0aGlzLmZpcmVzdG9yZSwgY29udlBhdGgpO1xuXG4gICAgLy8gVXNhIGRvdC1ub3RhdGlvbiBkZSBGaXJlc3RvcmUgcGFyYSBhY3R1YWxpemFyIHNvbG8gZWwgY2FtcG8gZGVsIHVzdWFyaW9cbiAgICBjb25zdCB1cGRhdGVEYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgIFtgcGFydGljaXBhbnRzX3JlYWRNYXAuJHt1c2VySWR9YF06IG1zZ0lkLFxuICAgICAgdXBkYXRlZEF0OiBzZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICB9O1xuXG4gICAgdm9pZCB1cGRhdGVEb2MoY29udlJlZiwgdXBkYXRlRGF0YSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSGVscGVycyBwcml2YWRvc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW1wb3J0YSBBQlNfUEFUSF9TRU5USU5FTCBkZSBmb3JtYSBsYXp5IHBhcmEgZXZpdGFyIGRlcGVuZGVuY2lhcyBjaXJjdWxhcmVzLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRBYnNQYXRoU2VudGluZWwoKTogeyBBQlNfUEFUSF9TRU5USU5FTDogc3RyaW5nIH0ge1xuICAgIC8vIExhIHNlbnRpbmVsIHNlIGRlZmluZSBlbiBmaXJlc3RvcmUuc2VydmljZS50cyDigJQgcmVwbGljYW1vcyBlbCB2YWxvciBhcXVpXG4gICAgLy8gcGFyYSBubyBjcmVhciB1bmEgZGVwZW5kZW5jaWEgY2lyY3VsYXIgZW4gZWwgaW1wb3J0IGVzdGF0aWNvLlxuICAgIHJldHVybiB7IEFCU19QQVRIX1NFTlRJTkVMOiAnX19hYnNfXzonIH07XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSBlbCB1c2VySWQgZGVsIHVzdWFyaW8gYWN0dWFsIGRlc2RlIHNlc3Npb25TdG9yYWdlIC8gbG9jYWxTdG9yYWdlXG4gICAqIGNvbW8gZmFsbGJhY2sgbm8tREkgcGFyYSBlbCBjb250ZXh0byBkZSBlc2NyaXR1cmEgZGUgRmlyZXN0b3JlLlxuICAgKiBFbiBwcm9kLCBlbCBBdXRoU2VydmljZSBhY3R1YWxpemEgZWwgdXNlcklkIGVuIGVsIGNvbnRleHRvIGRlIGxhIGFwcC5cbiAgICovXG4gIHByaXZhdGUgZ2V0Q3VycmVudFVzZXJJZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAvLyBJbnRlbnRhciBvYnRlbmVybG8gZGVzZGUgc2Vzc2lvblN0b3JhZ2UgKGVsIEF1dGhTZXJ2aWNlIGxvIGd1YXJkYSBhaGkpXG4gICAgaWYgKHR5cGVvZiBzZXNzaW9uU3RvcmFnZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnN0IHVpZCA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ3VpZCcpID8/IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ3VzZXJJZCcpO1xuICAgICAgaWYgKHVpZCkgcmV0dXJuIHVpZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat Service Types
|
|
3
|
+
*
|
|
4
|
+
* Tipos compartidos para el sistema de chat en tiempo real.
|
|
5
|
+
* Firestore paths:
|
|
6
|
+
* /apps/{appId}/orgs/{orgId}/conversations/{convId}/messages/{msgId}
|
|
7
|
+
* /apps/{appId}/orgs/{orgId}/conversations/{convId}/typing/{userId}
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2NoYXQvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2hhdCBTZXJ2aWNlIFR5cGVzXG4gKlxuICogVGlwb3MgY29tcGFydGlkb3MgcGFyYSBlbCBzaXN0ZW1hIGRlIGNoYXQgZW4gdGllbXBvIHJlYWwuXG4gKiBGaXJlc3RvcmUgcGF0aHM6XG4gKiAgIC9hcHBzL3thcHBJZH0vb3Jncy97b3JnSWR9L2NvbnZlcnNhdGlvbnMve2NvbnZJZH0vbWVzc2FnZXMve21zZ0lkfVxuICogICAvYXBwcy97YXBwSWR9L29yZ3Mve29yZ0lkfS9jb252ZXJzYXRpb25zL3tjb252SWR9L3R5cGluZy97dXNlcklkfVxuICovXG5cbmltcG9ydCB7IEZpcmVzdG9yZURvY3VtZW50IH0gZnJvbSAnLi4vZmlyZWJhc2UvdHlwZXMnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvbnZlcnNhdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBUaXBvIGRlIGNvbnZlcnNhY2lvbi4gKi9cbmV4cG9ydCB0eXBlIENvbnZlcnNhdGlvblR5cGUgPSAnZGlyZWN0JyB8ICdncm91cCcgfCAnZW50aXR5JztcblxuLyoqIEVzdGFkbyBkZSB1bmEgY29udmVyc2FjaW9uLiAqL1xuZXhwb3J0IHR5cGUgQ29udmVyc2F0aW9uU3RhdHVzID0gJ29wZW4nIHwgJ2Nsb3NlZCc7XG5cbi8qKiBQYXJ0aWNpcGFudGUgZGUgdW5hIGNvbnZlcnNhY2lvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVyc2F0aW9uUGFydGljaXBhbnQge1xuICAvKiogSUQgZGVsIHVzdWFyaW8uICovXG4gIHVzZXJJZDogc3RyaW5nO1xuICAvKiogTm9tYnJlIHZpc2libGUgZGVsIHVzdWFyaW8uICovXG4gIGRpc3BsYXlOYW1lOiBzdHJpbmc7XG4gIC8qKiBVUkwgZGVsIGF2YXRhciBkZWwgdXN1YXJpbyAob3BjaW9uYWwpLiAqL1xuICBhdmF0YXJVcmw/OiBzdHJpbmc7XG4gIC8qKiBGZWNoYSBlbiBxdWUgc2UgdW5pbyBhIGxhIGNvbnZlcnNhY2lvbi4gKi9cbiAgam9pbmVkQXQ6IERhdGU7XG4gIC8qKiBVbHRpbW8gbWVuc2FqZSBsZWlkbyBwb3IgZXN0ZSBwYXJ0aWNpcGFudGUuICovXG4gIGxhc3RSZWFkTXNnSWQ/OiBzdHJpbmc7XG59XG5cbi8qKiBEb2N1bWVudG8gZGUgY29udmVyc2FjaW9uIGVuIEZpcmVzdG9yZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVyc2F0aW9uIGV4dGVuZHMgRmlyZXN0b3JlRG9jdW1lbnQge1xuICAvKiogVGlwbyBkZSBjb252ZXJzYWNpb24uICovXG4gIHR5cGU6IENvbnZlcnNhdGlvblR5cGU7XG4gIC8qKiBFc3RhZG8gZGUgbGEgY29udmVyc2FjaW9uLiAqL1xuICBzdGF0dXM6IENvbnZlcnNhdGlvblN0YXR1cztcbiAgLyoqIFBhcnRpY2lwYW50ZXMuICovXG4gIHBhcnRpY2lwYW50czogQ29udmVyc2F0aW9uUGFydGljaXBhbnRbXTtcbiAgLyoqIFRpcG8gZGUgZW50aWRhZCBhc29jaWFkYSAocGFyYSB0aXBvIGVudGl0eSkuICovXG4gIGVudGl0eVR5cGU/OiBzdHJpbmc7XG4gIC8qKiBJRCBkZSBsYSBlbnRpZGFkIGFzb2NpYWRhLiAqL1xuICBlbnRpdHlJZD86IHN0cmluZztcbiAgLyoqIFRpdHVsbyBkZSBsYSBjb252ZXJzYWNpb24gKHBhcmEgZ3J1cG9zKS4gKi9cbiAgdGl0bGU/OiBzdHJpbmc7XG4gIC8qKiBJRCBkZWwgdWx0aW1vIG1lbnNhamUuICovXG4gIGxhc3RNc2dJZD86IHN0cmluZztcbiAgLyoqIFRleHRvIGRlbCB1bHRpbW8gbWVuc2FqZSAocHJldmlldykuICovXG4gIGxhc3RNc2dCb2R5Pzogc3RyaW5nO1xuICAvKiogRmVjaGEgZGVsIHVsdGltbyBtZW5zYWplLiAqL1xuICBsYXN0TXNnQXQ/OiBEYXRlO1xuICAvKiogQ29udGVvIGRlIG1lbnNhamVzIG5vIGxlaWRvcyBwb3IgdXNlcklkLiAqL1xuICB1bnJlYWRDb3VudD86IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTWVzc2FnZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBUaXBvIGRlIG1lbnNhamUuICovXG5leHBvcnQgdHlwZSBNZXNzYWdlVHlwZSA9ICd0ZXh0JyB8ICdpbWFnZScgfCAnZmlsZScgfCAnc3lzdGVtJztcblxuLyoqIEVzdGFkbyBkZSBlbnZpbyBkZWwgbWVuc2FqZS4gKi9cbmV4cG9ydCB0eXBlIE1lc3NhZ2VTdGF0dXMgPSAnc2VuZGluZycgfCAnc2VudCcgfCAnZmFpbGVkJztcblxuLyoqIEFyY2hpdm8gYWRqdW50byBlbiB1biBtZW5zYWplLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlQXR0YWNobWVudCB7XG4gIC8qKiBOb21icmUgZGVsIGFyY2hpdm8uICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIFVSTCBkZSBkZXNjYXJnYS4gKi9cbiAgdXJsOiBzdHJpbmc7XG4gIC8qKiBUaXBvIE1JTUUuICovXG4gIG1pbWVUeXBlOiBzdHJpbmc7XG4gIC8qKiBUYW1hbm8gZW4gYnl0ZXMuICovXG4gIHNpemU/OiBudW1iZXI7XG59XG5cbi8qKiBSZWFjY2lvbiBhIHVuIG1lbnNhamUuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2VSZWFjdGlvbiB7XG4gIC8qKiBUb2tlbiBkZWwgZW1vamkgKGVqOiAnbGlrZScsICdoZWFydCcpLiAqL1xuICB0b2tlbjogc3RyaW5nO1xuICAvKiogQ2FudGlkYWQgZGUgdXN1YXJpb3MgcXVlIHJlYWNjaW9uYXJvbiBjb24gZXN0ZSBlbW9qaS4gKi9cbiAgY291bnQ6IG51bWJlcjtcbiAgLyoqIFNpIGVsIHVzdWFyaW8gYWN0dWFsIHRpZW5lIGFjdGl2YSBlc3RhIHJlYWNjaW9uLiAqL1xuICBhY3RpdmU6IGJvb2xlYW47XG59XG5cbi8qKiBSZWZlcmVuY2lhIGFsIG1lbnNhamUgYWwgcXVlIHNlIHJlc3BvbmRlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlUmVwbHlUbyB7XG4gIC8qKiBJRCBkZWwgbWVuc2FqZSBvcmlnaW5hbC4gKi9cbiAgbXNnSWQ6IHN0cmluZztcbiAgLyoqIE5vbWJyZSBkZWwgZW1pc29yIGRlbCBtZW5zYWplIG9yaWdpbmFsLiAqL1xuICBzZW5kZXJOYW1lOiBzdHJpbmc7XG4gIC8qKiBUZXh0byBkZWwgbWVuc2FqZSBvcmlnaW5hbCAocHJldmlldykuICovXG4gIGJvZHk6IHN0cmluZztcbn1cblxuLyoqIERvY3VtZW50byBkZSBtZW5zYWplIGVuIEZpcmVzdG9yZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZSBleHRlbmRzIEZpcmVzdG9yZURvY3VtZW50IHtcbiAgLyoqIElEIGRlbCBlbWlzb3IuICovXG4gIHNlbmRlcklkOiBzdHJpbmc7XG4gIC8qKiBOb21icmUgdmlzaWJsZSBkZWwgZW1pc29yLiAqL1xuICBzZW5kZXJOYW1lOiBzdHJpbmc7XG4gIC8qKiBVUkwgZGVsIGF2YXRhciBkZWwgZW1pc29yIChvcGNpb25hbCkuICovXG4gIHNlbmRlckF2YXRhcj86IHN0cmluZztcbiAgLyoqIEN1ZXJwbyBkZWwgbWVuc2FqZS4gKi9cbiAgYm9keTogc3RyaW5nO1xuICAvKiogVGlwbyBkZSBtZW5zYWplLiAqL1xuICB0eXBlOiBNZXNzYWdlVHlwZTtcbiAgLyoqIEZlY2hhIGRlIGNyZWFjaW9uIGRlbCBtZW5zYWplLiAqL1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIC8qKiBTaSBlbCBtZW5zYWplIGZ1ZSBlbGltaW5hZG8uICovXG4gIGlzRGVsZXRlZD86IGJvb2xlYW47XG4gIC8qKiBTaSBlbCBtZW5zYWplIGZ1ZSBlZGl0YWRvLiAqL1xuICBpc0VkaXRlZD86IGJvb2xlYW47XG4gIC8qKiBNZW5zYWplIGFsIHF1ZSBzZSByZXNwb25kZS4gKi9cbiAgcmVwbHlUbz86IE1lc3NhZ2VSZXBseVRvO1xuICAvKiogQXJjaGl2b3MgYWRqdW50b3MuICovXG4gIGF0dGFjaG1lbnRzPzogTWVzc2FnZUF0dGFjaG1lbnRbXTtcbiAgLyoqIFJlYWNjaW9uZXMgZGVsIG1lbnNhamUuICovXG4gIHJlYWN0aW9ucz86IE1lc3NhZ2VSZWFjdGlvbltdO1xuICAvKiogRXN0YWRvIGRlIGVudmlvIChwYXJhIG1lbnNhamVzIG9wdGltaXN0YXMgZGVsIGxhZG8gZGVsIGNsaWVudGUpLiAqL1xuICBzdGF0dXM/OiBNZXNzYWdlU3RhdHVzO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFR5cGluZyBpbmRpY2F0b3Jcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogRG9jdW1lbnRvIGRlIFwiZXNjcmliaWVuZG9cIiBlbiBGaXJlc3RvcmUuICovXG5leHBvcnQgaW50ZXJmYWNlIFR5cGluZ0RvY3VtZW50IGV4dGVuZHMgRmlyZXN0b3JlRG9jdW1lbnQge1xuICAvKiogTm9tYnJlIHZpc2libGUgZGVsIHVzdWFyaW8gcXVlIGVzdGEgZXNjcmliaWVuZG8uICovXG4gIGRpc3BsYXlOYW1lOiBzdHJpbmc7XG4gIC8qKiBUaW1lc3RhbXAgZGUgbGEgdWx0aW1hIGFjdHVhbGl6YWNpb24uICovXG4gIHVwZGF0ZWRBdDogRGF0ZTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBIVFRQIFJlcXVlc3QgLyBSZXNwb25zZSB0eXBlc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBSZXF1ZXN0IHBhcmEgY3JlYXIgdW5hIGNvbnZlcnNhY2lvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlQ29udmVyc2F0aW9uUmVxdWVzdCB7XG4gIC8qKiBUaXBvIGRlIGNvbnZlcnNhY2lvbi4gKi9cbiAgdHlwZTogQ29udmVyc2F0aW9uVHlwZTtcbiAgLyoqIElEcyBkZSBsb3MgcGFydGljaXBhbnRlcyBpbmljaWFsZXMuICovXG4gIHBhcnRpY2lwYW50SWRzPzogc3RyaW5nW107XG4gIC8qKiBQYXJhIHRpcG8gZW50aXR5OiB0aXBvIGRlIGxhIGVudGlkYWQuICovXG4gIGVudGl0eVR5cGU/OiBzdHJpbmc7XG4gIC8qKiBQYXJhIHRpcG8gZW50aXR5OiBJRCBkZSBsYSBlbnRpZGFkLiAqL1xuICBlbnRpdHlJZD86IHN0cmluZztcbiAgLyoqIFRpdHVsbyAocGFyYSBncnVwb3MpLiAqL1xuICB0aXRsZT86IHN0cmluZztcbn1cblxuLyoqIFJlcXVlc3QgcGFyYSBhY3R1YWxpemFyIHVuYSBjb252ZXJzYWNpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUNvbnZlcnNhdGlvblJlcXVlc3Qge1xuICAvKiogTnVldm8gdGl0dWxvIChvcGNpb25hbCkuICovXG4gIHRpdGxlPzogc3RyaW5nO1xuICAvKiogTnVldm8gZXN0YWRvIChvcGNpb25hbCkuICovXG4gIHN0YXR1cz86IENvbnZlcnNhdGlvblN0YXR1cztcbn1cblxuLyoqIFJlc3BvbnNlIGRlIGxpc3RhZG8gZGUgY29udmVyc2FjaW9uZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RDb252ZXJzYXRpb25zUmVzcG9uc2Uge1xuICAvKiogTGlzdGEgZGUgY29udmVyc2FjaW9uZXMuICovXG4gIGNvbnZlcnNhdGlvbnM6IENvbnZlcnNhdGlvbltdO1xuICAvKiogQ3Vyc29yIHBhcmEgcGFnaW5hY2lvbi4gKi9cbiAgbmV4dEN1cnNvcj86IHN0cmluZztcbiAgLyoqIFNpIGhheSBtYXMgcGFnaW5hcy4gKi9cbiAgaGFzTW9yZTogYm9vbGVhbjtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { Injectable, inject } from '@angular/core';
|
|
2
|
+
import { of, map, switchMap } from 'rxjs';
|
|
3
|
+
import { AuthService } from '../auth/auth.service';
|
|
4
|
+
import { FirestoreService } from '../firebase/firestore.service';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
/**
|
|
7
|
+
* EntityFeedService — capa de lectura Firestore para entidades proyectables.
|
|
8
|
+
*
|
|
9
|
+
* Soporta cualquier tipo de entidad (posts, articles, adoptions, reels...)
|
|
10
|
+
* siguiendo el esquema de paths:
|
|
11
|
+
* - Entidades: apps/{appId}/orgs/{orgId}/{entityType}s/{entityId}
|
|
12
|
+
* - Reacciones del usuario: apps/{appId}/users/{uid}/reactions/{entityType}_{entityId}
|
|
13
|
+
*
|
|
14
|
+
* FirestoreService auto-prefija los paths con apps/{appId}/.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* const feed = inject(EntityFeedService);
|
|
18
|
+
*
|
|
19
|
+
* // Solo entidades
|
|
20
|
+
* feed.watchEntities<Post>('org_x', 'post').subscribe(posts => ...);
|
|
21
|
+
*
|
|
22
|
+
* // Feed con reaccion del viewer incluida
|
|
23
|
+
* feed.watchFeed<Post>('org_x', 'post').subscribe(items => {
|
|
24
|
+
* items.forEach(item => console.log(item.viewerHasReacted, item.viewerToken));
|
|
25
|
+
* });
|
|
26
|
+
*/
|
|
27
|
+
export class EntityFeedService {
|
|
28
|
+
constructor() {
|
|
29
|
+
this.fs = inject(FirestoreService);
|
|
30
|
+
this.auth = inject(AuthService);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Suscripcion en tiempo real a entidades publicadas de un tipo dado.
|
|
34
|
+
*
|
|
35
|
+
* Coleccion: orgs/{orgId}/{entityType}s
|
|
36
|
+
* Auto-prefijada a: apps/{appId}/orgs/{orgId}/{entityType}s
|
|
37
|
+
*
|
|
38
|
+
* Filtra por status === 'published', ordena por publishedAt desc.
|
|
39
|
+
*
|
|
40
|
+
* @param orgId - ID de la organizacion
|
|
41
|
+
* @param entityType - Tipo de entidad en singular (ej. 'post', 'article')
|
|
42
|
+
* @param options - Opciones opcionales (limit, default 20)
|
|
43
|
+
*/
|
|
44
|
+
watchEntities(orgId, entityType, options) {
|
|
45
|
+
return this.fs.collectionChanges(`orgs/${orgId}/${entityType}s`, {
|
|
46
|
+
where: [{ field: 'status', operator: '==', value: 'published' }],
|
|
47
|
+
orderBy: [{ field: 'publishedAt', direction: 'desc' }],
|
|
48
|
+
limit: options?.limit ?? 20,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Suscripcion en tiempo real a las reacciones del usuario actual para un tipo de entidad.
|
|
53
|
+
*
|
|
54
|
+
* Coleccion: users/{uid}/reactions
|
|
55
|
+
* Auto-prefijada a: apps/{appId}/users/{uid}/reactions
|
|
56
|
+
*
|
|
57
|
+
* Retorna un Map<entityId, token> para lookup O(1) al combinar con el feed.
|
|
58
|
+
* Si no hay usuario autenticado, retorna un Map vacio.
|
|
59
|
+
*
|
|
60
|
+
* @param entityType - Tipo de entidad a filtrar (ej. 'post', 'article')
|
|
61
|
+
*/
|
|
62
|
+
watchMyReactions(entityType) {
|
|
63
|
+
const user = this.auth.user();
|
|
64
|
+
if (!user?.userId)
|
|
65
|
+
return of(new Map());
|
|
66
|
+
return this.fs
|
|
67
|
+
.collectionChanges(`users/${user.userId}/reactions`, {
|
|
68
|
+
where: [{ field: 'entityType', operator: '==', value: entityType }],
|
|
69
|
+
})
|
|
70
|
+
.pipe(map(docs => new Map(docs.map(d => [d.entityId, d.token]))));
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Combina watchEntities + watchMyReactions en un unico stream.
|
|
74
|
+
*
|
|
75
|
+
* Cada item del feed incluye viewerToken y viewerHasReacted, listos para
|
|
76
|
+
* renderizar el estado de reaccion del usuario actual sin logica adicional
|
|
77
|
+
* en la pagina.
|
|
78
|
+
*
|
|
79
|
+
* @param orgId - ID de la organizacion
|
|
80
|
+
* @param entityType - Tipo de entidad en singular (ej. 'post', 'article')
|
|
81
|
+
* @param options - Opciones opcionales (limit, default 20)
|
|
82
|
+
*/
|
|
83
|
+
watchFeed(orgId, entityType, options) {
|
|
84
|
+
return this.watchEntities(orgId, entityType, options).pipe(switchMap(entities => {
|
|
85
|
+
const user = this.auth.user();
|
|
86
|
+
if (!user?.userId || entities.length === 0) {
|
|
87
|
+
return of(entities.map(e => ({ ...e, viewerToken: null, viewerHasReacted: false })));
|
|
88
|
+
}
|
|
89
|
+
return this.watchMyReactions(entityType).pipe(map(reactions => entities.map(e => ({
|
|
90
|
+
...e,
|
|
91
|
+
viewerToken: reactions.get(e.id) ?? null,
|
|
92
|
+
viewerHasReacted: reactions.has(e.id),
|
|
93
|
+
}))));
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
96
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EntityFeedService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
97
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EntityFeedService, providedIn: 'root' }); }
|
|
98
|
+
}
|
|
99
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EntityFeedService, decorators: [{
|
|
100
|
+
type: Injectable,
|
|
101
|
+
args: [{ providedIn: 'root' }]
|
|
102
|
+
}] });
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWZlZWQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvZW50aXR5LWZlZWQvZW50aXR5LWZlZWQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQWMsRUFBRSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDOztBQUdqRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxNQUFNLE9BQU8saUJBQWlCO0lBRDlCO1FBRVUsT0FBRSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzlCLFNBQUksR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7S0FrRnBDO0lBaEZDOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsYUFBYSxDQUNYLEtBQWEsRUFDYixVQUFrQixFQUNsQixPQUE0QjtRQUU1QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUksUUFBUSxLQUFLLElBQUksVUFBVSxHQUFHLEVBQUU7WUFDbEUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxDQUFDO1lBQ2hFLE9BQU8sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDdEQsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLElBQUksRUFBRTtTQUM1QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILGdCQUFnQixDQUFDLFVBQWtCO1FBQ2pDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNO1lBQUUsT0FBTyxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQWtCLENBQUMsQ0FBQztRQUV4RCxPQUFPLElBQUksQ0FBQyxFQUFFO2FBQ1gsaUJBQWlCLENBQWtCLFNBQVMsSUFBSSxDQUFDLE1BQU0sWUFBWSxFQUFFO1lBQ3BFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsQ0FBQztTQUNwRSxDQUFDO2FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxTQUFTLENBQ1AsS0FBYSxFQUNiLFVBQWtCLEVBQ2xCLE9BQTRCO1FBRTVCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBSSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FDM0QsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ25CLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDM0MsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZGLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQzNDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUNkLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNqQixHQUFHLENBQUM7Z0JBQ0osV0FBVyxFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUk7Z0JBQ3hDLGdCQUFnQixFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUN0QyxDQUFDLENBQUMsQ0FDSixDQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQzsrR0FuRlUsaUJBQWlCO21IQUFqQixpQkFBaUIsY0FESixNQUFNOzs0RkFDbkIsaUJBQWlCO2tCQUQ3QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIG1hcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uL2F1dGgvYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IEZpcmVzdG9yZVNlcnZpY2UgfSBmcm9tICcuLi9maXJlYmFzZS9maXJlc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBFbnRpdHlGZWVkSXRlbSwgRW50aXR5RmVlZEl0ZW1XaXRoUmVhY3Rpb24sIFVzZXJSZWFjdGlvbkRvYyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIEVudGl0eUZlZWRTZXJ2aWNlIOKAlCBjYXBhIGRlIGxlY3R1cmEgRmlyZXN0b3JlIHBhcmEgZW50aWRhZGVzIHByb3llY3RhYmxlcy5cbiAqXG4gKiBTb3BvcnRhIGN1YWxxdWllciB0aXBvIGRlIGVudGlkYWQgKHBvc3RzLCBhcnRpY2xlcywgYWRvcHRpb25zLCByZWVscy4uLilcbiAqIHNpZ3VpZW5kbyBlbCBlc3F1ZW1hIGRlIHBhdGhzOlxuICogICAtIEVudGlkYWRlczogYXBwcy97YXBwSWR9L29yZ3Mve29yZ0lkfS97ZW50aXR5VHlwZX1zL3tlbnRpdHlJZH1cbiAqICAgLSBSZWFjY2lvbmVzIGRlbCB1c3VhcmlvOiBhcHBzL3thcHBJZH0vdXNlcnMve3VpZH0vcmVhY3Rpb25zL3tlbnRpdHlUeXBlfV97ZW50aXR5SWR9XG4gKlxuICogRmlyZXN0b3JlU2VydmljZSBhdXRvLXByZWZpamEgbG9zIHBhdGhzIGNvbiBhcHBzL3thcHBJZH0vLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBmZWVkID0gaW5qZWN0KEVudGl0eUZlZWRTZXJ2aWNlKTtcbiAqXG4gKiAvLyBTb2xvIGVudGlkYWRlc1xuICogZmVlZC53YXRjaEVudGl0aWVzPFBvc3Q+KCdvcmdfeCcsICdwb3N0Jykuc3Vic2NyaWJlKHBvc3RzID0+IC4uLik7XG4gKlxuICogLy8gRmVlZCBjb24gcmVhY2Npb24gZGVsIHZpZXdlciBpbmNsdWlkYVxuICogZmVlZC53YXRjaEZlZWQ8UG9zdD4oJ29yZ194JywgJ3Bvc3QnKS5zdWJzY3JpYmUoaXRlbXMgPT4ge1xuICogICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4gY29uc29sZS5sb2coaXRlbS52aWV3ZXJIYXNSZWFjdGVkLCBpdGVtLnZpZXdlclRva2VuKSk7XG4gKiB9KTtcbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBFbnRpdHlGZWVkU2VydmljZSB7XG4gIHByaXZhdGUgZnMgPSBpbmplY3QoRmlyZXN0b3JlU2VydmljZSk7XG4gIHByaXZhdGUgYXV0aCA9IGluamVjdChBdXRoU2VydmljZSk7XG5cbiAgLyoqXG4gICAqIFN1c2NyaXBjaW9uIGVuIHRpZW1wbyByZWFsIGEgZW50aWRhZGVzIHB1YmxpY2FkYXMgZGUgdW4gdGlwbyBkYWRvLlxuICAgKlxuICAgKiBDb2xlY2Npb246IG9yZ3Mve29yZ0lkfS97ZW50aXR5VHlwZX1zXG4gICAqIEF1dG8tcHJlZmlqYWRhIGE6IGFwcHMve2FwcElkfS9vcmdzL3tvcmdJZH0ve2VudGl0eVR5cGV9c1xuICAgKlxuICAgKiBGaWx0cmEgcG9yIHN0YXR1cyA9PT0gJ3B1Ymxpc2hlZCcsIG9yZGVuYSBwb3IgcHVibGlzaGVkQXQgZGVzYy5cbiAgICpcbiAgICogQHBhcmFtIG9yZ0lkIC0gSUQgZGUgbGEgb3JnYW5pemFjaW9uXG4gICAqIEBwYXJhbSBlbnRpdHlUeXBlIC0gVGlwbyBkZSBlbnRpZGFkIGVuIHNpbmd1bGFyIChlai4gJ3Bvc3QnLCAnYXJ0aWNsZScpXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3BjaW9uZXMgb3BjaW9uYWxlcyAobGltaXQsIGRlZmF1bHQgMjApXG4gICAqL1xuICB3YXRjaEVudGl0aWVzPFQgZXh0ZW5kcyBFbnRpdHlGZWVkSXRlbT4oXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBlbnRpdHlUeXBlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgbGltaXQ/OiBudW1iZXIgfVxuICApOiBPYnNlcnZhYmxlPFRbXT4ge1xuICAgIHJldHVybiB0aGlzLmZzLmNvbGxlY3Rpb25DaGFuZ2VzPFQ+KGBvcmdzLyR7b3JnSWR9LyR7ZW50aXR5VHlwZX1zYCwge1xuICAgICAgd2hlcmU6IFt7IGZpZWxkOiAnc3RhdHVzJywgb3BlcmF0b3I6ICc9PScsIHZhbHVlOiAncHVibGlzaGVkJyB9XSxcbiAgICAgIG9yZGVyQnk6IFt7IGZpZWxkOiAncHVibGlzaGVkQXQnLCBkaXJlY3Rpb246ICdkZXNjJyB9XSxcbiAgICAgIGxpbWl0OiBvcHRpb25zPy5saW1pdCA/PyAyMCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdXNjcmlwY2lvbiBlbiB0aWVtcG8gcmVhbCBhIGxhcyByZWFjY2lvbmVzIGRlbCB1c3VhcmlvIGFjdHVhbCBwYXJhIHVuIHRpcG8gZGUgZW50aWRhZC5cbiAgICpcbiAgICogQ29sZWNjaW9uOiB1c2Vycy97dWlkfS9yZWFjdGlvbnNcbiAgICogQXV0by1wcmVmaWphZGEgYTogYXBwcy97YXBwSWR9L3VzZXJzL3t1aWR9L3JlYWN0aW9uc1xuICAgKlxuICAgKiBSZXRvcm5hIHVuIE1hcDxlbnRpdHlJZCwgdG9rZW4+IHBhcmEgbG9va3VwIE8oMSkgYWwgY29tYmluYXIgY29uIGVsIGZlZWQuXG4gICAqIFNpIG5vIGhheSB1c3VhcmlvIGF1dGVudGljYWRvLCByZXRvcm5hIHVuIE1hcCB2YWNpby5cbiAgICpcbiAgICogQHBhcmFtIGVudGl0eVR5cGUgLSBUaXBvIGRlIGVudGlkYWQgYSBmaWx0cmFyIChlai4gJ3Bvc3QnLCAnYXJ0aWNsZScpXG4gICAqL1xuICB3YXRjaE15UmVhY3Rpb25zKGVudGl0eVR5cGU6IHN0cmluZyk6IE9ic2VydmFibGU8TWFwPHN0cmluZywgc3RyaW5nPj4ge1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmF1dGgudXNlcigpO1xuICAgIGlmICghdXNlcj8udXNlcklkKSByZXR1cm4gb2YobmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKSk7XG5cbiAgICByZXR1cm4gdGhpcy5mc1xuICAgICAgLmNvbGxlY3Rpb25DaGFuZ2VzPFVzZXJSZWFjdGlvbkRvYz4oYHVzZXJzLyR7dXNlci51c2VySWR9L3JlYWN0aW9uc2AsIHtcbiAgICAgICAgd2hlcmU6IFt7IGZpZWxkOiAnZW50aXR5VHlwZScsIG9wZXJhdG9yOiAnPT0nLCB2YWx1ZTogZW50aXR5VHlwZSB9XSxcbiAgICAgIH0pXG4gICAgICAucGlwZShtYXAoZG9jcyA9PiBuZXcgTWFwKGRvY3MubWFwKGQgPT4gW2QuZW50aXR5SWQsIGQudG9rZW5dKSkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21iaW5hIHdhdGNoRW50aXRpZXMgKyB3YXRjaE15UmVhY3Rpb25zIGVuIHVuIHVuaWNvIHN0cmVhbS5cbiAgICpcbiAgICogQ2FkYSBpdGVtIGRlbCBmZWVkIGluY2x1eWUgdmlld2VyVG9rZW4geSB2aWV3ZXJIYXNSZWFjdGVkLCBsaXN0b3MgcGFyYVxuICAgKiByZW5kZXJpemFyIGVsIGVzdGFkbyBkZSByZWFjY2lvbiBkZWwgdXN1YXJpbyBhY3R1YWwgc2luIGxvZ2ljYSBhZGljaW9uYWxcbiAgICogZW4gbGEgcGFnaW5hLlxuICAgKlxuICAgKiBAcGFyYW0gb3JnSWQgLSBJRCBkZSBsYSBvcmdhbml6YWNpb25cbiAgICogQHBhcmFtIGVudGl0eVR5cGUgLSBUaXBvIGRlIGVudGlkYWQgZW4gc2luZ3VsYXIgKGVqLiAncG9zdCcsICdhcnRpY2xlJylcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcGNpb25lcyBvcGNpb25hbGVzIChsaW1pdCwgZGVmYXVsdCAyMClcbiAgICovXG4gIHdhdGNoRmVlZDxUIGV4dGVuZHMgRW50aXR5RmVlZEl0ZW0+KFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgZW50aXR5VHlwZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IGxpbWl0PzogbnVtYmVyIH1cbiAgKTogT2JzZXJ2YWJsZTxFbnRpdHlGZWVkSXRlbVdpdGhSZWFjdGlvbjxUPltdPiB7XG4gICAgcmV0dXJuIHRoaXMud2F0Y2hFbnRpdGllczxUPihvcmdJZCwgZW50aXR5VHlwZSwgb3B0aW9ucykucGlwZShcbiAgICAgIHN3aXRjaE1hcChlbnRpdGllcyA9PiB7XG4gICAgICAgIGNvbnN0IHVzZXIgPSB0aGlzLmF1dGgudXNlcigpO1xuICAgICAgICBpZiAoIXVzZXI/LnVzZXJJZCB8fCBlbnRpdGllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gb2YoZW50aXRpZXMubWFwKGUgPT4gKHsgLi4uZSwgdmlld2VyVG9rZW46IG51bGwsIHZpZXdlckhhc1JlYWN0ZWQ6IGZhbHNlIH0pKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMud2F0Y2hNeVJlYWN0aW9ucyhlbnRpdHlUeXBlKS5waXBlKFxuICAgICAgICAgIG1hcChyZWFjdGlvbnMgPT5cbiAgICAgICAgICAgIGVudGl0aWVzLm1hcChlID0+ICh7XG4gICAgICAgICAgICAgIC4uLmUsXG4gICAgICAgICAgICAgIHZpZXdlclRva2VuOiByZWFjdGlvbnMuZ2V0KGUuaWQpID8/IG51bGwsXG4gICAgICAgICAgICAgIHZpZXdlckhhc1JlYWN0ZWQ6IHJlYWN0aW9ucy5oYXMoZS5pZCksXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { EntityFeedService } from './entity-feed.service';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2VudGl0eS1mZWVkL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgRW50aXR5RmVlZFNlcnZpY2UgfSBmcm9tICcuL2VudGl0eS1mZWVkLnNlcnZpY2UnO1xuZXhwb3J0IHR5cGUgeyBFbnRpdHlGZWVkSXRlbSwgVXNlclJlYWN0aW9uRG9jLCBFbnRpdHlGZWVkSXRlbVdpdGhSZWFjdGlvbiB9IGZyb20gJy4vdHlwZXMnO1xuIl19
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2VudGl0eS1mZWVkL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIEVudGl0eUZlZWRJdGVtIHtcbiAgaWQ6IHN0cmluZztcbiAgZW50aXR5VHlwZTogc3RyaW5nO1xuICB2aXNpYmlsaXR5OiAncHVibGljJyB8ICdvcmcnIHwgJ3ByaXZhdGUnO1xuICBhdXRob3JJZDogc3RyaW5nO1xuICBhdXRob3JOYW1lOiBzdHJpbmc7XG4gIGF1dGhvckF2YXRhclVybD86IHN0cmluZztcbiAgdGl0bGU/OiBzdHJpbmc7XG4gIGV4Y2VycHQ/OiBzdHJpbmc7XG4gIGNvdmVySW1hZ2U/OiBzdHJpbmc7XG4gIHB1Ymxpc2hlZEF0PzogRGF0ZTtcbiAgdXBkYXRlZEF0PzogRGF0ZTtcbiAgcmVhY3Rpb25Db3VudHM/OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+O1xuICBjb21tZW50Q291bnQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclJlYWN0aW9uRG9jIHtcbiAgaWQ6IHN0cmluZztcbiAgdG9rZW46IHN0cmluZztcbiAgZW50aXR5VHlwZTogc3RyaW5nO1xuICBlbnRpdHlJZDogc3RyaW5nO1xuICBjcmVhdGVkQXQ/OiBEYXRlO1xufVxuXG4vLyBFbnRpdHlGZWVkSXRlbSBleHRlbmRpZG8gY29uIGxhIHJlYWNjaW9uIGRlbCB1c3VhcmlvIGFjdHVhbFxuZXhwb3J0IHR5cGUgRW50aXR5RmVlZEl0ZW1XaXRoUmVhY3Rpb248VCBleHRlbmRzIEVudGl0eUZlZWRJdGVtID0gRW50aXR5RmVlZEl0ZW0+ID0gVCAmIHtcbiAgdmlld2VyVG9rZW46IHN0cmluZyB8IG51bGw7XG4gIHZpZXdlckhhc1JlYWN0ZWQ6IGJvb2xlYW47XG59O1xuIl19
|