@codella-software/react 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2121 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.mjs +2121 -0
- package/dist/index.mjs.map +1 -0
- package/dist/react/src/filters-and-sort/index.d.ts +2 -0
- package/dist/react/src/filters-and-sort/index.d.ts.map +1 -0
- package/dist/react/src/filters-and-sort/useFiltersAndSort.d.ts +67 -0
- package/dist/react/src/filters-and-sort/useFiltersAndSort.d.ts.map +1 -0
- package/dist/react/src/form-builder/index.d.ts +2 -0
- package/dist/react/src/form-builder/index.d.ts.map +1 -0
- package/dist/react/src/form-builder/useFormBuilder.d.ts +70 -0
- package/dist/react/src/form-builder/useFormBuilder.d.ts.map +1 -0
- package/dist/react/src/index.d.ts +46 -0
- package/dist/react/src/index.d.ts.map +1 -0
- package/dist/react/src/live-updates/LiveUpdateProvider.d.ts +52 -0
- package/dist/react/src/live-updates/LiveUpdateProvider.d.ts.map +1 -0
- package/dist/react/src/live-updates/index.d.ts +11 -0
- package/dist/react/src/live-updates/index.d.ts.map +1 -0
- package/dist/react/src/live-updates/useLiveListener.d.ts +12 -0
- package/dist/react/src/live-updates/useLiveListener.d.ts.map +1 -0
- package/dist/react/src/live-updates/useLiveRequest.d.ts +12 -0
- package/dist/react/src/live-updates/useLiveRequest.d.ts.map +1 -0
- package/dist/react/src/live-updates/useLiveUpdateListener.d.ts +14 -0
- package/dist/react/src/live-updates/useLiveUpdateListener.d.ts.map +1 -0
- package/dist/react/src/live-updates/useLiveUpdates.d.ts +10 -0
- package/dist/react/src/live-updates/useLiveUpdates.d.ts.map +1 -0
- package/dist/react/src/table-builder/index.d.ts +2 -0
- package/dist/react/src/table-builder/index.d.ts.map +1 -0
- package/dist/react/src/table-builder/useTableService.d.ts +93 -0
- package/dist/react/src/table-builder/useTableService.d.ts.map +1 -0
- package/dist/react/src/tabs/ResponsiveTabs.d.ts +50 -0
- package/dist/react/src/tabs/ResponsiveTabs.d.ts.map +1 -0
- package/dist/react/src/tabs/index.d.ts +40 -0
- package/dist/react/src/tabs/index.d.ts.map +1 -0
- package/dist/react/src/tabs/useTabsHooks.d.ts +49 -0
- package/dist/react/src/tabs/useTabsHooks.d.ts.map +1 -0
- package/dist/react/src/useFiltersAndSort.d.ts +67 -0
- package/dist/react/src/useFiltersAndSort.d.ts.map +1 -0
- package/dist/react/src/useFormBuilder.d.ts +70 -0
- package/dist/react/src/useFormBuilder.d.ts.map +1 -0
- package/dist/react/src/useTableService.d.ts +93 -0
- package/dist/react/src/useTableService.d.ts.map +1 -0
- package/package.json +72 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,2121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const react = require("react");
|
|
4
|
+
const core = require("@codella/core");
|
|
5
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
6
|
+
const rxjs = require("rxjs");
|
|
7
|
+
const operators = require("rxjs/operators");
|
|
8
|
+
function useFiltersAndSort(options) {
|
|
9
|
+
const { service } = options;
|
|
10
|
+
const [state, setState] = react.useState(() => {
|
|
11
|
+
return service.getState();
|
|
12
|
+
});
|
|
13
|
+
react.useEffect(() => {
|
|
14
|
+
const subscription = service.state$.subscribe((newState) => {
|
|
15
|
+
setState(newState);
|
|
16
|
+
});
|
|
17
|
+
return () => subscription.unsubscribe();
|
|
18
|
+
}, [service]);
|
|
19
|
+
const callbacks = react.useMemo(() => ({
|
|
20
|
+
setFilter: (key, value) => {
|
|
21
|
+
service.setFilter(key, value);
|
|
22
|
+
},
|
|
23
|
+
clearFilter: (key) => {
|
|
24
|
+
service.clearFilter(key);
|
|
25
|
+
},
|
|
26
|
+
clearAllFilters: () => {
|
|
27
|
+
service.clearAllFilters();
|
|
28
|
+
},
|
|
29
|
+
setSort: (field, direction) => {
|
|
30
|
+
service.setSort(field, direction);
|
|
31
|
+
},
|
|
32
|
+
toggleSort: (field) => {
|
|
33
|
+
service.toggleSort(field);
|
|
34
|
+
},
|
|
35
|
+
setPage: (page) => {
|
|
36
|
+
service.setPage(page);
|
|
37
|
+
},
|
|
38
|
+
setPageSize: (size) => {
|
|
39
|
+
service.setPageSize(size);
|
|
40
|
+
},
|
|
41
|
+
nextPage: () => {
|
|
42
|
+
service.nextPage();
|
|
43
|
+
},
|
|
44
|
+
prevPage: () => {
|
|
45
|
+
service.prevPage();
|
|
46
|
+
}
|
|
47
|
+
}), [service]);
|
|
48
|
+
const memoizedReturn = react.useMemo(() => ({
|
|
49
|
+
filters: state.filters,
|
|
50
|
+
sortBy: state.sortBy,
|
|
51
|
+
sortDirection: state.sortDirection,
|
|
52
|
+
page: state.page,
|
|
53
|
+
pageSize: state.pageSize,
|
|
54
|
+
...callbacks
|
|
55
|
+
}), [state, callbacks]);
|
|
56
|
+
return memoizedReturn;
|
|
57
|
+
}
|
|
58
|
+
function useFormBuilder(options) {
|
|
59
|
+
const { builder } = options;
|
|
60
|
+
const [state, setState] = react.useState(() => builder.getState());
|
|
61
|
+
const [isSubmitting, setIsSubmitting] = react.useState(false);
|
|
62
|
+
react.useEffect(() => {
|
|
63
|
+
const subscription = builder.stateChanged$.subscribe((newState) => {
|
|
64
|
+
setState(newState);
|
|
65
|
+
});
|
|
66
|
+
return () => subscription.unsubscribe();
|
|
67
|
+
}, [builder]);
|
|
68
|
+
const memoizedReturn = react.useMemo(() => ({
|
|
69
|
+
values: state.values,
|
|
70
|
+
errors: state.errors,
|
|
71
|
+
touched: state.touched,
|
|
72
|
+
currentStep: state.currentStep,
|
|
73
|
+
totalSteps: state.totalSteps,
|
|
74
|
+
isSubmitting,
|
|
75
|
+
isValid: Object.keys(state.errors).length === 0,
|
|
76
|
+
setFieldValue: async (field, value) => {
|
|
77
|
+
builder.setFieldValue(field, value);
|
|
78
|
+
},
|
|
79
|
+
setFieldTouched: (field, touched) => {
|
|
80
|
+
builder.setFieldTouched(field, touched);
|
|
81
|
+
},
|
|
82
|
+
validate: async () => {
|
|
83
|
+
return builder.validate();
|
|
84
|
+
},
|
|
85
|
+
submit: async () => {
|
|
86
|
+
setIsSubmitting(true);
|
|
87
|
+
try {
|
|
88
|
+
const result = await builder.submit();
|
|
89
|
+
setIsSubmitting(false);
|
|
90
|
+
return result;
|
|
91
|
+
} catch (error) {
|
|
92
|
+
setIsSubmitting(false);
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
reset: () => {
|
|
97
|
+
builder.reset();
|
|
98
|
+
},
|
|
99
|
+
nextStep: () => {
|
|
100
|
+
if (builder.nextStep) {
|
|
101
|
+
builder.nextStep();
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
prevStep: () => {
|
|
105
|
+
if (builder.prevStep) {
|
|
106
|
+
builder.prevStep();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}), [builder, state, isSubmitting]);
|
|
110
|
+
return memoizedReturn;
|
|
111
|
+
}
|
|
112
|
+
class LiveUpdateService {
|
|
113
|
+
constructor(wsService, sseService) {
|
|
114
|
+
this.wsService = wsService;
|
|
115
|
+
this.sseService = sseService;
|
|
116
|
+
this.activeType = null;
|
|
117
|
+
this.isInitialized = false;
|
|
118
|
+
this.eventMappings = {};
|
|
119
|
+
}
|
|
120
|
+
initialize(config2) {
|
|
121
|
+
if (this.isInitialized) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
this.eventMappings = config2.eventMappings ?? {};
|
|
125
|
+
if (config2.sseEnabled) {
|
|
126
|
+
this.activeType = "SSE";
|
|
127
|
+
this.sseService.connect().catch((error) => {
|
|
128
|
+
console.error("[LiveUpdateService] SSE connection failed:", error);
|
|
129
|
+
if (config2.wsEnabled) {
|
|
130
|
+
this.activeType = "WebSocket";
|
|
131
|
+
this.wsService.connect();
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
} else if (config2.wsEnabled) {
|
|
135
|
+
this.activeType = "WebSocket";
|
|
136
|
+
this.wsService.connect();
|
|
137
|
+
}
|
|
138
|
+
this.isInitialized = true;
|
|
139
|
+
}
|
|
140
|
+
get type() {
|
|
141
|
+
return this.activeType;
|
|
142
|
+
}
|
|
143
|
+
get isConnected$() {
|
|
144
|
+
switch (this.activeType) {
|
|
145
|
+
case "SSE":
|
|
146
|
+
return this.sseService.isConnected$;
|
|
147
|
+
case "WebSocket":
|
|
148
|
+
return this.wsService.isConnected$;
|
|
149
|
+
default:
|
|
150
|
+
return rxjs.of(false);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
get canSend() {
|
|
154
|
+
return this.activeType === "WebSocket";
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Subscribe to a named event using configured mappings
|
|
158
|
+
*/
|
|
159
|
+
on(eventName) {
|
|
160
|
+
const mapping = this.eventMappings[eventName];
|
|
161
|
+
if (!mapping) {
|
|
162
|
+
console.warn(`[LiveUpdateService] No mapping found for event: ${eventName}`);
|
|
163
|
+
return rxjs.EMPTY;
|
|
164
|
+
}
|
|
165
|
+
switch (this.activeType) {
|
|
166
|
+
case "SSE":
|
|
167
|
+
if (mapping.sseEvent) {
|
|
168
|
+
return this.sseService.on(mapping.sseEvent);
|
|
169
|
+
}
|
|
170
|
+
break;
|
|
171
|
+
case "WebSocket":
|
|
172
|
+
if (mapping.wsAction) {
|
|
173
|
+
return this.wsService.on(mapping.wsAction);
|
|
174
|
+
}
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
return rxjs.EMPTY;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Send a message via WebSocket (if available)
|
|
181
|
+
*/
|
|
182
|
+
send(action, payload) {
|
|
183
|
+
if (!this.canSend) {
|
|
184
|
+
console.warn("[LiveUpdateService] WebSocket not available for sending");
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
this.wsService.sendMessage(action, payload);
|
|
188
|
+
}
|
|
189
|
+
disconnect() {
|
|
190
|
+
this.sseService.disconnect();
|
|
191
|
+
this.wsService.disconnect();
|
|
192
|
+
this.activeType = null;
|
|
193
|
+
this.isInitialized = false;
|
|
194
|
+
}
|
|
195
|
+
destroy() {
|
|
196
|
+
this.sseService.destroy();
|
|
197
|
+
this.wsService.destroy();
|
|
198
|
+
this.activeType = null;
|
|
199
|
+
this.isInitialized = false;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
const DEFAULT_CONFIG = {
|
|
203
|
+
maxReconnectAttempts: 5,
|
|
204
|
+
initialReconnectDelay: 1e3,
|
|
205
|
+
maxReconnectDelay: 3e4
|
|
206
|
+
};
|
|
207
|
+
class BaseConnectionService {
|
|
208
|
+
constructor(config2 = {}) {
|
|
209
|
+
this.destroySubject$ = new rxjs.Subject();
|
|
210
|
+
this.messagesSubject$ = new rxjs.Subject();
|
|
211
|
+
this.connectionStatusSubject$ = new rxjs.BehaviorSubject(false);
|
|
212
|
+
this.reconnectAttempts = 0;
|
|
213
|
+
this.messages$ = this.messagesSubject$.asObservable();
|
|
214
|
+
this.isConnected$ = this.connectionStatusSubject$.asObservable();
|
|
215
|
+
this.config = { ...DEFAULT_CONFIG, ...config2 };
|
|
216
|
+
}
|
|
217
|
+
getReconnectDelay(attempt) {
|
|
218
|
+
return Math.min(
|
|
219
|
+
this.config.initialReconnectDelay * Math.pow(2, attempt),
|
|
220
|
+
this.config.maxReconnectDelay
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
scheduleReconnect(connectFn) {
|
|
224
|
+
if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {
|
|
225
|
+
console.error(`[${this.serviceName}] Max reconnection attempts reached`);
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
const delay = this.getReconnectDelay(this.reconnectAttempts);
|
|
229
|
+
this.reconnectAttempts++;
|
|
230
|
+
console.log(
|
|
231
|
+
`[${this.serviceName}] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts})`
|
|
232
|
+
);
|
|
233
|
+
rxjs.timer(delay).pipe(operators.take(1), operators.takeUntil(this.destroySubject$)).subscribe(() => connectFn());
|
|
234
|
+
}
|
|
235
|
+
resetReconnectAttempts() {
|
|
236
|
+
this.reconnectAttempts = 0;
|
|
237
|
+
}
|
|
238
|
+
destroy() {
|
|
239
|
+
this.disconnect();
|
|
240
|
+
this.destroySubject$.next();
|
|
241
|
+
this.destroySubject$.complete();
|
|
242
|
+
this.messagesSubject$.complete();
|
|
243
|
+
this.connectionStatusSubject$.complete();
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
class FetchEventSource {
|
|
247
|
+
constructor(url, headers) {
|
|
248
|
+
this.url = url;
|
|
249
|
+
this.headers = headers;
|
|
250
|
+
this.eventTarget = new EventTarget();
|
|
251
|
+
this.abortController = null;
|
|
252
|
+
}
|
|
253
|
+
async connect() {
|
|
254
|
+
var _a;
|
|
255
|
+
this.abortController = new AbortController();
|
|
256
|
+
try {
|
|
257
|
+
const response = await fetch(this.url, {
|
|
258
|
+
method: "GET",
|
|
259
|
+
headers: this.headers,
|
|
260
|
+
signal: this.abortController.signal
|
|
261
|
+
});
|
|
262
|
+
if (!response.ok) {
|
|
263
|
+
const error = new Event("error");
|
|
264
|
+
this.eventTarget.dispatchEvent(error);
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
const openEvent = new Event("open");
|
|
268
|
+
this.eventTarget.dispatchEvent(openEvent);
|
|
269
|
+
const reader = (_a = response.body) == null ? void 0 : _a.getReader();
|
|
270
|
+
if (!reader) {
|
|
271
|
+
const error = new Event("error");
|
|
272
|
+
this.eventTarget.dispatchEvent(error);
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
const decoder = new TextDecoder();
|
|
276
|
+
let buffer = "";
|
|
277
|
+
while (true) {
|
|
278
|
+
const { done, value } = await reader.read();
|
|
279
|
+
if (done) break;
|
|
280
|
+
buffer += decoder.decode(value, { stream: true });
|
|
281
|
+
const lines = buffer.split("\n");
|
|
282
|
+
for (let i = 0; i < lines.length - 1; i++) {
|
|
283
|
+
this.processLine(lines[i]);
|
|
284
|
+
}
|
|
285
|
+
buffer = lines[lines.length - 1];
|
|
286
|
+
}
|
|
287
|
+
if (buffer.length > 0) {
|
|
288
|
+
this.processLine(buffer);
|
|
289
|
+
}
|
|
290
|
+
} catch (error) {
|
|
291
|
+
if (error instanceof Error && error.name !== "AbortError") {
|
|
292
|
+
const errorEvent = new Event("error");
|
|
293
|
+
this.eventTarget.dispatchEvent(errorEvent);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
processLine(line) {
|
|
298
|
+
line = line.trim();
|
|
299
|
+
if (line === "" || line.startsWith(":")) {
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
const colonIndex = line.indexOf(":");
|
|
303
|
+
if (colonIndex === -1) {
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
const field = line.substring(0, colonIndex);
|
|
307
|
+
let value = line.substring(colonIndex + 1);
|
|
308
|
+
if (value.startsWith(" ")) {
|
|
309
|
+
value = value.substring(1);
|
|
310
|
+
}
|
|
311
|
+
if (field === "data") {
|
|
312
|
+
const event = new MessageEvent("message", {
|
|
313
|
+
data: value
|
|
314
|
+
});
|
|
315
|
+
this.eventTarget.dispatchEvent(event);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
addEventListener(type, listener) {
|
|
319
|
+
this.eventTarget.addEventListener(type, listener);
|
|
320
|
+
}
|
|
321
|
+
removeEventListener(type, listener) {
|
|
322
|
+
this.eventTarget.removeEventListener(type, listener);
|
|
323
|
+
}
|
|
324
|
+
get onopen() {
|
|
325
|
+
return this.eventTarget.onopen;
|
|
326
|
+
}
|
|
327
|
+
set onopen(handler) {
|
|
328
|
+
if (this.eventTarget.onopen) {
|
|
329
|
+
this.eventTarget.removeEventListener("open", this.eventTarget.onopen);
|
|
330
|
+
}
|
|
331
|
+
if (handler) {
|
|
332
|
+
this.eventTarget.addEventListener("open", handler);
|
|
333
|
+
this.eventTarget.onopen = handler;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
get onerror() {
|
|
337
|
+
return this.eventTarget.onerror;
|
|
338
|
+
}
|
|
339
|
+
set onerror(handler) {
|
|
340
|
+
if (this.eventTarget.onerror) {
|
|
341
|
+
this.eventTarget.removeEventListener("error", this.eventTarget.onerror);
|
|
342
|
+
}
|
|
343
|
+
if (handler) {
|
|
344
|
+
this.eventTarget.addEventListener("error", handler);
|
|
345
|
+
this.eventTarget.onerror = handler;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
close() {
|
|
349
|
+
var _a;
|
|
350
|
+
(_a = this.abortController) == null ? void 0 : _a.abort();
|
|
351
|
+
this.abortController = null;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
class SSEService extends BaseConnectionService {
|
|
355
|
+
constructor(config2) {
|
|
356
|
+
super();
|
|
357
|
+
this.eventSource = null;
|
|
358
|
+
this.sseConfig = {
|
|
359
|
+
headerName: "Authorization",
|
|
360
|
+
headerPrefix: "Bearer",
|
|
361
|
+
...config2
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
get serviceName() {
|
|
365
|
+
return "SSE";
|
|
366
|
+
}
|
|
367
|
+
async connect() {
|
|
368
|
+
if (this.eventSource) {
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
try {
|
|
372
|
+
if (!this.sseConfig.authProvider.isAuthenticated()) {
|
|
373
|
+
console.error("[SSE] Not authenticated");
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
const idToken = await this.sseConfig.authProvider.getIdToken();
|
|
377
|
+
if (!idToken) {
|
|
378
|
+
console.error("[SSE] No auth token available");
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
const headers = {
|
|
382
|
+
[this.sseConfig.headerName]: `${this.sseConfig.headerPrefix} ${idToken}`
|
|
383
|
+
};
|
|
384
|
+
const url = new URL(this.sseConfig.url);
|
|
385
|
+
this.eventSource = new FetchEventSource(url.toString(), headers);
|
|
386
|
+
this.setupEventListeners();
|
|
387
|
+
await this.eventSource.connect();
|
|
388
|
+
} catch (error) {
|
|
389
|
+
console.error("[SSE] Connection error:", error);
|
|
390
|
+
this.scheduleReconnect(() => this.connect());
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
setupEventListeners() {
|
|
394
|
+
if (!this.eventSource) return;
|
|
395
|
+
this.eventSource.onopen = () => {
|
|
396
|
+
console.log("[SSE] Connected");
|
|
397
|
+
this.connectionStatusSubject$.next(true);
|
|
398
|
+
this.resetReconnectAttempts();
|
|
399
|
+
};
|
|
400
|
+
this.eventSource.onerror = (event) => {
|
|
401
|
+
console.error("[SSE] Error:", event);
|
|
402
|
+
this.connectionStatusSubject$.next(false);
|
|
403
|
+
this.cleanup();
|
|
404
|
+
this.scheduleReconnect(() => this.connect());
|
|
405
|
+
};
|
|
406
|
+
rxjs.fromEvent(this.eventSource, "message").pipe(
|
|
407
|
+
operators.takeUntil(this.destroySubject$),
|
|
408
|
+
operators.map((event) => {
|
|
409
|
+
try {
|
|
410
|
+
return JSON.parse(event.data);
|
|
411
|
+
} catch (error) {
|
|
412
|
+
console.error("[SSE] Parse error:", error);
|
|
413
|
+
return null;
|
|
414
|
+
}
|
|
415
|
+
}),
|
|
416
|
+
operators.filter((msg) => msg !== null)
|
|
417
|
+
).subscribe((message) => {
|
|
418
|
+
this.messagesSubject$.next(message);
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
cleanup() {
|
|
422
|
+
var _a;
|
|
423
|
+
(_a = this.eventSource) == null ? void 0 : _a.close();
|
|
424
|
+
this.eventSource = null;
|
|
425
|
+
}
|
|
426
|
+
on(eventType) {
|
|
427
|
+
return this.messages$.pipe(
|
|
428
|
+
operators.filter((msg) => msg.eventType === eventType),
|
|
429
|
+
operators.map((msg) => msg.data)
|
|
430
|
+
);
|
|
431
|
+
}
|
|
432
|
+
disconnect() {
|
|
433
|
+
this.cleanup();
|
|
434
|
+
this.connectionStatusSubject$.next(false);
|
|
435
|
+
this.resetReconnectAttempts();
|
|
436
|
+
}
|
|
437
|
+
destroy() {
|
|
438
|
+
this.cleanup();
|
|
439
|
+
this.destroySubject$.next();
|
|
440
|
+
this.destroySubject$.complete();
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
var extendStatics = function(d, b) {
|
|
444
|
+
extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {
|
|
445
|
+
d2.__proto__ = b2;
|
|
446
|
+
} || function(d2, b2) {
|
|
447
|
+
for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];
|
|
448
|
+
};
|
|
449
|
+
return extendStatics(d, b);
|
|
450
|
+
};
|
|
451
|
+
function __extends(d, b) {
|
|
452
|
+
if (typeof b !== "function" && b !== null)
|
|
453
|
+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
454
|
+
extendStatics(d, b);
|
|
455
|
+
function __() {
|
|
456
|
+
this.constructor = d;
|
|
457
|
+
}
|
|
458
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
459
|
+
}
|
|
460
|
+
var __assign = function() {
|
|
461
|
+
__assign = Object.assign || function __assign2(t) {
|
|
462
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
463
|
+
s = arguments[i];
|
|
464
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
|
|
465
|
+
}
|
|
466
|
+
return t;
|
|
467
|
+
};
|
|
468
|
+
return __assign.apply(this, arguments);
|
|
469
|
+
};
|
|
470
|
+
function __values(o) {
|
|
471
|
+
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
472
|
+
if (m) return m.call(o);
|
|
473
|
+
if (o && typeof o.length === "number") return {
|
|
474
|
+
next: function() {
|
|
475
|
+
if (o && i >= o.length) o = void 0;
|
|
476
|
+
return { value: o && o[i++], done: !o };
|
|
477
|
+
}
|
|
478
|
+
};
|
|
479
|
+
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
480
|
+
}
|
|
481
|
+
function __read(o, n) {
|
|
482
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
483
|
+
if (!m) return o;
|
|
484
|
+
var i = m.call(o), r, ar = [], e;
|
|
485
|
+
try {
|
|
486
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
487
|
+
} catch (error) {
|
|
488
|
+
e = { error };
|
|
489
|
+
} finally {
|
|
490
|
+
try {
|
|
491
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
492
|
+
} finally {
|
|
493
|
+
if (e) throw e.error;
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
return ar;
|
|
497
|
+
}
|
|
498
|
+
function __spreadArray(to, from, pack) {
|
|
499
|
+
if (arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
500
|
+
if (ar || !(i in from)) {
|
|
501
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
502
|
+
ar[i] = from[i];
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
506
|
+
}
|
|
507
|
+
typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
|
|
508
|
+
var e = new Error(message);
|
|
509
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
510
|
+
};
|
|
511
|
+
function isFunction(value) {
|
|
512
|
+
return typeof value === "function";
|
|
513
|
+
}
|
|
514
|
+
function createErrorClass(createImpl) {
|
|
515
|
+
var _super = function(instance) {
|
|
516
|
+
Error.call(instance);
|
|
517
|
+
instance.stack = new Error().stack;
|
|
518
|
+
};
|
|
519
|
+
var ctorFunc = createImpl(_super);
|
|
520
|
+
ctorFunc.prototype = Object.create(Error.prototype);
|
|
521
|
+
ctorFunc.prototype.constructor = ctorFunc;
|
|
522
|
+
return ctorFunc;
|
|
523
|
+
}
|
|
524
|
+
var UnsubscriptionError = createErrorClass(function(_super) {
|
|
525
|
+
return function UnsubscriptionErrorImpl(errors) {
|
|
526
|
+
_super(this);
|
|
527
|
+
this.message = errors ? errors.length + " errors occurred during unsubscription:\n" + errors.map(function(err, i) {
|
|
528
|
+
return i + 1 + ") " + err.toString();
|
|
529
|
+
}).join("\n ") : "";
|
|
530
|
+
this.name = "UnsubscriptionError";
|
|
531
|
+
this.errors = errors;
|
|
532
|
+
};
|
|
533
|
+
});
|
|
534
|
+
function arrRemove(arr, item) {
|
|
535
|
+
if (arr) {
|
|
536
|
+
var index = arr.indexOf(item);
|
|
537
|
+
0 <= index && arr.splice(index, 1);
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
var Subscription = (function() {
|
|
541
|
+
function Subscription2(initialTeardown) {
|
|
542
|
+
this.initialTeardown = initialTeardown;
|
|
543
|
+
this.closed = false;
|
|
544
|
+
this._parentage = null;
|
|
545
|
+
this._finalizers = null;
|
|
546
|
+
}
|
|
547
|
+
Subscription2.prototype.unsubscribe = function() {
|
|
548
|
+
var e_1, _a, e_2, _b;
|
|
549
|
+
var errors;
|
|
550
|
+
if (!this.closed) {
|
|
551
|
+
this.closed = true;
|
|
552
|
+
var _parentage = this._parentage;
|
|
553
|
+
if (_parentage) {
|
|
554
|
+
this._parentage = null;
|
|
555
|
+
if (Array.isArray(_parentage)) {
|
|
556
|
+
try {
|
|
557
|
+
for (var _parentage_1 = __values(_parentage), _parentage_1_1 = _parentage_1.next(); !_parentage_1_1.done; _parentage_1_1 = _parentage_1.next()) {
|
|
558
|
+
var parent_1 = _parentage_1_1.value;
|
|
559
|
+
parent_1.remove(this);
|
|
560
|
+
}
|
|
561
|
+
} catch (e_1_1) {
|
|
562
|
+
e_1 = { error: e_1_1 };
|
|
563
|
+
} finally {
|
|
564
|
+
try {
|
|
565
|
+
if (_parentage_1_1 && !_parentage_1_1.done && (_a = _parentage_1.return)) _a.call(_parentage_1);
|
|
566
|
+
} finally {
|
|
567
|
+
if (e_1) throw e_1.error;
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
} else {
|
|
571
|
+
_parentage.remove(this);
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
var initialFinalizer = this.initialTeardown;
|
|
575
|
+
if (isFunction(initialFinalizer)) {
|
|
576
|
+
try {
|
|
577
|
+
initialFinalizer();
|
|
578
|
+
} catch (e) {
|
|
579
|
+
errors = e instanceof UnsubscriptionError ? e.errors : [e];
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
var _finalizers = this._finalizers;
|
|
583
|
+
if (_finalizers) {
|
|
584
|
+
this._finalizers = null;
|
|
585
|
+
try {
|
|
586
|
+
for (var _finalizers_1 = __values(_finalizers), _finalizers_1_1 = _finalizers_1.next(); !_finalizers_1_1.done; _finalizers_1_1 = _finalizers_1.next()) {
|
|
587
|
+
var finalizer = _finalizers_1_1.value;
|
|
588
|
+
try {
|
|
589
|
+
execFinalizer(finalizer);
|
|
590
|
+
} catch (err) {
|
|
591
|
+
errors = errors !== null && errors !== void 0 ? errors : [];
|
|
592
|
+
if (err instanceof UnsubscriptionError) {
|
|
593
|
+
errors = __spreadArray(__spreadArray([], __read(errors)), __read(err.errors));
|
|
594
|
+
} else {
|
|
595
|
+
errors.push(err);
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
} catch (e_2_1) {
|
|
600
|
+
e_2 = { error: e_2_1 };
|
|
601
|
+
} finally {
|
|
602
|
+
try {
|
|
603
|
+
if (_finalizers_1_1 && !_finalizers_1_1.done && (_b = _finalizers_1.return)) _b.call(_finalizers_1);
|
|
604
|
+
} finally {
|
|
605
|
+
if (e_2) throw e_2.error;
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
if (errors) {
|
|
610
|
+
throw new UnsubscriptionError(errors);
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
};
|
|
614
|
+
Subscription2.prototype.add = function(teardown) {
|
|
615
|
+
var _a;
|
|
616
|
+
if (teardown && teardown !== this) {
|
|
617
|
+
if (this.closed) {
|
|
618
|
+
execFinalizer(teardown);
|
|
619
|
+
} else {
|
|
620
|
+
if (teardown instanceof Subscription2) {
|
|
621
|
+
if (teardown.closed || teardown._hasParent(this)) {
|
|
622
|
+
return;
|
|
623
|
+
}
|
|
624
|
+
teardown._addParent(this);
|
|
625
|
+
}
|
|
626
|
+
(this._finalizers = (_a = this._finalizers) !== null && _a !== void 0 ? _a : []).push(teardown);
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
};
|
|
630
|
+
Subscription2.prototype._hasParent = function(parent) {
|
|
631
|
+
var _parentage = this._parentage;
|
|
632
|
+
return _parentage === parent || Array.isArray(_parentage) && _parentage.includes(parent);
|
|
633
|
+
};
|
|
634
|
+
Subscription2.prototype._addParent = function(parent) {
|
|
635
|
+
var _parentage = this._parentage;
|
|
636
|
+
this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;
|
|
637
|
+
};
|
|
638
|
+
Subscription2.prototype._removeParent = function(parent) {
|
|
639
|
+
var _parentage = this._parentage;
|
|
640
|
+
if (_parentage === parent) {
|
|
641
|
+
this._parentage = null;
|
|
642
|
+
} else if (Array.isArray(_parentage)) {
|
|
643
|
+
arrRemove(_parentage, parent);
|
|
644
|
+
}
|
|
645
|
+
};
|
|
646
|
+
Subscription2.prototype.remove = function(teardown) {
|
|
647
|
+
var _finalizers = this._finalizers;
|
|
648
|
+
_finalizers && arrRemove(_finalizers, teardown);
|
|
649
|
+
if (teardown instanceof Subscription2) {
|
|
650
|
+
teardown._removeParent(this);
|
|
651
|
+
}
|
|
652
|
+
};
|
|
653
|
+
Subscription2.EMPTY = (function() {
|
|
654
|
+
var empty = new Subscription2();
|
|
655
|
+
empty.closed = true;
|
|
656
|
+
return empty;
|
|
657
|
+
})();
|
|
658
|
+
return Subscription2;
|
|
659
|
+
})();
|
|
660
|
+
var EMPTY_SUBSCRIPTION = Subscription.EMPTY;
|
|
661
|
+
function isSubscription(value) {
|
|
662
|
+
return value instanceof Subscription || value && "closed" in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe);
|
|
663
|
+
}
|
|
664
|
+
function execFinalizer(finalizer) {
|
|
665
|
+
if (isFunction(finalizer)) {
|
|
666
|
+
finalizer();
|
|
667
|
+
} else {
|
|
668
|
+
finalizer.unsubscribe();
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
var config = {
|
|
672
|
+
Promise: void 0
|
|
673
|
+
};
|
|
674
|
+
var timeoutProvider = {
|
|
675
|
+
setTimeout: function(handler, timeout) {
|
|
676
|
+
var args = [];
|
|
677
|
+
for (var _i = 2; _i < arguments.length; _i++) {
|
|
678
|
+
args[_i - 2] = arguments[_i];
|
|
679
|
+
}
|
|
680
|
+
return setTimeout.apply(void 0, __spreadArray([handler, timeout], __read(args)));
|
|
681
|
+
},
|
|
682
|
+
clearTimeout: function(handle) {
|
|
683
|
+
return clearTimeout(handle);
|
|
684
|
+
},
|
|
685
|
+
delegate: void 0
|
|
686
|
+
};
|
|
687
|
+
function reportUnhandledError(err) {
|
|
688
|
+
timeoutProvider.setTimeout(function() {
|
|
689
|
+
{
|
|
690
|
+
throw err;
|
|
691
|
+
}
|
|
692
|
+
});
|
|
693
|
+
}
|
|
694
|
+
function noop() {
|
|
695
|
+
}
|
|
696
|
+
function errorContext(cb) {
|
|
697
|
+
{
|
|
698
|
+
cb();
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
var Subscriber = (function(_super) {
|
|
702
|
+
__extends(Subscriber2, _super);
|
|
703
|
+
function Subscriber2(destination) {
|
|
704
|
+
var _this = _super.call(this) || this;
|
|
705
|
+
_this.isStopped = false;
|
|
706
|
+
if (destination) {
|
|
707
|
+
_this.destination = destination;
|
|
708
|
+
if (isSubscription(destination)) {
|
|
709
|
+
destination.add(_this);
|
|
710
|
+
}
|
|
711
|
+
} else {
|
|
712
|
+
_this.destination = EMPTY_OBSERVER;
|
|
713
|
+
}
|
|
714
|
+
return _this;
|
|
715
|
+
}
|
|
716
|
+
Subscriber2.create = function(next, error, complete) {
|
|
717
|
+
return new SafeSubscriber(next, error, complete);
|
|
718
|
+
};
|
|
719
|
+
Subscriber2.prototype.next = function(value) {
|
|
720
|
+
if (this.isStopped) ;
|
|
721
|
+
else {
|
|
722
|
+
this._next(value);
|
|
723
|
+
}
|
|
724
|
+
};
|
|
725
|
+
Subscriber2.prototype.error = function(err) {
|
|
726
|
+
if (this.isStopped) ;
|
|
727
|
+
else {
|
|
728
|
+
this.isStopped = true;
|
|
729
|
+
this._error(err);
|
|
730
|
+
}
|
|
731
|
+
};
|
|
732
|
+
Subscriber2.prototype.complete = function() {
|
|
733
|
+
if (this.isStopped) ;
|
|
734
|
+
else {
|
|
735
|
+
this.isStopped = true;
|
|
736
|
+
this._complete();
|
|
737
|
+
}
|
|
738
|
+
};
|
|
739
|
+
Subscriber2.prototype.unsubscribe = function() {
|
|
740
|
+
if (!this.closed) {
|
|
741
|
+
this.isStopped = true;
|
|
742
|
+
_super.prototype.unsubscribe.call(this);
|
|
743
|
+
this.destination = null;
|
|
744
|
+
}
|
|
745
|
+
};
|
|
746
|
+
Subscriber2.prototype._next = function(value) {
|
|
747
|
+
this.destination.next(value);
|
|
748
|
+
};
|
|
749
|
+
Subscriber2.prototype._error = function(err) {
|
|
750
|
+
try {
|
|
751
|
+
this.destination.error(err);
|
|
752
|
+
} finally {
|
|
753
|
+
this.unsubscribe();
|
|
754
|
+
}
|
|
755
|
+
};
|
|
756
|
+
Subscriber2.prototype._complete = function() {
|
|
757
|
+
try {
|
|
758
|
+
this.destination.complete();
|
|
759
|
+
} finally {
|
|
760
|
+
this.unsubscribe();
|
|
761
|
+
}
|
|
762
|
+
};
|
|
763
|
+
return Subscriber2;
|
|
764
|
+
})(Subscription);
|
|
765
|
+
var ConsumerObserver = (function() {
|
|
766
|
+
function ConsumerObserver2(partialObserver) {
|
|
767
|
+
this.partialObserver = partialObserver;
|
|
768
|
+
}
|
|
769
|
+
ConsumerObserver2.prototype.next = function(value) {
|
|
770
|
+
var partialObserver = this.partialObserver;
|
|
771
|
+
if (partialObserver.next) {
|
|
772
|
+
try {
|
|
773
|
+
partialObserver.next(value);
|
|
774
|
+
} catch (error) {
|
|
775
|
+
handleUnhandledError(error);
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
};
|
|
779
|
+
ConsumerObserver2.prototype.error = function(err) {
|
|
780
|
+
var partialObserver = this.partialObserver;
|
|
781
|
+
if (partialObserver.error) {
|
|
782
|
+
try {
|
|
783
|
+
partialObserver.error(err);
|
|
784
|
+
} catch (error) {
|
|
785
|
+
handleUnhandledError(error);
|
|
786
|
+
}
|
|
787
|
+
} else {
|
|
788
|
+
handleUnhandledError(err);
|
|
789
|
+
}
|
|
790
|
+
};
|
|
791
|
+
ConsumerObserver2.prototype.complete = function() {
|
|
792
|
+
var partialObserver = this.partialObserver;
|
|
793
|
+
if (partialObserver.complete) {
|
|
794
|
+
try {
|
|
795
|
+
partialObserver.complete();
|
|
796
|
+
} catch (error) {
|
|
797
|
+
handleUnhandledError(error);
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
};
|
|
801
|
+
return ConsumerObserver2;
|
|
802
|
+
})();
|
|
803
|
+
var SafeSubscriber = (function(_super) {
|
|
804
|
+
__extends(SafeSubscriber2, _super);
|
|
805
|
+
function SafeSubscriber2(observerOrNext, error, complete) {
|
|
806
|
+
var _this = _super.call(this) || this;
|
|
807
|
+
var partialObserver;
|
|
808
|
+
if (isFunction(observerOrNext) || !observerOrNext) {
|
|
809
|
+
partialObserver = {
|
|
810
|
+
next: observerOrNext !== null && observerOrNext !== void 0 ? observerOrNext : void 0,
|
|
811
|
+
error: error !== null && error !== void 0 ? error : void 0,
|
|
812
|
+
complete: complete !== null && complete !== void 0 ? complete : void 0
|
|
813
|
+
};
|
|
814
|
+
} else {
|
|
815
|
+
{
|
|
816
|
+
partialObserver = observerOrNext;
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
_this.destination = new ConsumerObserver(partialObserver);
|
|
820
|
+
return _this;
|
|
821
|
+
}
|
|
822
|
+
return SafeSubscriber2;
|
|
823
|
+
})(Subscriber);
|
|
824
|
+
function handleUnhandledError(error) {
|
|
825
|
+
{
|
|
826
|
+
reportUnhandledError(error);
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
function defaultErrorHandler(err) {
|
|
830
|
+
throw err;
|
|
831
|
+
}
|
|
832
|
+
var EMPTY_OBSERVER = {
|
|
833
|
+
closed: true,
|
|
834
|
+
next: noop,
|
|
835
|
+
error: defaultErrorHandler,
|
|
836
|
+
complete: noop
|
|
837
|
+
};
|
|
838
|
+
var observable = (function() {
|
|
839
|
+
return typeof Symbol === "function" && Symbol.observable || "@@observable";
|
|
840
|
+
})();
|
|
841
|
+
function identity(x) {
|
|
842
|
+
return x;
|
|
843
|
+
}
|
|
844
|
+
function pipeFromArray(fns) {
|
|
845
|
+
if (fns.length === 0) {
|
|
846
|
+
return identity;
|
|
847
|
+
}
|
|
848
|
+
if (fns.length === 1) {
|
|
849
|
+
return fns[0];
|
|
850
|
+
}
|
|
851
|
+
return function piped(input) {
|
|
852
|
+
return fns.reduce(function(prev, fn) {
|
|
853
|
+
return fn(prev);
|
|
854
|
+
}, input);
|
|
855
|
+
};
|
|
856
|
+
}
|
|
857
|
+
var Observable = (function() {
|
|
858
|
+
function Observable2(subscribe) {
|
|
859
|
+
if (subscribe) {
|
|
860
|
+
this._subscribe = subscribe;
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
Observable2.prototype.lift = function(operator) {
|
|
864
|
+
var observable2 = new Observable2();
|
|
865
|
+
observable2.source = this;
|
|
866
|
+
observable2.operator = operator;
|
|
867
|
+
return observable2;
|
|
868
|
+
};
|
|
869
|
+
Observable2.prototype.subscribe = function(observerOrNext, error, complete) {
|
|
870
|
+
var _this = this;
|
|
871
|
+
var subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);
|
|
872
|
+
errorContext(function() {
|
|
873
|
+
var _a = _this, operator = _a.operator, source = _a.source;
|
|
874
|
+
subscriber.add(operator ? operator.call(subscriber, source) : source ? _this._subscribe(subscriber) : _this._trySubscribe(subscriber));
|
|
875
|
+
});
|
|
876
|
+
return subscriber;
|
|
877
|
+
};
|
|
878
|
+
Observable2.prototype._trySubscribe = function(sink) {
|
|
879
|
+
try {
|
|
880
|
+
return this._subscribe(sink);
|
|
881
|
+
} catch (err) {
|
|
882
|
+
sink.error(err);
|
|
883
|
+
}
|
|
884
|
+
};
|
|
885
|
+
Observable2.prototype.forEach = function(next, promiseCtor) {
|
|
886
|
+
var _this = this;
|
|
887
|
+
promiseCtor = getPromiseCtor(promiseCtor);
|
|
888
|
+
return new promiseCtor(function(resolve, reject) {
|
|
889
|
+
var subscriber = new SafeSubscriber({
|
|
890
|
+
next: function(value) {
|
|
891
|
+
try {
|
|
892
|
+
next(value);
|
|
893
|
+
} catch (err) {
|
|
894
|
+
reject(err);
|
|
895
|
+
subscriber.unsubscribe();
|
|
896
|
+
}
|
|
897
|
+
},
|
|
898
|
+
error: reject,
|
|
899
|
+
complete: resolve
|
|
900
|
+
});
|
|
901
|
+
_this.subscribe(subscriber);
|
|
902
|
+
});
|
|
903
|
+
};
|
|
904
|
+
Observable2.prototype._subscribe = function(subscriber) {
|
|
905
|
+
var _a;
|
|
906
|
+
return (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber);
|
|
907
|
+
};
|
|
908
|
+
Observable2.prototype[observable] = function() {
|
|
909
|
+
return this;
|
|
910
|
+
};
|
|
911
|
+
Observable2.prototype.pipe = function() {
|
|
912
|
+
var operations = [];
|
|
913
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
914
|
+
operations[_i] = arguments[_i];
|
|
915
|
+
}
|
|
916
|
+
return pipeFromArray(operations)(this);
|
|
917
|
+
};
|
|
918
|
+
Observable2.prototype.toPromise = function(promiseCtor) {
|
|
919
|
+
var _this = this;
|
|
920
|
+
promiseCtor = getPromiseCtor(promiseCtor);
|
|
921
|
+
return new promiseCtor(function(resolve, reject) {
|
|
922
|
+
var value;
|
|
923
|
+
_this.subscribe(function(x) {
|
|
924
|
+
return value = x;
|
|
925
|
+
}, function(err) {
|
|
926
|
+
return reject(err);
|
|
927
|
+
}, function() {
|
|
928
|
+
return resolve(value);
|
|
929
|
+
});
|
|
930
|
+
});
|
|
931
|
+
};
|
|
932
|
+
Observable2.create = function(subscribe) {
|
|
933
|
+
return new Observable2(subscribe);
|
|
934
|
+
};
|
|
935
|
+
return Observable2;
|
|
936
|
+
})();
|
|
937
|
+
function getPromiseCtor(promiseCtor) {
|
|
938
|
+
var _a;
|
|
939
|
+
return (_a = promiseCtor !== null && promiseCtor !== void 0 ? promiseCtor : config.Promise) !== null && _a !== void 0 ? _a : Promise;
|
|
940
|
+
}
|
|
941
|
+
function isObserver(value) {
|
|
942
|
+
return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);
|
|
943
|
+
}
|
|
944
|
+
function isSubscriber(value) {
|
|
945
|
+
return value && value instanceof Subscriber || isObserver(value) && isSubscription(value);
|
|
946
|
+
}
|
|
947
|
+
var ObjectUnsubscribedError = createErrorClass(function(_super) {
|
|
948
|
+
return function ObjectUnsubscribedErrorImpl() {
|
|
949
|
+
_super(this);
|
|
950
|
+
this.name = "ObjectUnsubscribedError";
|
|
951
|
+
this.message = "object unsubscribed";
|
|
952
|
+
};
|
|
953
|
+
});
|
|
954
|
+
var Subject = (function(_super) {
|
|
955
|
+
__extends(Subject2, _super);
|
|
956
|
+
function Subject2() {
|
|
957
|
+
var _this = _super.call(this) || this;
|
|
958
|
+
_this.closed = false;
|
|
959
|
+
_this.currentObservers = null;
|
|
960
|
+
_this.observers = [];
|
|
961
|
+
_this.isStopped = false;
|
|
962
|
+
_this.hasError = false;
|
|
963
|
+
_this.thrownError = null;
|
|
964
|
+
return _this;
|
|
965
|
+
}
|
|
966
|
+
Subject2.prototype.lift = function(operator) {
|
|
967
|
+
var subject = new AnonymousSubject(this, this);
|
|
968
|
+
subject.operator = operator;
|
|
969
|
+
return subject;
|
|
970
|
+
};
|
|
971
|
+
Subject2.prototype._throwIfClosed = function() {
|
|
972
|
+
if (this.closed) {
|
|
973
|
+
throw new ObjectUnsubscribedError();
|
|
974
|
+
}
|
|
975
|
+
};
|
|
976
|
+
Subject2.prototype.next = function(value) {
|
|
977
|
+
var _this = this;
|
|
978
|
+
errorContext(function() {
|
|
979
|
+
var e_1, _a;
|
|
980
|
+
_this._throwIfClosed();
|
|
981
|
+
if (!_this.isStopped) {
|
|
982
|
+
if (!_this.currentObservers) {
|
|
983
|
+
_this.currentObservers = Array.from(_this.observers);
|
|
984
|
+
}
|
|
985
|
+
try {
|
|
986
|
+
for (var _b = __values(_this.currentObservers), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
987
|
+
var observer = _c.value;
|
|
988
|
+
observer.next(value);
|
|
989
|
+
}
|
|
990
|
+
} catch (e_1_1) {
|
|
991
|
+
e_1 = { error: e_1_1 };
|
|
992
|
+
} finally {
|
|
993
|
+
try {
|
|
994
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
995
|
+
} finally {
|
|
996
|
+
if (e_1) throw e_1.error;
|
|
997
|
+
}
|
|
998
|
+
}
|
|
999
|
+
}
|
|
1000
|
+
});
|
|
1001
|
+
};
|
|
1002
|
+
Subject2.prototype.error = function(err) {
|
|
1003
|
+
var _this = this;
|
|
1004
|
+
errorContext(function() {
|
|
1005
|
+
_this._throwIfClosed();
|
|
1006
|
+
if (!_this.isStopped) {
|
|
1007
|
+
_this.hasError = _this.isStopped = true;
|
|
1008
|
+
_this.thrownError = err;
|
|
1009
|
+
var observers = _this.observers;
|
|
1010
|
+
while (observers.length) {
|
|
1011
|
+
observers.shift().error(err);
|
|
1012
|
+
}
|
|
1013
|
+
}
|
|
1014
|
+
});
|
|
1015
|
+
};
|
|
1016
|
+
Subject2.prototype.complete = function() {
|
|
1017
|
+
var _this = this;
|
|
1018
|
+
errorContext(function() {
|
|
1019
|
+
_this._throwIfClosed();
|
|
1020
|
+
if (!_this.isStopped) {
|
|
1021
|
+
_this.isStopped = true;
|
|
1022
|
+
var observers = _this.observers;
|
|
1023
|
+
while (observers.length) {
|
|
1024
|
+
observers.shift().complete();
|
|
1025
|
+
}
|
|
1026
|
+
}
|
|
1027
|
+
});
|
|
1028
|
+
};
|
|
1029
|
+
Subject2.prototype.unsubscribe = function() {
|
|
1030
|
+
this.isStopped = this.closed = true;
|
|
1031
|
+
this.observers = this.currentObservers = null;
|
|
1032
|
+
};
|
|
1033
|
+
Object.defineProperty(Subject2.prototype, "observed", {
|
|
1034
|
+
get: function() {
|
|
1035
|
+
var _a;
|
|
1036
|
+
return ((_a = this.observers) === null || _a === void 0 ? void 0 : _a.length) > 0;
|
|
1037
|
+
},
|
|
1038
|
+
enumerable: false,
|
|
1039
|
+
configurable: true
|
|
1040
|
+
});
|
|
1041
|
+
Subject2.prototype._trySubscribe = function(subscriber) {
|
|
1042
|
+
this._throwIfClosed();
|
|
1043
|
+
return _super.prototype._trySubscribe.call(this, subscriber);
|
|
1044
|
+
};
|
|
1045
|
+
Subject2.prototype._subscribe = function(subscriber) {
|
|
1046
|
+
this._throwIfClosed();
|
|
1047
|
+
this._checkFinalizedStatuses(subscriber);
|
|
1048
|
+
return this._innerSubscribe(subscriber);
|
|
1049
|
+
};
|
|
1050
|
+
Subject2.prototype._innerSubscribe = function(subscriber) {
|
|
1051
|
+
var _this = this;
|
|
1052
|
+
var _a = this, hasError = _a.hasError, isStopped = _a.isStopped, observers = _a.observers;
|
|
1053
|
+
if (hasError || isStopped) {
|
|
1054
|
+
return EMPTY_SUBSCRIPTION;
|
|
1055
|
+
}
|
|
1056
|
+
this.currentObservers = null;
|
|
1057
|
+
observers.push(subscriber);
|
|
1058
|
+
return new Subscription(function() {
|
|
1059
|
+
_this.currentObservers = null;
|
|
1060
|
+
arrRemove(observers, subscriber);
|
|
1061
|
+
});
|
|
1062
|
+
};
|
|
1063
|
+
Subject2.prototype._checkFinalizedStatuses = function(subscriber) {
|
|
1064
|
+
var _a = this, hasError = _a.hasError, thrownError = _a.thrownError, isStopped = _a.isStopped;
|
|
1065
|
+
if (hasError) {
|
|
1066
|
+
subscriber.error(thrownError);
|
|
1067
|
+
} else if (isStopped) {
|
|
1068
|
+
subscriber.complete();
|
|
1069
|
+
}
|
|
1070
|
+
};
|
|
1071
|
+
Subject2.prototype.asObservable = function() {
|
|
1072
|
+
var observable2 = new Observable();
|
|
1073
|
+
observable2.source = this;
|
|
1074
|
+
return observable2;
|
|
1075
|
+
};
|
|
1076
|
+
Subject2.create = function(destination, source) {
|
|
1077
|
+
return new AnonymousSubject(destination, source);
|
|
1078
|
+
};
|
|
1079
|
+
return Subject2;
|
|
1080
|
+
})(Observable);
|
|
1081
|
+
var AnonymousSubject = (function(_super) {
|
|
1082
|
+
__extends(AnonymousSubject2, _super);
|
|
1083
|
+
function AnonymousSubject2(destination, source) {
|
|
1084
|
+
var _this = _super.call(this) || this;
|
|
1085
|
+
_this.destination = destination;
|
|
1086
|
+
_this.source = source;
|
|
1087
|
+
return _this;
|
|
1088
|
+
}
|
|
1089
|
+
AnonymousSubject2.prototype.next = function(value) {
|
|
1090
|
+
var _a, _b;
|
|
1091
|
+
(_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.next) === null || _b === void 0 ? void 0 : _b.call(_a, value);
|
|
1092
|
+
};
|
|
1093
|
+
AnonymousSubject2.prototype.error = function(err) {
|
|
1094
|
+
var _a, _b;
|
|
1095
|
+
(_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.error) === null || _b === void 0 ? void 0 : _b.call(_a, err);
|
|
1096
|
+
};
|
|
1097
|
+
AnonymousSubject2.prototype.complete = function() {
|
|
1098
|
+
var _a, _b;
|
|
1099
|
+
(_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.complete) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
1100
|
+
};
|
|
1101
|
+
AnonymousSubject2.prototype._subscribe = function(subscriber) {
|
|
1102
|
+
var _a, _b;
|
|
1103
|
+
return (_b = (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber)) !== null && _b !== void 0 ? _b : EMPTY_SUBSCRIPTION;
|
|
1104
|
+
};
|
|
1105
|
+
return AnonymousSubject2;
|
|
1106
|
+
})(Subject);
|
|
1107
|
+
var dateTimestampProvider = {
|
|
1108
|
+
now: function() {
|
|
1109
|
+
return (dateTimestampProvider.delegate || Date).now();
|
|
1110
|
+
},
|
|
1111
|
+
delegate: void 0
|
|
1112
|
+
};
|
|
1113
|
+
var ReplaySubject = (function(_super) {
|
|
1114
|
+
__extends(ReplaySubject2, _super);
|
|
1115
|
+
function ReplaySubject2(_bufferSize, _windowTime, _timestampProvider) {
|
|
1116
|
+
if (_bufferSize === void 0) {
|
|
1117
|
+
_bufferSize = Infinity;
|
|
1118
|
+
}
|
|
1119
|
+
if (_windowTime === void 0) {
|
|
1120
|
+
_windowTime = Infinity;
|
|
1121
|
+
}
|
|
1122
|
+
if (_timestampProvider === void 0) {
|
|
1123
|
+
_timestampProvider = dateTimestampProvider;
|
|
1124
|
+
}
|
|
1125
|
+
var _this = _super.call(this) || this;
|
|
1126
|
+
_this._bufferSize = _bufferSize;
|
|
1127
|
+
_this._windowTime = _windowTime;
|
|
1128
|
+
_this._timestampProvider = _timestampProvider;
|
|
1129
|
+
_this._buffer = [];
|
|
1130
|
+
_this._infiniteTimeWindow = true;
|
|
1131
|
+
_this._infiniteTimeWindow = _windowTime === Infinity;
|
|
1132
|
+
_this._bufferSize = Math.max(1, _bufferSize);
|
|
1133
|
+
_this._windowTime = Math.max(1, _windowTime);
|
|
1134
|
+
return _this;
|
|
1135
|
+
}
|
|
1136
|
+
ReplaySubject2.prototype.next = function(value) {
|
|
1137
|
+
var _a = this, isStopped = _a.isStopped, _buffer = _a._buffer, _infiniteTimeWindow = _a._infiniteTimeWindow, _timestampProvider = _a._timestampProvider, _windowTime = _a._windowTime;
|
|
1138
|
+
if (!isStopped) {
|
|
1139
|
+
_buffer.push(value);
|
|
1140
|
+
!_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);
|
|
1141
|
+
}
|
|
1142
|
+
this._trimBuffer();
|
|
1143
|
+
_super.prototype.next.call(this, value);
|
|
1144
|
+
};
|
|
1145
|
+
ReplaySubject2.prototype._subscribe = function(subscriber) {
|
|
1146
|
+
this._throwIfClosed();
|
|
1147
|
+
this._trimBuffer();
|
|
1148
|
+
var subscription = this._innerSubscribe(subscriber);
|
|
1149
|
+
var _a = this, _infiniteTimeWindow = _a._infiniteTimeWindow, _buffer = _a._buffer;
|
|
1150
|
+
var copy = _buffer.slice();
|
|
1151
|
+
for (var i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {
|
|
1152
|
+
subscriber.next(copy[i]);
|
|
1153
|
+
}
|
|
1154
|
+
this._checkFinalizedStatuses(subscriber);
|
|
1155
|
+
return subscription;
|
|
1156
|
+
};
|
|
1157
|
+
ReplaySubject2.prototype._trimBuffer = function() {
|
|
1158
|
+
var _a = this, _bufferSize = _a._bufferSize, _timestampProvider = _a._timestampProvider, _buffer = _a._buffer, _infiniteTimeWindow = _a._infiniteTimeWindow;
|
|
1159
|
+
var adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;
|
|
1160
|
+
_bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);
|
|
1161
|
+
if (!_infiniteTimeWindow) {
|
|
1162
|
+
var now = _timestampProvider.now();
|
|
1163
|
+
var last = 0;
|
|
1164
|
+
for (var i = 1; i < _buffer.length && _buffer[i] <= now; i += 2) {
|
|
1165
|
+
last = i;
|
|
1166
|
+
}
|
|
1167
|
+
last && _buffer.splice(0, last + 1);
|
|
1168
|
+
}
|
|
1169
|
+
};
|
|
1170
|
+
return ReplaySubject2;
|
|
1171
|
+
})(Subject);
|
|
1172
|
+
var DEFAULT_WEBSOCKET_CONFIG = {
|
|
1173
|
+
url: "",
|
|
1174
|
+
deserializer: function(e) {
|
|
1175
|
+
return JSON.parse(e.data);
|
|
1176
|
+
},
|
|
1177
|
+
serializer: function(value) {
|
|
1178
|
+
return JSON.stringify(value);
|
|
1179
|
+
}
|
|
1180
|
+
};
|
|
1181
|
+
var WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT = "WebSocketSubject.error must be called with an object with an error code, and an optional reason: { code: number, reason: string }";
|
|
1182
|
+
var WebSocketSubject = (function(_super) {
|
|
1183
|
+
__extends(WebSocketSubject2, _super);
|
|
1184
|
+
function WebSocketSubject2(urlConfigOrSource, destination) {
|
|
1185
|
+
var _this = _super.call(this) || this;
|
|
1186
|
+
_this._socket = null;
|
|
1187
|
+
if (urlConfigOrSource instanceof Observable) {
|
|
1188
|
+
_this.destination = destination;
|
|
1189
|
+
_this.source = urlConfigOrSource;
|
|
1190
|
+
} else {
|
|
1191
|
+
var config2 = _this._config = __assign({}, DEFAULT_WEBSOCKET_CONFIG);
|
|
1192
|
+
_this._output = new Subject();
|
|
1193
|
+
if (typeof urlConfigOrSource === "string") {
|
|
1194
|
+
config2.url = urlConfigOrSource;
|
|
1195
|
+
} else {
|
|
1196
|
+
for (var key in urlConfigOrSource) {
|
|
1197
|
+
if (urlConfigOrSource.hasOwnProperty(key)) {
|
|
1198
|
+
config2[key] = urlConfigOrSource[key];
|
|
1199
|
+
}
|
|
1200
|
+
}
|
|
1201
|
+
}
|
|
1202
|
+
if (!config2.WebSocketCtor && WebSocket) {
|
|
1203
|
+
config2.WebSocketCtor = WebSocket;
|
|
1204
|
+
} else if (!config2.WebSocketCtor) {
|
|
1205
|
+
throw new Error("no WebSocket constructor can be found");
|
|
1206
|
+
}
|
|
1207
|
+
_this.destination = new ReplaySubject();
|
|
1208
|
+
}
|
|
1209
|
+
return _this;
|
|
1210
|
+
}
|
|
1211
|
+
WebSocketSubject2.prototype.lift = function(operator) {
|
|
1212
|
+
var sock = new WebSocketSubject2(this._config, this.destination);
|
|
1213
|
+
sock.operator = operator;
|
|
1214
|
+
sock.source = this;
|
|
1215
|
+
return sock;
|
|
1216
|
+
};
|
|
1217
|
+
WebSocketSubject2.prototype._resetState = function() {
|
|
1218
|
+
this._socket = null;
|
|
1219
|
+
if (!this.source) {
|
|
1220
|
+
this.destination = new ReplaySubject();
|
|
1221
|
+
}
|
|
1222
|
+
this._output = new Subject();
|
|
1223
|
+
};
|
|
1224
|
+
WebSocketSubject2.prototype.multiplex = function(subMsg, unsubMsg, messageFilter) {
|
|
1225
|
+
var self = this;
|
|
1226
|
+
return new Observable(function(observer) {
|
|
1227
|
+
try {
|
|
1228
|
+
self.next(subMsg());
|
|
1229
|
+
} catch (err) {
|
|
1230
|
+
observer.error(err);
|
|
1231
|
+
}
|
|
1232
|
+
var subscription = self.subscribe({
|
|
1233
|
+
next: function(x) {
|
|
1234
|
+
try {
|
|
1235
|
+
if (messageFilter(x)) {
|
|
1236
|
+
observer.next(x);
|
|
1237
|
+
}
|
|
1238
|
+
} catch (err) {
|
|
1239
|
+
observer.error(err);
|
|
1240
|
+
}
|
|
1241
|
+
},
|
|
1242
|
+
error: function(err) {
|
|
1243
|
+
return observer.error(err);
|
|
1244
|
+
},
|
|
1245
|
+
complete: function() {
|
|
1246
|
+
return observer.complete();
|
|
1247
|
+
}
|
|
1248
|
+
});
|
|
1249
|
+
return function() {
|
|
1250
|
+
try {
|
|
1251
|
+
self.next(unsubMsg());
|
|
1252
|
+
} catch (err) {
|
|
1253
|
+
observer.error(err);
|
|
1254
|
+
}
|
|
1255
|
+
subscription.unsubscribe();
|
|
1256
|
+
};
|
|
1257
|
+
});
|
|
1258
|
+
};
|
|
1259
|
+
WebSocketSubject2.prototype._connectSocket = function() {
|
|
1260
|
+
var _this = this;
|
|
1261
|
+
var _a = this._config, WebSocketCtor = _a.WebSocketCtor, protocol = _a.protocol, url = _a.url, binaryType = _a.binaryType;
|
|
1262
|
+
var observer = this._output;
|
|
1263
|
+
var socket = null;
|
|
1264
|
+
try {
|
|
1265
|
+
socket = protocol ? new WebSocketCtor(url, protocol) : new WebSocketCtor(url);
|
|
1266
|
+
this._socket = socket;
|
|
1267
|
+
if (binaryType) {
|
|
1268
|
+
this._socket.binaryType = binaryType;
|
|
1269
|
+
}
|
|
1270
|
+
} catch (e) {
|
|
1271
|
+
observer.error(e);
|
|
1272
|
+
return;
|
|
1273
|
+
}
|
|
1274
|
+
var subscription = new Subscription(function() {
|
|
1275
|
+
_this._socket = null;
|
|
1276
|
+
if (socket && socket.readyState === 1) {
|
|
1277
|
+
socket.close();
|
|
1278
|
+
}
|
|
1279
|
+
});
|
|
1280
|
+
socket.onopen = function(evt) {
|
|
1281
|
+
var _socket = _this._socket;
|
|
1282
|
+
if (!_socket) {
|
|
1283
|
+
socket.close();
|
|
1284
|
+
_this._resetState();
|
|
1285
|
+
return;
|
|
1286
|
+
}
|
|
1287
|
+
var openObserver = _this._config.openObserver;
|
|
1288
|
+
if (openObserver) {
|
|
1289
|
+
openObserver.next(evt);
|
|
1290
|
+
}
|
|
1291
|
+
var queue = _this.destination;
|
|
1292
|
+
_this.destination = Subscriber.create(function(x) {
|
|
1293
|
+
if (socket.readyState === 1) {
|
|
1294
|
+
try {
|
|
1295
|
+
var serializer = _this._config.serializer;
|
|
1296
|
+
socket.send(serializer(x));
|
|
1297
|
+
} catch (e) {
|
|
1298
|
+
_this.destination.error(e);
|
|
1299
|
+
}
|
|
1300
|
+
}
|
|
1301
|
+
}, function(err) {
|
|
1302
|
+
var closingObserver = _this._config.closingObserver;
|
|
1303
|
+
if (closingObserver) {
|
|
1304
|
+
closingObserver.next(void 0);
|
|
1305
|
+
}
|
|
1306
|
+
if (err && err.code) {
|
|
1307
|
+
socket.close(err.code, err.reason);
|
|
1308
|
+
} else {
|
|
1309
|
+
observer.error(new TypeError(WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT));
|
|
1310
|
+
}
|
|
1311
|
+
_this._resetState();
|
|
1312
|
+
}, function() {
|
|
1313
|
+
var closingObserver = _this._config.closingObserver;
|
|
1314
|
+
if (closingObserver) {
|
|
1315
|
+
closingObserver.next(void 0);
|
|
1316
|
+
}
|
|
1317
|
+
socket.close();
|
|
1318
|
+
_this._resetState();
|
|
1319
|
+
});
|
|
1320
|
+
if (queue && queue instanceof ReplaySubject) {
|
|
1321
|
+
subscription.add(queue.subscribe(_this.destination));
|
|
1322
|
+
}
|
|
1323
|
+
};
|
|
1324
|
+
socket.onerror = function(e) {
|
|
1325
|
+
_this._resetState();
|
|
1326
|
+
observer.error(e);
|
|
1327
|
+
};
|
|
1328
|
+
socket.onclose = function(e) {
|
|
1329
|
+
if (socket === _this._socket) {
|
|
1330
|
+
_this._resetState();
|
|
1331
|
+
}
|
|
1332
|
+
var closeObserver = _this._config.closeObserver;
|
|
1333
|
+
if (closeObserver) {
|
|
1334
|
+
closeObserver.next(e);
|
|
1335
|
+
}
|
|
1336
|
+
if (e.wasClean) {
|
|
1337
|
+
observer.complete();
|
|
1338
|
+
} else {
|
|
1339
|
+
observer.error(e);
|
|
1340
|
+
}
|
|
1341
|
+
};
|
|
1342
|
+
socket.onmessage = function(e) {
|
|
1343
|
+
try {
|
|
1344
|
+
var deserializer = _this._config.deserializer;
|
|
1345
|
+
observer.next(deserializer(e));
|
|
1346
|
+
} catch (err) {
|
|
1347
|
+
observer.error(err);
|
|
1348
|
+
}
|
|
1349
|
+
};
|
|
1350
|
+
};
|
|
1351
|
+
WebSocketSubject2.prototype._subscribe = function(subscriber) {
|
|
1352
|
+
var _this = this;
|
|
1353
|
+
var source = this.source;
|
|
1354
|
+
if (source) {
|
|
1355
|
+
return source.subscribe(subscriber);
|
|
1356
|
+
}
|
|
1357
|
+
if (!this._socket) {
|
|
1358
|
+
this._connectSocket();
|
|
1359
|
+
}
|
|
1360
|
+
this._output.subscribe(subscriber);
|
|
1361
|
+
subscriber.add(function() {
|
|
1362
|
+
var _socket = _this._socket;
|
|
1363
|
+
if (_this._output.observers.length === 0) {
|
|
1364
|
+
if (_socket && (_socket.readyState === 1 || _socket.readyState === 0)) {
|
|
1365
|
+
_socket.close();
|
|
1366
|
+
}
|
|
1367
|
+
_this._resetState();
|
|
1368
|
+
}
|
|
1369
|
+
});
|
|
1370
|
+
return subscriber;
|
|
1371
|
+
};
|
|
1372
|
+
WebSocketSubject2.prototype.unsubscribe = function() {
|
|
1373
|
+
var _socket = this._socket;
|
|
1374
|
+
if (_socket && (_socket.readyState === 1 || _socket.readyState === 0)) {
|
|
1375
|
+
_socket.close();
|
|
1376
|
+
}
|
|
1377
|
+
this._resetState();
|
|
1378
|
+
_super.prototype.unsubscribe.call(this);
|
|
1379
|
+
};
|
|
1380
|
+
return WebSocketSubject2;
|
|
1381
|
+
})(AnonymousSubject);
|
|
1382
|
+
function webSocket(urlConfigOrSource) {
|
|
1383
|
+
return new WebSocketSubject(urlConfigOrSource);
|
|
1384
|
+
}
|
|
1385
|
+
class WebsocketService extends BaseConnectionService {
|
|
1386
|
+
constructor(config2) {
|
|
1387
|
+
super();
|
|
1388
|
+
this.socket$ = null;
|
|
1389
|
+
this.wsConfig = config2;
|
|
1390
|
+
}
|
|
1391
|
+
get serviceName() {
|
|
1392
|
+
return "WS";
|
|
1393
|
+
}
|
|
1394
|
+
connect() {
|
|
1395
|
+
if (this.socket$) {
|
|
1396
|
+
return;
|
|
1397
|
+
}
|
|
1398
|
+
this.socket$ = webSocket({
|
|
1399
|
+
url: this.wsConfig.url,
|
|
1400
|
+
openObserver: {
|
|
1401
|
+
next: () => {
|
|
1402
|
+
console.log("[WS] Connected");
|
|
1403
|
+
this.connectionStatusSubject$.next(true);
|
|
1404
|
+
this.resetReconnectAttempts();
|
|
1405
|
+
this.sendMessage("INIT_CONNECTION");
|
|
1406
|
+
}
|
|
1407
|
+
},
|
|
1408
|
+
closeObserver: {
|
|
1409
|
+
next: (event) => {
|
|
1410
|
+
console.log("[WS] Closed:", event.code, event.reason);
|
|
1411
|
+
this.connectionStatusSubject$.next(false);
|
|
1412
|
+
this.socket$ = null;
|
|
1413
|
+
if (event.code !== 1e3 && event.reason !== "Closing duplicate connection") {
|
|
1414
|
+
this.scheduleReconnect(() => this.connect());
|
|
1415
|
+
}
|
|
1416
|
+
}
|
|
1417
|
+
}
|
|
1418
|
+
});
|
|
1419
|
+
this.socket$.pipe(
|
|
1420
|
+
operators.takeUntil(this.destroySubject$),
|
|
1421
|
+
operators.tap({
|
|
1422
|
+
error: (err) => {
|
|
1423
|
+
console.error("[WS] Error:", err);
|
|
1424
|
+
this.connectionStatusSubject$.next(false);
|
|
1425
|
+
}
|
|
1426
|
+
})
|
|
1427
|
+
).subscribe({
|
|
1428
|
+
next: (message) => {
|
|
1429
|
+
if (this.isIncomingMessage(message)) {
|
|
1430
|
+
this.messagesSubject$.next(message);
|
|
1431
|
+
}
|
|
1432
|
+
},
|
|
1433
|
+
error: (err) => console.error("[WS] Stream error:", err)
|
|
1434
|
+
});
|
|
1435
|
+
}
|
|
1436
|
+
isIncomingMessage(msg) {
|
|
1437
|
+
return "action" in msg && !("Authorization" in msg);
|
|
1438
|
+
}
|
|
1439
|
+
async sendMessage(action, payload) {
|
|
1440
|
+
if (!this.socket$ || !this.connectionStatusSubject$.value) {
|
|
1441
|
+
console.warn("[WS] Cannot send message - not connected");
|
|
1442
|
+
return;
|
|
1443
|
+
}
|
|
1444
|
+
try {
|
|
1445
|
+
if (!this.wsConfig.authProvider.isAuthenticated()) {
|
|
1446
|
+
console.warn(`[WS] Cannot send message - not authenticated for action: ${action}`);
|
|
1447
|
+
return;
|
|
1448
|
+
}
|
|
1449
|
+
const idToken = await this.wsConfig.authProvider.getIdToken();
|
|
1450
|
+
if (!idToken) {
|
|
1451
|
+
console.warn(`[WS] Cannot send message - no auth token available for action: ${action}`);
|
|
1452
|
+
return;
|
|
1453
|
+
}
|
|
1454
|
+
this.socket$.next({
|
|
1455
|
+
Authorization: idToken,
|
|
1456
|
+
action,
|
|
1457
|
+
payload
|
|
1458
|
+
});
|
|
1459
|
+
} catch (error) {
|
|
1460
|
+
console.error("[WS] Error sending message:", error);
|
|
1461
|
+
}
|
|
1462
|
+
}
|
|
1463
|
+
on(action) {
|
|
1464
|
+
return this.messages$.pipe(
|
|
1465
|
+
operators.filter((msg) => msg.action === action),
|
|
1466
|
+
operators.map((msg) => msg.payload)
|
|
1467
|
+
);
|
|
1468
|
+
}
|
|
1469
|
+
request(sendAction, responseAction, payload) {
|
|
1470
|
+
return new rxjs.Observable((subscriber) => {
|
|
1471
|
+
const sub = this.on(responseAction).pipe(operators.take(1)).subscribe(subscriber);
|
|
1472
|
+
this.sendMessage(sendAction, payload);
|
|
1473
|
+
return () => sub.unsubscribe();
|
|
1474
|
+
});
|
|
1475
|
+
}
|
|
1476
|
+
disconnect() {
|
|
1477
|
+
var _a;
|
|
1478
|
+
(_a = this.socket$) == null ? void 0 : _a.complete();
|
|
1479
|
+
this.socket$ = null;
|
|
1480
|
+
this.connectionStatusSubject$.next(false);
|
|
1481
|
+
this.resetReconnectAttempts();
|
|
1482
|
+
}
|
|
1483
|
+
destroy() {
|
|
1484
|
+
var _a;
|
|
1485
|
+
(_a = this.socket$) == null ? void 0 : _a.complete();
|
|
1486
|
+
this.socket$ = null;
|
|
1487
|
+
this.destroySubject$.next();
|
|
1488
|
+
this.destroySubject$.complete();
|
|
1489
|
+
this.messagesSubject$.complete();
|
|
1490
|
+
this.connectionStatusSubject$.complete();
|
|
1491
|
+
}
|
|
1492
|
+
}
|
|
1493
|
+
const LiveUpdateContext = react.createContext(null);
|
|
1494
|
+
const useLiveUpdateContext = () => {
|
|
1495
|
+
const context = react.useContext(LiveUpdateContext);
|
|
1496
|
+
if (!context) {
|
|
1497
|
+
throw new Error("useLiveUpdateContext must be used within LiveUpdateProvider");
|
|
1498
|
+
}
|
|
1499
|
+
return context;
|
|
1500
|
+
};
|
|
1501
|
+
const LiveUpdateProvider = ({
|
|
1502
|
+
children,
|
|
1503
|
+
authProvider,
|
|
1504
|
+
sseUrl = "http://localhost:3000/sse",
|
|
1505
|
+
wsUrl = "ws://localhost:3000/ws",
|
|
1506
|
+
sseEnabled = true,
|
|
1507
|
+
wsEnabled = true,
|
|
1508
|
+
eventMappings = {}
|
|
1509
|
+
}) => {
|
|
1510
|
+
const [isConnected, setIsConnected] = react.useState(false);
|
|
1511
|
+
const [service] = react.useState(() => {
|
|
1512
|
+
const sseService = new SSEService({
|
|
1513
|
+
url: sseUrl,
|
|
1514
|
+
authProvider
|
|
1515
|
+
});
|
|
1516
|
+
const wsService = new WebsocketService({
|
|
1517
|
+
url: wsUrl,
|
|
1518
|
+
authProvider
|
|
1519
|
+
});
|
|
1520
|
+
return new LiveUpdateService(wsService, sseService);
|
|
1521
|
+
});
|
|
1522
|
+
react.useEffect(() => {
|
|
1523
|
+
if (authProvider.isAuthenticated()) {
|
|
1524
|
+
service.initialize({
|
|
1525
|
+
sseEnabled,
|
|
1526
|
+
wsEnabled,
|
|
1527
|
+
authProvider,
|
|
1528
|
+
eventMappings
|
|
1529
|
+
});
|
|
1530
|
+
} else {
|
|
1531
|
+
service.disconnect();
|
|
1532
|
+
}
|
|
1533
|
+
const subscription = service.isConnected$.subscribe(setIsConnected);
|
|
1534
|
+
return () => {
|
|
1535
|
+
subscription.unsubscribe();
|
|
1536
|
+
};
|
|
1537
|
+
}, [authProvider, sseEnabled, wsEnabled, service, eventMappings]);
|
|
1538
|
+
react.useEffect(() => {
|
|
1539
|
+
return () => {
|
|
1540
|
+
service.disconnect();
|
|
1541
|
+
};
|
|
1542
|
+
}, [service]);
|
|
1543
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1544
|
+
LiveUpdateContext.Provider,
|
|
1545
|
+
{
|
|
1546
|
+
value: {
|
|
1547
|
+
service,
|
|
1548
|
+
isConnected,
|
|
1549
|
+
type: service.type,
|
|
1550
|
+
canSend: service.canSend
|
|
1551
|
+
},
|
|
1552
|
+
children
|
|
1553
|
+
}
|
|
1554
|
+
);
|
|
1555
|
+
};
|
|
1556
|
+
const useLiveListener = (action, enabled = true) => {
|
|
1557
|
+
const { service } = useLiveUpdateContext();
|
|
1558
|
+
const [data, setData] = react.useState(null);
|
|
1559
|
+
const [error, setError] = react.useState(null);
|
|
1560
|
+
react.useEffect(() => {
|
|
1561
|
+
if (!enabled) {
|
|
1562
|
+
return;
|
|
1563
|
+
}
|
|
1564
|
+
const subscription = service.on(action).subscribe({
|
|
1565
|
+
next: (value) => {
|
|
1566
|
+
setData(value);
|
|
1567
|
+
setError(null);
|
|
1568
|
+
},
|
|
1569
|
+
error: (err) => {
|
|
1570
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
1571
|
+
}
|
|
1572
|
+
});
|
|
1573
|
+
return () => {
|
|
1574
|
+
subscription.unsubscribe();
|
|
1575
|
+
};
|
|
1576
|
+
}, [action, enabled, service]);
|
|
1577
|
+
return { data, error };
|
|
1578
|
+
};
|
|
1579
|
+
const useLiveRequest = () => {
|
|
1580
|
+
const { service, canSend } = useLiveUpdateContext();
|
|
1581
|
+
const request = react.useCallback(
|
|
1582
|
+
(sendAction, responseAction, payload) => {
|
|
1583
|
+
if (!canSend) {
|
|
1584
|
+
return Promise.reject(new Error("WebSocket not available for sending"));
|
|
1585
|
+
}
|
|
1586
|
+
return service.on(responseAction).toPromise().catch(() => {
|
|
1587
|
+
throw new Error(`No response received for action: ${responseAction}`);
|
|
1588
|
+
});
|
|
1589
|
+
},
|
|
1590
|
+
[canSend, service]
|
|
1591
|
+
);
|
|
1592
|
+
return { request, canSend };
|
|
1593
|
+
};
|
|
1594
|
+
const useLiveUpdateListener = (action, onUpdate, { enabled = true } = {}) => {
|
|
1595
|
+
const { service } = useLiveUpdateContext();
|
|
1596
|
+
const handleUpdate = react.useCallback(
|
|
1597
|
+
(data) => {
|
|
1598
|
+
onUpdate(data);
|
|
1599
|
+
},
|
|
1600
|
+
[onUpdate]
|
|
1601
|
+
);
|
|
1602
|
+
const subscribe = react.useCallback(() => {
|
|
1603
|
+
if (!enabled) {
|
|
1604
|
+
return () => {
|
|
1605
|
+
};
|
|
1606
|
+
}
|
|
1607
|
+
const subscription = service.on(action).subscribe(handleUpdate);
|
|
1608
|
+
return () => {
|
|
1609
|
+
subscription.unsubscribe();
|
|
1610
|
+
};
|
|
1611
|
+
}, [action, enabled, service, handleUpdate]);
|
|
1612
|
+
return { subscribe };
|
|
1613
|
+
};
|
|
1614
|
+
const useLiveUpdates = (eventName) => {
|
|
1615
|
+
const { service } = useLiveUpdateContext();
|
|
1616
|
+
const [data, setData] = react.useState(null);
|
|
1617
|
+
const [error, setError] = react.useState(null);
|
|
1618
|
+
react.useEffect(() => {
|
|
1619
|
+
const subscription = service.on(eventName).subscribe({
|
|
1620
|
+
next: (value) => {
|
|
1621
|
+
setData(value);
|
|
1622
|
+
setError(null);
|
|
1623
|
+
},
|
|
1624
|
+
error: (err) => {
|
|
1625
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
1626
|
+
}
|
|
1627
|
+
});
|
|
1628
|
+
return () => {
|
|
1629
|
+
subscription.unsubscribe();
|
|
1630
|
+
};
|
|
1631
|
+
}, [eventName, service]);
|
|
1632
|
+
return { data, error };
|
|
1633
|
+
};
|
|
1634
|
+
function useTableService(options) {
|
|
1635
|
+
const { config: config2, data } = options;
|
|
1636
|
+
const builder = react.useMemo(() => {
|
|
1637
|
+
const tb = new core.TableBuilder(config2);
|
|
1638
|
+
tb.setData(data);
|
|
1639
|
+
return tb;
|
|
1640
|
+
}, [config2]);
|
|
1641
|
+
const [state, setState] = react.useState(() => builder.getState());
|
|
1642
|
+
const [selectedRows, setSelectedRows] = react.useState([]);
|
|
1643
|
+
const [allSelected, setAllSelected] = react.useState(false);
|
|
1644
|
+
react.useEffect(() => {
|
|
1645
|
+
const subscription = builder.stateChanged$.subscribe((newState) => {
|
|
1646
|
+
setState(newState);
|
|
1647
|
+
});
|
|
1648
|
+
return () => subscription.unsubscribe();
|
|
1649
|
+
}, [builder]);
|
|
1650
|
+
react.useEffect(() => {
|
|
1651
|
+
builder.setData(data);
|
|
1652
|
+
}, [builder, data]);
|
|
1653
|
+
const memoizedMethods = react.useMemo(() => ({
|
|
1654
|
+
toggleRowSelection: (rowId) => {
|
|
1655
|
+
setSelectedRows(
|
|
1656
|
+
(prev) => prev.includes(rowId) ? prev.filter((id) => id !== rowId) : [...prev, rowId]
|
|
1657
|
+
);
|
|
1658
|
+
},
|
|
1659
|
+
toggleAllSelection: () => {
|
|
1660
|
+
if (allSelected) {
|
|
1661
|
+
setSelectedRows([]);
|
|
1662
|
+
setAllSelected(false);
|
|
1663
|
+
} else {
|
|
1664
|
+
setSelectedRows(state.rows.map((row) => row.id || String(row)));
|
|
1665
|
+
setAllSelected(true);
|
|
1666
|
+
}
|
|
1667
|
+
},
|
|
1668
|
+
clearSelection: () => {
|
|
1669
|
+
setSelectedRows([]);
|
|
1670
|
+
setAllSelected(false);
|
|
1671
|
+
},
|
|
1672
|
+
setSort: (field, direction) => {
|
|
1673
|
+
builder.setSort(field, direction);
|
|
1674
|
+
},
|
|
1675
|
+
toggleSort: (field) => {
|
|
1676
|
+
builder.toggleSort(field);
|
|
1677
|
+
},
|
|
1678
|
+
setFilter: (field, value) => {
|
|
1679
|
+
builder.setFilter(field, value);
|
|
1680
|
+
},
|
|
1681
|
+
clearFilter: (field) => {
|
|
1682
|
+
builder.clearFilter(field);
|
|
1683
|
+
},
|
|
1684
|
+
clearAllFilters: () => {
|
|
1685
|
+
builder.clearAllFilters();
|
|
1686
|
+
},
|
|
1687
|
+
setPage: (page) => {
|
|
1688
|
+
builder.setPage(page);
|
|
1689
|
+
},
|
|
1690
|
+
setPageSize: (size) => {
|
|
1691
|
+
builder.setPageSize(size);
|
|
1692
|
+
},
|
|
1693
|
+
nextPage: () => {
|
|
1694
|
+
builder.nextPage();
|
|
1695
|
+
},
|
|
1696
|
+
prevPage: () => {
|
|
1697
|
+
builder.prevPage();
|
|
1698
|
+
}
|
|
1699
|
+
}), [builder, allSelected, state.rows]);
|
|
1700
|
+
const memoizedReturn = react.useMemo(() => ({
|
|
1701
|
+
rows: state.rows,
|
|
1702
|
+
selectedRows,
|
|
1703
|
+
allSelected,
|
|
1704
|
+
currentPage: state.currentPage,
|
|
1705
|
+
pageSize: state.pageSize,
|
|
1706
|
+
totalPages: state.totalPages,
|
|
1707
|
+
totalItems: state.totalItems,
|
|
1708
|
+
hasNextPage: state.hasNextPage,
|
|
1709
|
+
hasPrevPage: state.hasPrevPage,
|
|
1710
|
+
sortBy: state.sortBy,
|
|
1711
|
+
sortDirection: state.sortDirection,
|
|
1712
|
+
filters: state.filters,
|
|
1713
|
+
...memoizedMethods
|
|
1714
|
+
}), [state, selectedRows, allSelected, memoizedMethods]);
|
|
1715
|
+
return memoizedReturn;
|
|
1716
|
+
}
|
|
1717
|
+
class TabsService {
|
|
1718
|
+
constructor(config2) {
|
|
1719
|
+
this.config = config2;
|
|
1720
|
+
this.urlParam = config2.urlParam || "tab";
|
|
1721
|
+
this.tabsSubject = new rxjs.BehaviorSubject(config2.tabs);
|
|
1722
|
+
const initialTabId = this.getInitialTabId();
|
|
1723
|
+
this.activeTabSubject = new rxjs.BehaviorSubject(initialTabId);
|
|
1724
|
+
this.tabChangeSubject = new rxjs.BehaviorSubject(null);
|
|
1725
|
+
if (this.config.enableUrlRouting) {
|
|
1726
|
+
this.setupUrlRouting();
|
|
1727
|
+
}
|
|
1728
|
+
}
|
|
1729
|
+
/**
|
|
1730
|
+
* Get initial tab ID from URL or config
|
|
1731
|
+
*/
|
|
1732
|
+
getInitialTabId() {
|
|
1733
|
+
var _a;
|
|
1734
|
+
if (this.config.enableUrlRouting && typeof window !== "undefined") {
|
|
1735
|
+
const params = new URLSearchParams(window.location.search);
|
|
1736
|
+
const urlTabId = params.get(this.urlParam);
|
|
1737
|
+
if (urlTabId && this.config.tabs.some((t) => t.id === urlTabId)) {
|
|
1738
|
+
return urlTabId;
|
|
1739
|
+
}
|
|
1740
|
+
}
|
|
1741
|
+
return this.config.defaultTabId || ((_a = this.config.tabs[0]) == null ? void 0 : _a.id) || "";
|
|
1742
|
+
}
|
|
1743
|
+
/**
|
|
1744
|
+
* Setup URL routing listener
|
|
1745
|
+
*/
|
|
1746
|
+
setupUrlRouting() {
|
|
1747
|
+
if (typeof window === "undefined") return;
|
|
1748
|
+
const handleUrlChange = () => {
|
|
1749
|
+
const params = new URLSearchParams(window.location.search);
|
|
1750
|
+
const urlTabId = params.get(this.urlParam);
|
|
1751
|
+
if (urlTabId && urlTabId !== this.activeTabSubject.value) {
|
|
1752
|
+
this.setActiveTab(urlTabId);
|
|
1753
|
+
}
|
|
1754
|
+
};
|
|
1755
|
+
window.addEventListener("popstate", handleUrlChange);
|
|
1756
|
+
}
|
|
1757
|
+
/**
|
|
1758
|
+
* Update URL with current active tab
|
|
1759
|
+
*/
|
|
1760
|
+
updateUrl(tabId) {
|
|
1761
|
+
if (!this.config.enableUrlRouting || typeof window === "undefined") return;
|
|
1762
|
+
const params = new URLSearchParams(window.location.search);
|
|
1763
|
+
params.set(this.urlParam, tabId);
|
|
1764
|
+
const newUrl = `${window.location.pathname}?${params.toString()}`;
|
|
1765
|
+
window.history.pushState({ tab: tabId }, "", newUrl);
|
|
1766
|
+
}
|
|
1767
|
+
/**
|
|
1768
|
+
* Set active tab by ID
|
|
1769
|
+
*/
|
|
1770
|
+
setActiveTab(tabId) {
|
|
1771
|
+
const tab = this.config.tabs.find((t) => t.id === tabId);
|
|
1772
|
+
if (!tab || tab.disabled) return;
|
|
1773
|
+
const previousTabId = this.activeTabSubject.value;
|
|
1774
|
+
this.activeTabSubject.next(tabId);
|
|
1775
|
+
if (this.config.enableUrlRouting) {
|
|
1776
|
+
this.updateUrl(tabId);
|
|
1777
|
+
}
|
|
1778
|
+
this.tabChangeSubject.next({
|
|
1779
|
+
previousTabId,
|
|
1780
|
+
currentTabId: tabId,
|
|
1781
|
+
tab
|
|
1782
|
+
});
|
|
1783
|
+
}
|
|
1784
|
+
/**
|
|
1785
|
+
* Set active tab by index
|
|
1786
|
+
*/
|
|
1787
|
+
setActiveTabByIndex(index) {
|
|
1788
|
+
const tab = this.config.tabs[index];
|
|
1789
|
+
if (tab) {
|
|
1790
|
+
this.setActiveTab(tab.id);
|
|
1791
|
+
}
|
|
1792
|
+
}
|
|
1793
|
+
/**
|
|
1794
|
+
* Get active tab ID
|
|
1795
|
+
*/
|
|
1796
|
+
getActiveTabId() {
|
|
1797
|
+
return this.activeTabSubject.value;
|
|
1798
|
+
}
|
|
1799
|
+
/**
|
|
1800
|
+
* Get active tab
|
|
1801
|
+
*/
|
|
1802
|
+
getActiveTab() {
|
|
1803
|
+
return this.config.tabs.find((t) => t.id === this.activeTabSubject.value);
|
|
1804
|
+
}
|
|
1805
|
+
/**
|
|
1806
|
+
* Get active tab index
|
|
1807
|
+
*/
|
|
1808
|
+
getActiveTabIndex() {
|
|
1809
|
+
return this.config.tabs.findIndex((t) => t.id === this.activeTabSubject.value);
|
|
1810
|
+
}
|
|
1811
|
+
/**
|
|
1812
|
+
* Get all tabs
|
|
1813
|
+
*/
|
|
1814
|
+
getTabs() {
|
|
1815
|
+
return this.tabsSubject.value;
|
|
1816
|
+
}
|
|
1817
|
+
/**
|
|
1818
|
+
* Observable of active tab ID
|
|
1819
|
+
*/
|
|
1820
|
+
getActiveTabId$() {
|
|
1821
|
+
return this.activeTabSubject.asObservable().pipe(operators.distinctUntilChanged());
|
|
1822
|
+
}
|
|
1823
|
+
/**
|
|
1824
|
+
* Observable of active tab
|
|
1825
|
+
*/
|
|
1826
|
+
getActiveTab$() {
|
|
1827
|
+
return this.activeTabSubject.asObservable().pipe(
|
|
1828
|
+
operators.distinctUntilChanged(),
|
|
1829
|
+
operators.map((tabId) => this.config.tabs.find((t) => t.id === tabId))
|
|
1830
|
+
);
|
|
1831
|
+
}
|
|
1832
|
+
/**
|
|
1833
|
+
* Observable of tab change events
|
|
1834
|
+
*/
|
|
1835
|
+
onTabChange$() {
|
|
1836
|
+
return this.tabChangeSubject.asObservable();
|
|
1837
|
+
}
|
|
1838
|
+
/**
|
|
1839
|
+
* Observable of all tabs
|
|
1840
|
+
*/
|
|
1841
|
+
getTabs$() {
|
|
1842
|
+
return this.tabsSubject.asObservable().pipe(operators.distinctUntilChanged());
|
|
1843
|
+
}
|
|
1844
|
+
/**
|
|
1845
|
+
* Update tabs
|
|
1846
|
+
*/
|
|
1847
|
+
updateTabs(tabs) {
|
|
1848
|
+
var _a;
|
|
1849
|
+
this.config.tabs = tabs;
|
|
1850
|
+
this.tabsSubject.next(tabs);
|
|
1851
|
+
if (!tabs.find((t) => t.id === this.activeTabSubject.value)) {
|
|
1852
|
+
const newActiveTabId = ((_a = tabs[0]) == null ? void 0 : _a.id) || "";
|
|
1853
|
+
this.setActiveTab(newActiveTabId);
|
|
1854
|
+
}
|
|
1855
|
+
}
|
|
1856
|
+
/**
|
|
1857
|
+
* Add a tab
|
|
1858
|
+
*/
|
|
1859
|
+
addTab(tab, index) {
|
|
1860
|
+
const tabs = [...this.config.tabs];
|
|
1861
|
+
if (index !== void 0) {
|
|
1862
|
+
tabs.splice(index, 0, tab);
|
|
1863
|
+
} else {
|
|
1864
|
+
tabs.push(tab);
|
|
1865
|
+
}
|
|
1866
|
+
this.updateTabs(tabs);
|
|
1867
|
+
}
|
|
1868
|
+
/**
|
|
1869
|
+
* Remove a tab
|
|
1870
|
+
*/
|
|
1871
|
+
removeTab(tabId) {
|
|
1872
|
+
const tabs = this.config.tabs.filter((t) => t.id !== tabId);
|
|
1873
|
+
this.updateTabs(tabs);
|
|
1874
|
+
}
|
|
1875
|
+
/**
|
|
1876
|
+
* Enable/disable a tab
|
|
1877
|
+
*/
|
|
1878
|
+
setTabDisabled(tabId, disabled) {
|
|
1879
|
+
const tabs = this.config.tabs.map(
|
|
1880
|
+
(t) => t.id === tabId ? { ...t, disabled } : t
|
|
1881
|
+
);
|
|
1882
|
+
this.updateTabs(tabs);
|
|
1883
|
+
if (disabled && this.activeTabSubject.value === tabId) {
|
|
1884
|
+
const enabledTab = tabs.find((t) => !t.disabled);
|
|
1885
|
+
if (enabledTab) {
|
|
1886
|
+
this.setActiveTab(enabledTab.id);
|
|
1887
|
+
}
|
|
1888
|
+
}
|
|
1889
|
+
}
|
|
1890
|
+
/**
|
|
1891
|
+
* Update tab badge
|
|
1892
|
+
*/
|
|
1893
|
+
setTabBadge(tabId, badge) {
|
|
1894
|
+
const tabs = this.config.tabs.map(
|
|
1895
|
+
(t) => t.id === tabId ? { ...t, badge } : t
|
|
1896
|
+
);
|
|
1897
|
+
this.updateTabs(tabs);
|
|
1898
|
+
}
|
|
1899
|
+
/**
|
|
1900
|
+
* Move to next tab
|
|
1901
|
+
*/
|
|
1902
|
+
nextTab() {
|
|
1903
|
+
const currentIndex = this.getActiveTabIndex();
|
|
1904
|
+
const nextIndex = (currentIndex + 1) % this.config.tabs.length;
|
|
1905
|
+
this.setActiveTabByIndex(nextIndex);
|
|
1906
|
+
}
|
|
1907
|
+
/**
|
|
1908
|
+
* Move to previous tab
|
|
1909
|
+
*/
|
|
1910
|
+
previousTab() {
|
|
1911
|
+
const currentIndex = this.getActiveTabIndex();
|
|
1912
|
+
const prevIndex = currentIndex === 0 ? this.config.tabs.length - 1 : currentIndex - 1;
|
|
1913
|
+
this.setActiveTabByIndex(prevIndex);
|
|
1914
|
+
}
|
|
1915
|
+
/**
|
|
1916
|
+
* Destroy service and cleanup
|
|
1917
|
+
*/
|
|
1918
|
+
destroy() {
|
|
1919
|
+
this.activeTabSubject.complete();
|
|
1920
|
+
this.tabsSubject.complete();
|
|
1921
|
+
this.tabChangeSubject.complete();
|
|
1922
|
+
}
|
|
1923
|
+
}
|
|
1924
|
+
const TabsContext = react.createContext(void 0);
|
|
1925
|
+
function TabsProvider({ config: config2, children }) {
|
|
1926
|
+
const [service] = react.useState(() => new TabsService(config2));
|
|
1927
|
+
const [activeTabId, setActiveTabId] = react.useState(() => service.getActiveTabId());
|
|
1928
|
+
const [tabs, setTabs] = react.useState(() => service.getTabs());
|
|
1929
|
+
react.useEffect(() => {
|
|
1930
|
+
const activeTabSubscription = service.getActiveTabId$().subscribe(setActiveTabId);
|
|
1931
|
+
const tabsSubscription = service.getTabs$().subscribe(setTabs);
|
|
1932
|
+
return () => {
|
|
1933
|
+
activeTabSubscription.unsubscribe();
|
|
1934
|
+
tabsSubscription.unsubscribe();
|
|
1935
|
+
};
|
|
1936
|
+
}, [service]);
|
|
1937
|
+
react.useEffect(() => {
|
|
1938
|
+
return () => {
|
|
1939
|
+
service.destroy();
|
|
1940
|
+
};
|
|
1941
|
+
}, [service]);
|
|
1942
|
+
return /* @__PURE__ */ jsxRuntime.jsx(TabsContext.Provider, { value: { service, activeTabId, tabs }, children });
|
|
1943
|
+
}
|
|
1944
|
+
function useTabsContext() {
|
|
1945
|
+
const context = react.useContext(TabsContext);
|
|
1946
|
+
if (!context) {
|
|
1947
|
+
throw new Error("useTabsContext must be used within a TabsProvider");
|
|
1948
|
+
}
|
|
1949
|
+
return context;
|
|
1950
|
+
}
|
|
1951
|
+
function useTabsService() {
|
|
1952
|
+
const { service } = useTabsContext();
|
|
1953
|
+
return service;
|
|
1954
|
+
}
|
|
1955
|
+
function useActiveTab() {
|
|
1956
|
+
const { service } = useTabsContext();
|
|
1957
|
+
const [activeTab, setActiveTab] = react.useState(() => service.getActiveTab());
|
|
1958
|
+
react.useEffect(() => {
|
|
1959
|
+
const subscription = service.getActiveTab$().subscribe(setActiveTab);
|
|
1960
|
+
return () => subscription.unsubscribe();
|
|
1961
|
+
}, [service]);
|
|
1962
|
+
return activeTab;
|
|
1963
|
+
}
|
|
1964
|
+
function useTabs() {
|
|
1965
|
+
const { tabs } = useTabsContext();
|
|
1966
|
+
return tabs;
|
|
1967
|
+
}
|
|
1968
|
+
function useTabChange() {
|
|
1969
|
+
const { service } = useTabsContext();
|
|
1970
|
+
const [changeEvent, setChangeEvent] = react.useState(null);
|
|
1971
|
+
react.useEffect(() => {
|
|
1972
|
+
const subscription = service.onTabChange$().subscribe(setChangeEvent);
|
|
1973
|
+
return () => subscription.unsubscribe();
|
|
1974
|
+
}, [service]);
|
|
1975
|
+
return changeEvent;
|
|
1976
|
+
}
|
|
1977
|
+
function useSetActiveTab() {
|
|
1978
|
+
const { service } = useTabsContext();
|
|
1979
|
+
return {
|
|
1980
|
+
setActiveTab: (tabId) => service.setActiveTab(tabId),
|
|
1981
|
+
setActiveTabByIndex: (index) => service.setActiveTabByIndex(index),
|
|
1982
|
+
nextTab: () => service.nextTab(),
|
|
1983
|
+
previousTab: () => service.previousTab()
|
|
1984
|
+
};
|
|
1985
|
+
}
|
|
1986
|
+
function ResponsiveTabs({
|
|
1987
|
+
className = "",
|
|
1988
|
+
tabClassName = "",
|
|
1989
|
+
activeTabClassName = "",
|
|
1990
|
+
selectClassName = "",
|
|
1991
|
+
breakpoint = 768,
|
|
1992
|
+
showBadges = true,
|
|
1993
|
+
icon = true
|
|
1994
|
+
}) {
|
|
1995
|
+
const [isMobile, setIsMobile] = react.useState(false);
|
|
1996
|
+
const activeTab = useActiveTab();
|
|
1997
|
+
const tabs = useTabs();
|
|
1998
|
+
const { setActiveTab } = useSetActiveTab();
|
|
1999
|
+
react.useEffect(() => {
|
|
2000
|
+
const handleResize = () => {
|
|
2001
|
+
setIsMobile(window.innerWidth < breakpoint);
|
|
2002
|
+
};
|
|
2003
|
+
handleResize();
|
|
2004
|
+
window.addEventListener("resize", handleResize);
|
|
2005
|
+
return () => {
|
|
2006
|
+
window.removeEventListener("resize", handleResize);
|
|
2007
|
+
};
|
|
2008
|
+
}, [breakpoint]);
|
|
2009
|
+
if (!activeTab) {
|
|
2010
|
+
return null;
|
|
2011
|
+
}
|
|
2012
|
+
return isMobile ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
2013
|
+
TabsSelect,
|
|
2014
|
+
{
|
|
2015
|
+
tabs,
|
|
2016
|
+
activeTabId: activeTab.id,
|
|
2017
|
+
onTabChange: setActiveTab,
|
|
2018
|
+
className: selectClassName
|
|
2019
|
+
}
|
|
2020
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
2021
|
+
TabsList,
|
|
2022
|
+
{
|
|
2023
|
+
tabs,
|
|
2024
|
+
activeTabId: activeTab.id,
|
|
2025
|
+
onTabChange: setActiveTab,
|
|
2026
|
+
className,
|
|
2027
|
+
tabClassName,
|
|
2028
|
+
activeTabClassName,
|
|
2029
|
+
showBadges,
|
|
2030
|
+
icon
|
|
2031
|
+
}
|
|
2032
|
+
);
|
|
2033
|
+
}
|
|
2034
|
+
function TabsList({
|
|
2035
|
+
tabs,
|
|
2036
|
+
activeTabId,
|
|
2037
|
+
onTabChange,
|
|
2038
|
+
className = "",
|
|
2039
|
+
tabClassName = "",
|
|
2040
|
+
activeTabClassName = "",
|
|
2041
|
+
showBadges = true,
|
|
2042
|
+
icon = true
|
|
2043
|
+
}) {
|
|
2044
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
2045
|
+
"div",
|
|
2046
|
+
{
|
|
2047
|
+
role: "tablist",
|
|
2048
|
+
className: `flex border-b border-gray-200 ${className}`,
|
|
2049
|
+
"aria-label": "Tabs",
|
|
2050
|
+
children: tabs.map((tab) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
2051
|
+
"button",
|
|
2052
|
+
{
|
|
2053
|
+
role: "tab",
|
|
2054
|
+
"aria-selected": tab.id === activeTabId,
|
|
2055
|
+
"aria-controls": `tabpanel-${tab.id}`,
|
|
2056
|
+
id: `tab-${tab.id}`,
|
|
2057
|
+
onClick: () => !tab.disabled && onTabChange(tab.id),
|
|
2058
|
+
disabled: tab.disabled,
|
|
2059
|
+
className: `
|
|
2060
|
+
relative px-4 py-2 text-sm font-medium transition-colors
|
|
2061
|
+
${tab.disabled ? "text-gray-400 cursor-not-allowed" : "text-gray-700 hover:text-gray-900"}
|
|
2062
|
+
${tab.id === activeTabId ? `text-blue-600 border-b-2 border-blue-600 ${activeTabClassName}` : ""}
|
|
2063
|
+
${tabClassName}
|
|
2064
|
+
`,
|
|
2065
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
2066
|
+
icon && tab.icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-lg", children: tab.icon }),
|
|
2067
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: tab.label }),
|
|
2068
|
+
showBadges && tab.badge && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-1 inline-flex items-center justify-center px-2 py-1 text-xs font-semibold leading-none text-white transform translate-y-px bg-red-600 rounded-full", children: tab.badge })
|
|
2069
|
+
] })
|
|
2070
|
+
},
|
|
2071
|
+
tab.id
|
|
2072
|
+
))
|
|
2073
|
+
}
|
|
2074
|
+
);
|
|
2075
|
+
}
|
|
2076
|
+
function TabsSelect({
|
|
2077
|
+
tabs,
|
|
2078
|
+
activeTabId,
|
|
2079
|
+
onTabChange,
|
|
2080
|
+
className = ""
|
|
2081
|
+
}) {
|
|
2082
|
+
tabs.find((t) => t.id === activeTabId);
|
|
2083
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: `w-full ${className}`, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
2084
|
+
"select",
|
|
2085
|
+
{
|
|
2086
|
+
value: activeTabId,
|
|
2087
|
+
onChange: (e) => onTabChange(e.target.value),
|
|
2088
|
+
"aria-label": "Select a tab",
|
|
2089
|
+
className: `
|
|
2090
|
+
w-full px-3 py-2 text-sm font-medium border border-gray-300 rounded-md
|
|
2091
|
+
bg-white text-gray-900 hover:border-gray-400 focus:outline-none focus:ring-2
|
|
2092
|
+
focus:ring-blue-500 focus:ring-offset-0
|
|
2093
|
+
`,
|
|
2094
|
+
children: tabs.map((tab) => /* @__PURE__ */ jsxRuntime.jsxs("option", { value: tab.id, disabled: tab.disabled, children: [
|
|
2095
|
+
tab.label,
|
|
2096
|
+
" ",
|
|
2097
|
+
tab.badge ? `(${tab.badge})` : ""
|
|
2098
|
+
] }, tab.id))
|
|
2099
|
+
}
|
|
2100
|
+
) });
|
|
2101
|
+
}
|
|
2102
|
+
exports.LiveUpdateProvider = LiveUpdateProvider;
|
|
2103
|
+
exports.ResponsiveTabs = ResponsiveTabs;
|
|
2104
|
+
exports.TabsList = TabsList;
|
|
2105
|
+
exports.TabsProvider = TabsProvider;
|
|
2106
|
+
exports.TabsSelect = TabsSelect;
|
|
2107
|
+
exports.useActiveTab = useActiveTab;
|
|
2108
|
+
exports.useFiltersAndSort = useFiltersAndSort;
|
|
2109
|
+
exports.useFormBuilder = useFormBuilder;
|
|
2110
|
+
exports.useLiveListener = useLiveListener;
|
|
2111
|
+
exports.useLiveRequest = useLiveRequest;
|
|
2112
|
+
exports.useLiveUpdateContext = useLiveUpdateContext;
|
|
2113
|
+
exports.useLiveUpdateListener = useLiveUpdateListener;
|
|
2114
|
+
exports.useLiveUpdates = useLiveUpdates;
|
|
2115
|
+
exports.useSetActiveTab = useSetActiveTab;
|
|
2116
|
+
exports.useTabChange = useTabChange;
|
|
2117
|
+
exports.useTableService = useTableService;
|
|
2118
|
+
exports.useTabs = useTabs;
|
|
2119
|
+
exports.useTabsContext = useTabsContext;
|
|
2120
|
+
exports.useTabsService = useTabsService;
|
|
2121
|
+
//# sourceMappingURL=index.cjs.map
|