stream-chat-angular 6.0.0-beta.5 → 6.0.0-rc.2
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/README.md +2 -2
- package/assets/i18n/en.d.ts +0 -1
- package/assets/version.d.ts +1 -1
- package/{esm2022 → esm2020}/assets/i18n/en.mjs +1 -2
- package/{esm2022 → esm2020}/assets/version.mjs +2 -2
- package/esm2020/lib/attachment-configuration.service.mjs +182 -0
- package/esm2020/lib/attachment-list/attachment-list.component.mjs +232 -0
- package/esm2020/lib/attachment-preview-list/attachment-preview-list.component.mjs +55 -0
- package/esm2020/lib/attachment.service.mjs +481 -0
- package/esm2020/lib/avatar/avatar.component.mjs +160 -0
- package/esm2020/lib/avatar-placeholder/avatar-placeholder.component.mjs +66 -0
- package/esm2020/lib/channel/channel.component.mjs +45 -0
- package/esm2020/lib/channel-header/channel-header.component.mjs +72 -0
- package/esm2020/lib/channel-list/channel-list.component.mjs +47 -0
- package/esm2020/lib/channel-preview/channel-preview.component.mjs +155 -0
- package/esm2020/lib/channel-query.mjs +77 -0
- package/esm2020/lib/channel.service.mjs +1561 -0
- package/esm2020/lib/chat-client.service.mjs +233 -0
- package/esm2020/lib/custom-templates.service.mjs +244 -0
- package/{esm2022 → esm2020}/lib/date-parser.service.mjs +5 -5
- package/esm2020/lib/file-utils.mjs +35 -0
- package/{esm2022 → esm2020}/lib/get-channel-display-text.mjs +1 -1
- package/esm2020/lib/get-message-translation.mjs +12 -0
- package/esm2020/lib/icon/icon-placeholder/icon-placeholder.component.mjs +28 -0
- package/{esm2022 → esm2020}/lib/icon/icon.component.mjs +5 -5
- package/{esm2022 → esm2020}/lib/icon/icon.module.mjs +11 -11
- package/{esm2022 → esm2020}/lib/icon/loading-indicator/loading-indicator.component.mjs +5 -5
- package/esm2020/lib/icon/loading-indicator-placeholder/loading-indicator-placeholder.component.mjs +20 -0
- package/{esm2022 → esm2020}/lib/list-users.mjs +1 -1
- package/esm2020/lib/message/message.component.mjs +486 -0
- package/esm2020/lib/message-actions-box/message-actions-box.component.mjs +123 -0
- package/esm2020/lib/message-actions.service.mjs +187 -0
- package/esm2020/lib/message-bounce-prompt/message-bounce-prompt.component.mjs +71 -0
- package/esm2020/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.mjs +333 -0
- package/{esm2022 → esm2020}/lib/message-input/emoji-input.service.mjs +7 -7
- package/esm2020/lib/message-input/message-input-config.service.mjs +50 -0
- package/esm2020/lib/message-input/message-input.component.mjs +507 -0
- package/{esm2022 → esm2020}/lib/message-input/textarea/textarea.component.mjs +6 -6
- package/{esm2022 → esm2020}/lib/message-input/textarea.directive.mjs +5 -5
- package/{esm2022 → esm2020}/lib/message-input/voice-recorder.service.mjs +5 -5
- package/{esm2022 → esm2020}/lib/message-list/group-styles.mjs +1 -1
- package/esm2020/lib/message-list/message-list.component.mjs +717 -0
- package/esm2020/lib/message-preview.mjs +21 -0
- package/esm2020/lib/message-reactions/message-reactions.component.mjs +168 -0
- package/esm2020/lib/message-reactions-selector/message-reactions-selector.component.mjs +61 -0
- package/{esm2022 → esm2020}/lib/message-reactions.service.mjs +6 -6
- package/esm2020/lib/message-text/message-text.component.mjs +143 -0
- package/esm2020/lib/message.service.mjs +43 -0
- package/{esm2022 → esm2020}/lib/modal/modal.component.mjs +6 -6
- package/esm2020/lib/notification/notification.component.mjs +20 -0
- package/esm2020/lib/notification-list/notification-list.component.mjs +36 -0
- package/{esm2022 → esm2020}/lib/notification.service.mjs +6 -6
- package/esm2020/lib/paginated-list/paginated-list.component.mjs +94 -0
- package/{esm2022 → esm2020}/lib/parse-date.mjs +1 -1
- package/esm2020/lib/read-by.mjs +12 -0
- package/esm2020/lib/stream-autocomplete-textarea.module.mjs +33 -0
- package/{esm2022 → esm2020}/lib/stream-avatar.module.mjs +5 -5
- package/{esm2022 → esm2020}/lib/stream-chat.module.mjs +59 -59
- package/{esm2022 → esm2020}/lib/stream-i18n.service.mjs +6 -6
- package/esm2020/lib/stream-textarea.module.mjs +31 -0
- package/{esm2022 → esm2020}/lib/theme.service.mjs +6 -6
- package/esm2020/lib/thread/thread.component.mjs +51 -0
- package/{esm2022 → esm2020}/lib/transliteration.service.mjs +5 -5
- package/esm2020/lib/types-custom.mjs +2 -0
- package/esm2020/lib/types.mjs +2 -0
- package/esm2020/lib/user-list/user-list.component.mjs +47 -0
- package/esm2020/lib/virtualized-list.service.mjs +271 -0
- package/{esm2022 → esm2020}/lib/virtualized-message-list.service.mjs +1 -1
- package/{esm2022 → esm2020}/lib/voice-recorder/amplitude-recorder.service.mjs +5 -5
- package/{esm2022 → esm2020}/lib/voice-recorder/audio-recorder.service.mjs +5 -5
- package/{esm2022 → esm2020}/lib/voice-recorder/media-recorder.mjs +1 -1
- package/esm2020/lib/voice-recorder/mp3-transcoder.mjs +61 -0
- package/esm2020/lib/voice-recorder/transcoder.service.mjs +121 -0
- package/esm2020/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.mjs +35 -0
- package/esm2020/lib/voice-recorder/voice-recorder.component.mjs +80 -0
- package/{esm2022 → esm2020}/lib/voice-recorder/voice-recorder.module.mjs +9 -9
- package/esm2020/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs +112 -0
- package/esm2020/lib/voice-recording/voice-recording.component.mjs +91 -0
- package/{esm2022 → esm2020}/lib/voice-recording/voice-recording.module.mjs +5 -5
- package/{esm2022 → esm2020}/lib/wave-form-sampler.mjs +1 -1
- package/esm2020/public-api.mjs +86 -0
- package/esm2020/stream-chat.mjs +2 -0
- package/fesm2015/stream-chat-angular.mjs +9171 -0
- package/fesm2015/stream-chat-angular.mjs.map +1 -0
- package/{fesm2022 → fesm2020}/stream-chat-angular.mjs +1251 -961
- package/fesm2020/stream-chat-angular.mjs.map +1 -0
- package/lib/attachment-configuration.service.d.ts +12 -12
- package/lib/attachment-list/attachment-list.component.d.ts +15 -10
- package/lib/attachment-preview-list/attachment-preview-list.component.d.ts +1 -1
- package/lib/attachment.service.d.ts +12 -10
- package/lib/avatar/avatar.component.d.ts +7 -7
- package/lib/avatar-placeholder/avatar-placeholder.component.d.ts +5 -5
- package/lib/channel/channel.component.d.ts +1 -1
- package/lib/channel-header/channel-header.component.d.ts +2 -2
- package/lib/channel-list/channel-list.component.d.ts +3 -4
- package/lib/channel-preview/channel-preview.component.d.ts +6 -6
- package/lib/channel-query.d.ts +26 -0
- package/lib/channel.service.d.ts +146 -154
- package/lib/chat-client.service.d.ts +17 -15
- package/lib/custom-templates.service.d.ts +50 -50
- package/lib/get-channel-display-text.d.ts +1 -2
- package/lib/get-message-translation.d.ts +3 -3
- package/lib/icon/icon-placeholder/icon-placeholder.component.d.ts +2 -2
- package/lib/icon/icon.component.d.ts +2 -2
- package/lib/icon/loading-indicator-placeholder/loading-indicator-placeholder.component.d.ts +1 -1
- package/lib/message/message.component.d.ts +6 -6
- package/lib/message-actions-box/message-actions-box.component.d.ts +5 -4
- package/lib/message-actions.service.d.ts +10 -10
- package/lib/message-bounce-prompt/message-bounce-prompt.component.d.ts +1 -1
- package/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.d.ts +5 -5
- package/lib/message-input/emoji-input.service.d.ts +2 -2
- package/lib/message-input/message-input-config.service.d.ts +3 -3
- package/lib/message-input/message-input.component.d.ts +10 -33
- package/lib/message-input/textarea/textarea.component.d.ts +3 -3
- package/lib/message-input/textarea.directive.d.ts +1 -1
- package/lib/message-list/group-styles.d.ts +1 -1
- package/lib/message-list/message-list.component.d.ts +3 -2
- package/lib/message-preview.d.ts +2 -3
- package/lib/message-reactions/message-reactions.component.d.ts +9 -8
- package/lib/message-reactions-selector/message-reactions-selector.component.d.ts +6 -5
- package/lib/message-reactions.service.d.ts +4 -4
- package/lib/message-text/message-text.component.d.ts +5 -5
- package/lib/message.service.d.ts +6 -7
- package/lib/modal/modal.component.d.ts +1 -1
- package/lib/notification/notification.component.d.ts +2 -2
- package/lib/notification-list/notification-list.component.d.ts +1 -0
- package/lib/notification.service.d.ts +1 -1
- package/lib/paginated-list/paginated-list.component.d.ts +2 -5
- package/lib/read-by.d.ts +1 -2
- package/lib/stream-i18n.service.d.ts +1 -1
- package/lib/theme.service.d.ts +1 -1
- package/lib/thread/thread.component.d.ts +3 -3
- package/lib/types-custom.d.ts +15 -0
- package/lib/types.d.ts +116 -155
- package/lib/user-list/user-list.component.d.ts +2 -3
- package/lib/virtualized-message-list.service.d.ts +1 -1
- package/lib/voice-recorder/amplitude-recorder.service.d.ts +2 -2
- package/lib/voice-recorder/media-recorder.d.ts +2 -2
- package/lib/voice-recorder/transcoder.service.d.ts +4 -4
- package/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.d.ts +1 -0
- package/lib/voice-recorder/voice-recorder.component.d.ts +2 -2
- package/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.d.ts +3 -3
- package/lib/voice-recording/voice-recording.component.d.ts +2 -3
- package/package.json +21 -15
- package/public-api.d.ts +3 -0
- package/src/assets/i18n/en.ts +0 -1
- package/src/assets/version.ts +1 -1
- package/esm2022/lib/attachment-configuration.service.mjs +0 -185
- package/esm2022/lib/attachment-list/attachment-list.component.mjs +0 -212
- package/esm2022/lib/attachment-preview-list/attachment-preview-list.component.mjs +0 -55
- package/esm2022/lib/attachment.service.mjs +0 -479
- package/esm2022/lib/avatar/avatar.component.mjs +0 -157
- package/esm2022/lib/avatar-placeholder/avatar-placeholder.component.mjs +0 -66
- package/esm2022/lib/channel/channel.component.mjs +0 -45
- package/esm2022/lib/channel-header/channel-header.component.mjs +0 -72
- package/esm2022/lib/channel-list/channel-list.component.mjs +0 -50
- package/esm2022/lib/channel-preview/channel-preview.component.mjs +0 -150
- package/esm2022/lib/channel.service.mjs +0 -1393
- package/esm2022/lib/chat-client.service.mjs +0 -227
- package/esm2022/lib/custom-templates.service.mjs +0 -244
- package/esm2022/lib/file-utils.mjs +0 -35
- package/esm2022/lib/get-message-translation.mjs +0 -12
- package/esm2022/lib/icon/icon-placeholder/icon-placeholder.component.mjs +0 -28
- package/esm2022/lib/icon/loading-indicator-placeholder/loading-indicator-placeholder.component.mjs +0 -20
- package/esm2022/lib/message/message.component.mjs +0 -486
- package/esm2022/lib/message-actions-box/message-actions-box.component.mjs +0 -120
- package/esm2022/lib/message-actions.service.mjs +0 -187
- package/esm2022/lib/message-bounce-prompt/message-bounce-prompt.component.mjs +0 -71
- package/esm2022/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.mjs +0 -333
- package/esm2022/lib/message-input/message-input-config.service.mjs +0 -50
- package/esm2022/lib/message-input/message-input.component.mjs +0 -507
- package/esm2022/lib/message-list/message-list.component.mjs +0 -715
- package/esm2022/lib/message-preview.mjs +0 -21
- package/esm2022/lib/message-reactions/message-reactions.component.mjs +0 -165
- package/esm2022/lib/message-reactions-selector/message-reactions-selector.component.mjs +0 -57
- package/esm2022/lib/message-text/message-text.component.mjs +0 -143
- package/esm2022/lib/message.service.mjs +0 -43
- package/esm2022/lib/notification/notification.component.mjs +0 -20
- package/esm2022/lib/notification-list/notification-list.component.mjs +0 -33
- package/esm2022/lib/paginated-list/paginated-list.component.mjs +0 -94
- package/esm2022/lib/read-by.mjs +0 -12
- package/esm2022/lib/stream-autocomplete-textarea.module.mjs +0 -33
- package/esm2022/lib/stream-textarea.module.mjs +0 -31
- package/esm2022/lib/thread/thread.component.mjs +0 -51
- package/esm2022/lib/types.mjs +0 -2
- package/esm2022/lib/user-list/user-list.component.mjs +0 -47
- package/esm2022/lib/virtualized-list.service.mjs +0 -273
- package/esm2022/lib/voice-recorder/mp3-transcoder.mjs +0 -61
- package/esm2022/lib/voice-recorder/transcoder.service.mjs +0 -121
- package/esm2022/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.mjs +0 -32
- package/esm2022/lib/voice-recorder/voice-recorder.component.mjs +0 -80
- package/esm2022/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs +0 -112
- package/esm2022/lib/voice-recording/voice-recording.component.mjs +0 -91
- package/esm2022/public-api.mjs +0 -82
- package/fesm2022/stream-chat-angular.mjs.map +0 -1
- /package/{esm2022 → esm2020}/lib/format-duration.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/injection-tokens.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/is-image-attachment.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/is-on-separate-date.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/is-safari.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/message-input/textarea.interface.mjs +0 -0
- /package/{esm2022 → esm2020}/stream-chat-angular.mjs +0 -0
|
@@ -1,273 +0,0 @@
|
|
|
1
|
-
import { BehaviorSubject, Subject, combineLatest, distinctUntilChanged, filter, merge, of, pairwise, switchMap, take, } from 'rxjs';
|
|
2
|
-
/**
|
|
3
|
-
* The `VirtualizedListService` removes items from a list that are not currently displayed. This is a high-level overview of how it works:
|
|
4
|
-
* - Create a new instance for each list that needs virtualization
|
|
5
|
-
* - Input: Provide a reactive stream that emits all items in the list
|
|
6
|
-
* - Input: Provide a reactive stream that emit the current scroll position (top, middle or bottom)
|
|
7
|
-
* - Input: maximum number of items that are allowed in the list (in practice the service can make the virtualized list half this number, you should take this into account when choosing the value)
|
|
8
|
-
* - Output: The service will emit the current list of displayed items via the virtualized items reactive stream
|
|
9
|
-
* - For simplicity, the service won't track the height of the items, nor it needs an exact scroll location -> this is how removing items work:
|
|
10
|
-
* - If scroll location is bottom/top items around the current bottom/top item will be emitted in the virtualized items stream
|
|
11
|
-
* - If scroll location is middle, the service won't remove items, if new items are received, those will be appended to the virtualized list (this means that in theory the list can grow very big if a lot of new items are received while the user is scrolled somewhere, this is a trade-off for the simplicity of no height tracking)
|
|
12
|
-
* - Since there is no height tracking, you should make sure to provide a maximum number that is big enough to fill the biggest expected screen size twice
|
|
13
|
-
* - If the user scrolls to the bottom/top and there are no more local items to show, the service will trigger a query to load more items
|
|
14
|
-
* - Input: you should provide the page size to use, in order for the service to determine if loading is necessary
|
|
15
|
-
*
|
|
16
|
-
* The `VirtualizedMessageListService` provides an implementation for the message list component.
|
|
17
|
-
*/
|
|
18
|
-
export class VirtualizedListService {
|
|
19
|
-
constructor(allItems$, scrollPosition$, jumpToItem$, pageSize = 25, maxItemCount = pageSize * 4) {
|
|
20
|
-
this.allItems$ = allItems$;
|
|
21
|
-
this.scrollPosition$ = scrollPosition$;
|
|
22
|
-
this.jumpToItem$ = jumpToItem$;
|
|
23
|
-
this.pageSize = pageSize;
|
|
24
|
-
this.maxItemCount = maxItemCount;
|
|
25
|
-
this.queryStateSubject = new BehaviorSubject({
|
|
26
|
-
state: 'success',
|
|
27
|
-
});
|
|
28
|
-
this.bufferOnTop = 0;
|
|
29
|
-
this.bufferOnBottom = 0;
|
|
30
|
-
this.loadFromBuffer$ = new Subject();
|
|
31
|
-
this.virtualizedItemsSubject = new BehaviorSubject([]);
|
|
32
|
-
this.subscriptions = [];
|
|
33
|
-
this.virtualizedItems$ = this.virtualizedItemsSubject.asObservable();
|
|
34
|
-
this.queryState$ = this.queryStateSubject.asObservable();
|
|
35
|
-
this.subscriptions.push(this.virtualizedItems$.subscribe((virtaluzedItems) => {
|
|
36
|
-
this.allItems$.pipe(take(1)).subscribe((allItems) => {
|
|
37
|
-
if (virtaluzedItems.length === allItems.length) {
|
|
38
|
-
this.bufferOnTop = 0;
|
|
39
|
-
this.bufferOnBottom = 0;
|
|
40
|
-
}
|
|
41
|
-
else if (virtaluzedItems.length === 0) {
|
|
42
|
-
this.bufferOnTop = allItems.length;
|
|
43
|
-
this.bufferOnBottom = 0;
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
this.bufferOnTop = allItems.indexOf(virtaluzedItems[0]);
|
|
47
|
-
this.bufferOnBottom =
|
|
48
|
-
allItems.length -
|
|
49
|
-
allItems.indexOf(virtaluzedItems[virtaluzedItems.length - 1]) -
|
|
50
|
-
1;
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
}));
|
|
54
|
-
this.subscriptions.push(merge(this.allItems$, this.loadFromBuffer$)
|
|
55
|
-
.pipe(switchMap(() => {
|
|
56
|
-
return combineLatest([
|
|
57
|
-
this.allItems$.pipe(take(1)),
|
|
58
|
-
this.scrollPosition$.pipe(take(1)),
|
|
59
|
-
]);
|
|
60
|
-
}))
|
|
61
|
-
.subscribe(([items, scrollPosition]) => {
|
|
62
|
-
if (scrollPosition === 'middle') {
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
const currentItems = this.virtualizedItemsSubject.getValue();
|
|
66
|
-
if (items.length <= this.maxItemCount) {
|
|
67
|
-
this.virtualizedItemsSubject.next(items);
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
let startIndex = 0;
|
|
71
|
-
let endIndex = undefined;
|
|
72
|
-
const numberOfItemsToRemove = items.length - Math.round(this.maxItemCount / 2);
|
|
73
|
-
const numberOfItemsAfterRemove = items.length - numberOfItemsToRemove;
|
|
74
|
-
switch (scrollPosition) {
|
|
75
|
-
case 'top':
|
|
76
|
-
if (currentItems.length > 0) {
|
|
77
|
-
const middleIndex = items.findIndex((i) => this.isEqual(i, currentItems[0]));
|
|
78
|
-
if (middleIndex !== -1) {
|
|
79
|
-
startIndex = Math.max(0, middleIndex - Math.ceil(numberOfItemsAfterRemove / 2));
|
|
80
|
-
endIndex = startIndex + numberOfItemsAfterRemove;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
endIndex = numberOfItemsAfterRemove;
|
|
85
|
-
}
|
|
86
|
-
break;
|
|
87
|
-
case 'bottom':
|
|
88
|
-
if (currentItems.length > 0) {
|
|
89
|
-
const middleIndex = items.findIndex((i) => this.isEqual(i, currentItems[currentItems.length - 1]));
|
|
90
|
-
if (middleIndex !== -1) {
|
|
91
|
-
endIndex = Math.min(items.length, middleIndex +
|
|
92
|
-
Math.floor(numberOfItemsAfterRemove / 2) +
|
|
93
|
-
1);
|
|
94
|
-
startIndex = endIndex - numberOfItemsAfterRemove;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
startIndex = items.length - numberOfItemsAfterRemove;
|
|
99
|
-
}
|
|
100
|
-
break;
|
|
101
|
-
}
|
|
102
|
-
const virtualizedItems = items.slice(startIndex, endIndex);
|
|
103
|
-
this.virtualizedItemsSubject.next(virtualizedItems);
|
|
104
|
-
}
|
|
105
|
-
}));
|
|
106
|
-
this.subscriptions.push(this.scrollPosition$
|
|
107
|
-
.pipe(distinctUntilChanged())
|
|
108
|
-
.subscribe((position) => {
|
|
109
|
-
if (this.queryStateSubject.getValue().state === `loading-${position}`) {
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
if (position === 'top') {
|
|
113
|
-
if (this.bufferOnTop < this.pageSize) {
|
|
114
|
-
void this.loadMore(position);
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
this.loadMoreFromBuffer('top');
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
else if (position === 'bottom') {
|
|
121
|
-
if (this.bufferOnBottom < this.pageSize) {
|
|
122
|
-
void this.loadMore(position);
|
|
123
|
-
}
|
|
124
|
-
else {
|
|
125
|
-
this.loadMoreFromBuffer('bottom');
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
}));
|
|
129
|
-
this.subscriptions.push(this.allItems$
|
|
130
|
-
.pipe(pairwise(), filter(() => {
|
|
131
|
-
let scrollPosition;
|
|
132
|
-
this.scrollPosition$
|
|
133
|
-
.pipe(take(1))
|
|
134
|
-
.subscribe((s) => (scrollPosition = s));
|
|
135
|
-
return scrollPosition === 'middle';
|
|
136
|
-
}))
|
|
137
|
-
.subscribe(([prevItems, currentItems]) => {
|
|
138
|
-
if (currentItems.length < this.maxItemCount ||
|
|
139
|
-
this.virtualizedItems.length === 0) {
|
|
140
|
-
this.virtualizedItemsSubject.next(currentItems);
|
|
141
|
-
}
|
|
142
|
-
else {
|
|
143
|
-
const currentFirstItem = this.virtualizedItems[0];
|
|
144
|
-
const currentLastItem = this.virtualizedItems[this.virtualizedItems.length - 1];
|
|
145
|
-
const prevStartIndex = prevItems.findIndex((i) => this.isEqual(i, currentFirstItem));
|
|
146
|
-
const prevEndIndex = prevItems.findIndex((i) => this.isEqual(i, currentLastItem));
|
|
147
|
-
const isStartRemainedSame = currentItems[prevStartIndex]
|
|
148
|
-
? this.isEqual(currentItems[prevStartIndex], currentFirstItem)
|
|
149
|
-
: false;
|
|
150
|
-
const isEndRemainedSame = currentItems[prevEndIndex]
|
|
151
|
-
? this.isEqual(currentItems[prevEndIndex], currentLastItem)
|
|
152
|
-
: false;
|
|
153
|
-
const hasNewItemsBottom = prevEndIndex === prevItems.length - 1 && isEndRemainedSame
|
|
154
|
-
? prevItems.length !== currentItems.length
|
|
155
|
-
: false;
|
|
156
|
-
if (isStartRemainedSame && isEndRemainedSame) {
|
|
157
|
-
const endIndex = hasNewItemsBottom ? undefined : prevEndIndex + 1;
|
|
158
|
-
this.virtualizedItemsSubject.next(currentItems.slice(prevStartIndex, endIndex));
|
|
159
|
-
}
|
|
160
|
-
let currentStartIndex = isStartRemainedSame ? prevStartIndex : -1;
|
|
161
|
-
let currentEndIndex = isEndRemainedSame ? prevEndIndex : -1;
|
|
162
|
-
if (!isStartRemainedSame) {
|
|
163
|
-
currentStartIndex = currentItems.findIndex((i) => this.isEqual(i, currentFirstItem));
|
|
164
|
-
}
|
|
165
|
-
if (!isEndRemainedSame) {
|
|
166
|
-
currentEndIndex = currentItems.findIndex((i) => this.isEqual(i, currentLastItem));
|
|
167
|
-
}
|
|
168
|
-
const hasNewItemsTop = prevStartIndex === 0 && !isStartRemainedSame
|
|
169
|
-
? currentStartIndex !== 0
|
|
170
|
-
: false;
|
|
171
|
-
if (currentStartIndex !== -1 && currentEndIndex !== -1) {
|
|
172
|
-
const startIndex = hasNewItemsTop ? 0 : currentStartIndex;
|
|
173
|
-
this.virtualizedItemsSubject.next(currentItems.slice(startIndex, currentEndIndex + 1));
|
|
174
|
-
}
|
|
175
|
-
else {
|
|
176
|
-
if (currentStartIndex === -1 && currentEndIndex !== -1) {
|
|
177
|
-
currentStartIndex = Math.max(0, currentEndIndex - (prevEndIndex - prevStartIndex));
|
|
178
|
-
}
|
|
179
|
-
if (currentEndIndex === -1 && currentStartIndex !== -1) {
|
|
180
|
-
currentEndIndex = Math.min(currentItems.length - 1, currentStartIndex + (prevEndIndex - prevStartIndex));
|
|
181
|
-
}
|
|
182
|
-
this.virtualizedItemsSubject.next(currentItems.slice(currentStartIndex, currentEndIndex + 1));
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
}));
|
|
186
|
-
if (this.jumpToItem$) {
|
|
187
|
-
this.subscriptions.push(this.jumpToItem$
|
|
188
|
-
.pipe(switchMap((jumpToItem) => combineLatest([this.allItems$.pipe(take(1)), of(jumpToItem)])))
|
|
189
|
-
.subscribe(([allItems, jumpToItem]) => {
|
|
190
|
-
if (jumpToItem.item) {
|
|
191
|
-
if (allItems.length < this.maxItemCount) {
|
|
192
|
-
this.virtualizedItemsSubject.next(allItems);
|
|
193
|
-
}
|
|
194
|
-
else {
|
|
195
|
-
const itemIndex = allItems.findIndex((i) =>
|
|
196
|
-
// @ts-expect-error TODO: do we know a better typing here?
|
|
197
|
-
this.isEqual(i, jumpToItem.item));
|
|
198
|
-
if (itemIndex === -1) {
|
|
199
|
-
return;
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
const position = jumpToItem.position || 'middle';
|
|
203
|
-
const numberOfItemsToRemove = allItems.length - Math.round(this.maxItemCount / 2);
|
|
204
|
-
const numberOfItemsAfterRemove = allItems.length - numberOfItemsToRemove;
|
|
205
|
-
let startIndex = -1;
|
|
206
|
-
let endIndex = -1;
|
|
207
|
-
switch (position) {
|
|
208
|
-
case 'top':
|
|
209
|
-
startIndex = itemIndex;
|
|
210
|
-
endIndex = Math.min(allItems.length, startIndex + numberOfItemsAfterRemove);
|
|
211
|
-
break;
|
|
212
|
-
case 'bottom':
|
|
213
|
-
endIndex = itemIndex + 1;
|
|
214
|
-
startIndex = Math.max(0, endIndex - numberOfItemsAfterRemove);
|
|
215
|
-
break;
|
|
216
|
-
case 'middle': {
|
|
217
|
-
const itemsOnTop = itemIndex;
|
|
218
|
-
const itemsOnBottom = allItems.length - itemIndex;
|
|
219
|
-
if (itemsOnTop < Math.ceil(numberOfItemsAfterRemove / 2)) {
|
|
220
|
-
startIndex = 0;
|
|
221
|
-
}
|
|
222
|
-
if (itemsOnBottom <
|
|
223
|
-
Math.floor(numberOfItemsAfterRemove / 2) + 1) {
|
|
224
|
-
endIndex = allItems.length;
|
|
225
|
-
}
|
|
226
|
-
if (startIndex === -1) {
|
|
227
|
-
if (endIndex !== -1) {
|
|
228
|
-
startIndex = endIndex - numberOfItemsAfterRemove;
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
startIndex =
|
|
232
|
-
itemIndex - Math.ceil(numberOfItemsAfterRemove / 2);
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
if (endIndex === -1) {
|
|
236
|
-
endIndex = startIndex + numberOfItemsAfterRemove;
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
this.virtualizedItemsSubject.next(allItems.slice(startIndex, endIndex));
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
}));
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
/**
|
|
248
|
-
* The current value of virtualized items
|
|
249
|
-
*/
|
|
250
|
-
get virtualizedItems() {
|
|
251
|
-
return this.virtualizedItemsSubject.getValue();
|
|
252
|
-
}
|
|
253
|
-
/**
|
|
254
|
-
* Remove all subscriptions, call this once you're done using an instance of this service
|
|
255
|
-
*/
|
|
256
|
-
dispose() {
|
|
257
|
-
this.subscriptions.forEach((s) => s.unsubscribe());
|
|
258
|
-
}
|
|
259
|
-
loadMoreFromBuffer(_) {
|
|
260
|
-
this.loadFromBuffer$.next();
|
|
261
|
-
}
|
|
262
|
-
async loadMore(direction) {
|
|
263
|
-
this.queryStateSubject.next({ state: `loading-${direction}` });
|
|
264
|
-
try {
|
|
265
|
-
await this.query(direction);
|
|
266
|
-
this.queryStateSubject.next({ state: 'success' });
|
|
267
|
-
}
|
|
268
|
-
catch (e) {
|
|
269
|
-
this.queryStateSubject.next({ state: 'error', error: e });
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlydHVhbGl6ZWQtbGlzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL3ZpcnR1YWxpemVkLWxpc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZUFBZSxFQUVmLE9BQU8sRUFFUCxhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixLQUFLLEVBQ0wsRUFBRSxFQUNGLFFBQVEsRUFDUixTQUFTLEVBQ1QsSUFBSSxHQUNMLE1BQU0sTUFBTSxDQUFDO0FBUWQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxPQUFnQixzQkFBc0I7SUFrQjFDLFlBQ1UsU0FBMEIsRUFDMUIsZUFBMEQsRUFDbEQsV0FHZCxFQUNjLFdBQVcsRUFBRSxFQUNiLGVBQWUsUUFBUSxHQUFHLENBQUM7UUFQbkMsY0FBUyxHQUFULFNBQVMsQ0FBaUI7UUFDMUIsb0JBQWUsR0FBZixlQUFlLENBQTJDO1FBQ2xELGdCQUFXLEdBQVgsV0FBVyxDQUd6QjtRQUNjLGFBQVEsR0FBUixRQUFRLENBQUs7UUFDYixpQkFBWSxHQUFaLFlBQVksQ0FBZTtRQWpCbkMsc0JBQWlCLEdBQUcsSUFBSSxlQUFlLENBQTRCO1lBQzNFLEtBQUssRUFBRSxTQUFTO1NBQ2pCLENBQUMsQ0FBQztRQUNPLGdCQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLG1CQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLG9CQUFlLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUN4Qyw0QkFBdUIsR0FBRyxJQUFJLGVBQWUsQ0FBTSxFQUFFLENBQUMsQ0FBQztRQUN2RCxrQkFBYSxHQUFtQixFQUFFLENBQUM7UUFZekMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNyRSxJQUFJLENBQUMsV0FBVyxH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QUFDLHVCQUF1QixDQUFDLElBQUksQ0FDL0IsUUFBUSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQ3JDLENBQUM7eUJBQ0g7cUJBQ0Y7aUJBQ0Y7WUFDSCxDQUFDLENBQUMsQ0FDTCxDQUFDO1NBQ0g7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLGdCQUFnQjtRQUNsQixPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxPQUFPO1FBQ0wsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFUyxrQkFBa0IsQ0FBQyxDQUFnQztRQUMzRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFTyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQXdDO1FBQzdELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsV0FBVyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDL0QsSUFBSTtZQUNGLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7U0FDbkQ7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzNEO0lBQ0gsQ0FBQztDQU9GIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBPYnNlcnZhYmxlLFxuICBTdWJqZWN0LFxuICBTdWJzY3JpcHRpb24sXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIG1lcmdlLFxuICBvZixcbiAgcGFpcndpc2UsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBWaXJ0dWFsaXplZExpc3RRdWVyeURpcmVjdGlvbixcbiAgVmlydHVhbGl6ZWRMaXN0UXVlcnlTdGF0ZSxcbiAgVmlydHVhbGl6ZWRMaXN0U2Nyb2xsUG9zaXRpb24sXG4gIFZpcnR1YWxpemVkTGlzdFZlcnRpY2FsSXRlbVBvc2l0aW9uLFxufSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBUaGUgYFZpcnR1YWxpemVkTGlzdFNlcnZpY2VgIHJlbW92ZXMgaXRlbXMgZnJvbSBhIGxpc3QgdGhhdCBhcmUgbm90IGN1cnJlbnRseSBkaXNwbGF5ZWQuIFRoaXMgaXMgYSBoaWdoLWxldmVsIG92ZXJ2aWV3IG9mIGhvdyBpdCB3b3JrczpcbiAqIC0gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIGZvciBlYWNoIGxpc3QgdGhhdCBuZWVkcyB2aXJ0dWFsaXphdGlvblxuICogLSBJbnB1dDogUHJvdmlkZSBhIHJlYWN0aXZlIHN0cmVhbSB0aGF0IGVtaXRzIGFsbCBpdGVtcyBpbiB0aGUgbGlzdFxuICogLSBJbnB1dDogUHJvdmlkZSBhIHJlYWN0aXZlIHN0cmVhbSB0aGF0IGVtaXQgdGhlIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uICh0b3AsIG1pZGRsZSBvciBib3R0b20pXG4gKiAtIElucHV0OiBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0aGF0IGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IChpbiBwcmFjdGljZSB0aGUgc2VydmljZSBjYW4gbWFrZSB0aGUgdmlydHVhbGl6ZWQgbGlzdCBoYWxmIHRoaXMgbnVtYmVyLCB5b3Ugc2hvdWxkIHRha2UgdGhpcyBpbnRvIGFjY291bnQgd2hlbiBjaG9vc2luZyB0aGUgdmFsdWUpXG4gKiAtIE91dHB1dDogVGhlIHNlcnZpY2Ugd2lsbCBlbWl0IHRoZSBjdXJyZW50IGxpc3Qgb2YgZGlzcGxheWVkIGl0ZW1zIHZpYSB0aGUgdmlydHVhbGl6ZWQgaXRlbXMgcmVhY3RpdmUgc3RyZWFtXG4gKiAtIEZvciBzaW1wbGljaXR5LCB0aGUgc2VydmljZSB3b24ndCB0cmFjayB0aGUgaGVpZ2h0IG9mIHRoZSBpdGVtcywgbm9yIGl0IG5lZWRzIGFuIGV4YWN0IHNjcm9sbCBsb2NhdGlvbiAtPiB0aGlzIGlzIGhvdyByZW1vdmluZyBpdGVtcyB3b3JrOlxuICogICAtIElmIHNjcm9sbCBsb2NhdGlvbiBpcyBib3R0b20vdG9wIGl0ZW1zIGFyb3VuZCB0aGUgY3VycmVudCBib3R0b20vdG9wIGl0ZW0gd2lsbCBiZSBlbWl0dGVkIGluIHRoZSB2aXJ0dWFsaXplZCBpdGVtcyBzdHJlYW1cbiAqICAgLSBJZiBzY3JvbGwgbG9jYXRpb24gaXMgbWlkZGxlLCB0aGUgc2VydmljZSB3b24ndCByZW1vdmUgaXRlbXMsIGlmIG5ldyBpdGVtcyBhcmUgcmVjZWl2ZWQsIHRob3NlIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIHZpcnR1YWxpemVkIGxpc3QgICh0aGlzIG1lYW5zIHRoYXQgaW4gdGhlb3J5IHRoZSBsaXN0IGNhbiBncm93IHZlcnkgYmlnIGlmIGEgbG90IG9mIG5ldyBpdGVtcyBhcmUgcmVjZWl2ZWQgd2hpbGUgdGhlIHVzZXIgaXMgc2Nyb2xsZWQgc29tZXdoZXJlLCB0aGlzIGlzIGEgdHJhZGUtb2ZmIGZvciB0aGUgc2ltcGxpY2l0eSBvZiBubyBoZWlnaHQgdHJhY2tpbmcpXG4gKiAgIC0gU2luY2UgdGhlcmUgaXMgbm8gaGVpZ2h0IHRyYWNraW5nLCB5b3Ugc2hvdWxkIG1ha2Ugc3VyZSB0byBwcm92aWRlIGEgbWF4aW11bSBudW1iZXIgdGhhdCBpcyBiaWcgZW5vdWdoIHRvIGZpbGwgdGhlIGJpZ2dlc3QgZXhwZWN0ZWQgc2NyZWVuIHNpemUgdHdpY2VcbiAqIC0gSWYgdGhlIHVzZXIgc2Nyb2xscyB0byB0aGUgYm90dG9tL3RvcCBhbmQgdGhlcmUgYXJlIG5vIG1vcmUgbG9jYWwgaXRlbXMgdG8gc2hvdywgdGhlIHNlcnZpY2Ugd2lsbCB0cmlnZ2VyIGEgcXVlcnkgdG8gbG9hZCBtb3JlIGl0ZW1zXG4gKiAgIC0gSW5wdXQ6IHlvdSBzaG91bGQgcHJvdmlkZSB0aGUgcGFnZSBzaXplIHRvIHVzZSwgaW4gb3JkZXIgZm9yIHRoZSBzZXJ2aWNlIHRvIGRldGVybWluZSBpZiBsb2FkaW5nIGlzIG5lY2Vzc2FyeVxuICpcbiAqIFRoZSBgVmlydHVhbGl6ZWRNZXNzYWdlTGlzdFNlcnZpY2VgIHByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIGZvciB0aGUgbWVzc2FnZSBsaXN0IGNvbXBvbmVudC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFZpcnR1YWxpemVkTGlzdFNlcnZpY2U8VD4ge1xuICAvKipcbiAgICogVGhlIGl0ZW1zIHRoYXQgc2hvdWxkIGJlIGN1cnJlbnRseSBkaXNwbGF5ZWQsIGEgc3Vic2V0IG9mIGFsbCBpdGVtc1xuICAgKi9cbiAgdmlydHVhbGl6ZWRJdGVtcyQ6IE9ic2VydmFibGU8VFtdPjtcbiAgLyoqXG4gICAqIFRoZSByZXN1bHQgb2YgdGhlIGxhc3QgcXVlcnkgdXNlZCB0byBsb2FkIG1vcmUgaXRlbXNcbiAgICovXG4gIHF1ZXJ5U3RhdGUkOiBPYnNlcnZhYmxlPFZpcnR1YWxpemVkTGlzdFF1ZXJ5U3RhdGU+O1xuICBwcm90ZWN0ZWQgcXVlcnlTdGF0ZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFZpcnR1YWxpemVkTGlzdFF1ZXJ5U3RhdGU+KHtcbiAgICBzdGF0ZTogJ3N1Y2Nlc3MnLFxuICB9KTtcbiAgcHJvdGVjdGVkIGJ1ZmZlck9uVG9wID0gMDtcbiAgcHJvdGVjdGVkIGJ1ZmZlck9uQm90dG9tID0gMDtcbiAgcHJvdGVjdGVkIGxvYWRGcm9tQnVmZmVyJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgdmlydHVhbGl6ZWRJdGVtc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRbXT4oW10pO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhbGxJdGVtcyQ6IE9ic2VydmFibGU8VFtdPixcbiAgICBwcml2YXRlIHNjcm9sbFBvc2l0aW9uJDogT2JzZXJ2YWJsZTxWaXJ0dWFsaXplZExpc3RTY3JvbGxQb3NpdGlvbj4sXG4gICAgcHVibGljIHJlYWRvbmx5IGp1bXBUb0l0ZW0kPzogT2JzZXJ2YWJsZTx7XG4gICAgICBpdGVtOiBQYXJ0aWFsPFQ+IHwgdW5kZWZpbmVkO1xuICAgICAgcG9zaXRpb24/OiBWaXJ0dWFsaXplZExpc3RWZXJ0aWNhbEl0ZW1Qb3NpdGlvbjtcbiAgICB9PixcbiAgICBwdWJsaWMgcmVhZG9ubHkgcGFnZVNpemUgPSAyNSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWF4SXRlbUNvdW50ID0gcGFnZVNpemUgKiA0LFxuICApIHtcbiAgICB0aGlzLnZpcnR1YWxpemVkSXRlbXMkID0gdGhpcy52aXJ0dWFsaXplZEl0ZW1zU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLnF1ZXJ5U3RhdGUkID0gdGhpcy5xdWVyeVN0YXRlU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMudmlydHVhbGl6ZWRJdGVtcyQuc3Vic2NyaWJlKCh2aXJ0YWx1emVkSXRlbXMpID0+IHtcbiAgICAgICAgdGhpcy5hbGxJdGVtcyQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKGFsbEl0ZW1zKSA9PiB7XG4gICAgICAgICAgaWYgKHZpcnRhbHV6ZWRJdGVtcy5sZW5ndGggPT09IGFsbEl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXJPblRvcCA9IDA7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlck9uQm90dG9tID0gMDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHZpcnRhbHV6ZWRJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyT25Ub3AgPSBhbGxJdGVtcy5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlck9uQm90dG9tID0gMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5idWZmZXJPblRvcCA9IGFsbEl0ZW1zLmluZGV4T2YodmlydGFsdXplZEl0ZW1zWzBdKTtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyT25Cb3R0b20gPVxuICAgICAgICAgICAgICBhbGxJdGVtcy5sZW5ndGggLVxuICAgICAgICAgICAgICBhbGxJdGVtcy5pbmRleE9mKHZpcnRhbHV6ZWRJdGVtc1t2aXJ0YWx1emVkSXRlbXMubGVuZ3RoIC0gMV0pIC1cbiAgICAgICAgICAgICAgMTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIG1lcmdlKHRoaXMuYWxsSXRlbXMkLCB0aGlzLmxvYWRGcm9tQnVmZmVyJClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgICAgdGhpcy5hbGxJdGVtcyQucGlwZSh0YWtlKDEpKSxcbiAgICAgICAgICAgICAgdGhpcy5zY3JvbGxQb3NpdGlvbiQucGlwZSh0YWtlKDEpKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKFtpdGVtcywgc2Nyb2xsUG9zaXRpb25dKSA9PiB7XG4gICAgICAgICAgaWYgKHNjcm9sbFBvc2l0aW9uID09PSAnbWlkZGxlJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBjdXJyZW50SXRlbXMgPSB0aGlzLnZpcnR1YWxpemVkSXRlbXNTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA8PSB0aGlzLm1heEl0ZW1Db3VudCkge1xuICAgICAgICAgICAgdGhpcy52aXJ0dWFsaXplZEl0ZW1zU3ViamVjdC5uZXh0KGl0ZW1zKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSAwO1xuICAgICAgICAgICAgbGV0IGVuZEluZGV4ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgbnVtYmVyT2ZJdGVtc1RvUmVtb3ZlID1cbiAgICAgICAgICAgICAgaXRlbXMubGVuZ3RoIC0gTWF0aC5yb3VuZCh0aGlzLm1heEl0ZW1Db3VudCAvIDIpO1xuICAgICAgICAgICAgY29uc3QgbnVtYmVyT2ZJdGVtc0FmdGVyUmVtb3ZlID1cbiAgICAgICAgICAgICAgaXRlbXMubGVuZ3RoIC0gbnVtYmVyT2ZJdGVtc1RvUmVtb3ZlO1xuICAgICAgICAgICAgc3dpdGNoIChzY3JvbGxQb3NpdGlvbikge1xuICAgICAgICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgbWlkZGxlSW5kZXggPSBpdGVtcy5maW5kSW5kZXgoKGkpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNFcXVhbChpLCBjdXJyZW50SXRlbXNbMF0pLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGlmIChtaWRkbGVJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IE1hdGgubWF4KFxuICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgbWlkZGxlSW5kZXggLSBNYXRoLmNlaWwobnVtYmVyT2ZJdGVtc0FmdGVyUmVtb3ZlIC8gMiksXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGVuZEluZGV4ID0gc3RhcnRJbmRleCArIG51bWJlck9mSXRlbXNBZnRlclJlbW92ZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZW5kSW5kZXggPSBudW1iZXJPZkl0ZW1zQWZ0ZXJSZW1vdmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgbWlkZGxlSW5kZXggPSBpdGVtcy5maW5kSW5kZXgoKGkpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNFcXVhbChpLCBjdXJyZW50SXRlbXNbY3VycmVudEl0ZW1zLmxlbmd0aCAtIDFdKSxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBpZiAobWlkZGxlSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGVuZEluZGV4ID0gTWF0aC5taW4oXG4gICAgICAgICAgICAgICAgICAgICAgaXRlbXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgIG1pZGRsZUluZGV4ICtcbiAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IobnVtYmVyT2ZJdGVtc0FmdGVyUmVtb3ZlIC8gMikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IGVuZEluZGV4IC0gbnVtYmVyT2ZJdGVtc0FmdGVyUmVtb3ZlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gaXRlbXMubGVuZ3RoIC0gbnVtYmVyT2ZJdGVtc0FmdGVyUmVtb3ZlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZpcnR1YWxpemVkSXRlbXMgPSBpdGVtcy5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgICAgICB0aGlzLnZpcnR1YWxpemVkSXRlbXNTdWJqZWN0Lm5leHQodmlydHVhbGl6ZWRJdGVtcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5zY3JvbGxQb3NpdGlvbiRcbiAgICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcbiAgICAgICAgLnN1YnNjcmliZSgocG9zaXRpb24pID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnF1ZXJ5U3RhdGVTdWJqZWN0LmdldFZhbHVlKCkuc3RhdGUgPT09IGBsb2FkaW5nLSR7cG9zaXRpb259YFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocG9zaXRpb24gPT09ICd0b3AnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5idWZmZXJPblRvcCA8IHRoaXMucGFnZVNpemUpIHtcbiAgICAgICAgICAgICAgdm9pZCB0aGlzLmxvYWRNb3JlKHBvc2l0aW9uKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMubG9hZE1vcmVGcm9tQnVmZmVyKCd0b3AnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09PSAnYm90dG9tJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuYnVmZmVyT25Cb3R0b20gPCB0aGlzLnBhZ2VTaXplKSB7XG4gICAgICAgICAgICAgIHZvaWQgdGhpcy5sb2FkTW9yZShwb3NpdGlvbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmxvYWRNb3JlRnJvbUJ1ZmZlcignYm90dG9tJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5hbGxJdGVtcyRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgcGFpcndpc2UoKSxcbiAgICAgICAgICBmaWx0ZXIoKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHNjcm9sbFBvc2l0aW9uITogVmlydHVhbGl6ZWRMaXN0U2Nyb2xsUG9zaXRpb247XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFBvc2l0aW9uJFxuICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgICAuc3Vic2NyaWJlKChzKSA9PiAoc2Nyb2xsUG9zaXRpb24gPSBzKSk7XG4gICAgICAgICAgICByZXR1cm4gc2Nyb2xsUG9zaXRpb24gPT09ICdtaWRkbGUnO1xuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKFtwcmV2SXRlbXMsIGN1cnJlbnRJdGVtc10pID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjdXJyZW50SXRlbXMubGVuZ3RoIDwgdGhpcy5tYXhJdGVtQ291bnQgfHxcbiAgICAgICAgICAgIHRoaXMudmlydHVhbGl6ZWRJdGVtcy5sZW5ndGggPT09IDBcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMudmlydHVhbGl6ZWRJdGVtc1N1YmplY3QubmV4dChjdXJyZW50SXRlbXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50Rmlyc3RJdGVtID0gdGhpcy52aXJ0dWFsaXplZEl0ZW1zWzBdO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudExhc3RJdGVtID1cbiAgICAgICAgICAgICAgdGhpcy52aXJ0dWFsaXplZEl0ZW1zW3RoaXMudmlydHVhbGl6ZWRJdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGNvbnN0IHByZXZTdGFydEluZGV4ID0gcHJldkl0ZW1zLmZpbmRJbmRleCgoaSkgPT5cbiAgICAgICAgICAgICAgdGhpcy5pc0VxdWFsKGksIGN1cnJlbnRGaXJzdEl0ZW0pLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHByZXZFbmRJbmRleCA9IHByZXZJdGVtcy5maW5kSW5kZXgoKGkpID0+XG4gICAgICAgICAgICAgIHRoaXMuaXNFcXVhbChpLCBjdXJyZW50TGFzdEl0ZW0pLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgaXNTdGFydFJlbWFpbmVkU2FtZSA9IGN1cnJlbnRJdGVtc1twcmV2U3RhcnRJbmRleF1cbiAgICAgICAgICAgICAgPyB0aGlzLmlzRXF1YWwoY3VycmVudEl0ZW1zW3ByZXZTdGFydEluZGV4XSwgY3VycmVudEZpcnN0SXRlbSlcbiAgICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IGlzRW5kUmVtYWluZWRTYW1lID0gY3VycmVudEl0ZW1zW3ByZXZFbmRJbmRleF1cbiAgICAgICAgICAgICAgPyB0aGlzLmlzRXF1YWwoY3VycmVudEl0ZW1zW3ByZXZFbmRJbmRleF0sIGN1cnJlbnRMYXN0SXRlbSlcbiAgICAgICAgICAgICAgOiBmYWxzZTtcblxuICAgICAgICAgICAgY29uc3QgaGFzTmV3SXRlbXNCb3R0b20gPVxuICAgICAgICAgICAgICBwcmV2RW5kSW5kZXggPT09IHByZXZJdGVtcy5sZW5ndGggLSAxICYmIGlzRW5kUmVtYWluZWRTYW1lXG4gICAgICAgICAgICAgICAgPyBwcmV2SXRlbXMubGVuZ3RoICE9PSBjdXJyZW50SXRlbXMubGVuZ3RoXG4gICAgICAgICAgICAgICAgOiBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKGlzU3RhcnRSZW1haW5lZFNhbWUgJiYgaXNFbmRSZW1haW5lZFNhbWUpIHtcbiAgICAgICAgICAgICAgY29uc3QgZW5kSW5kZXggPSBoYXNOZXdJdGVtc0JvdHRvbSA/IHVuZGVmaW5lZCA6IHByZXZFbmRJbmRleCArIDE7XG4gICAgICAgICAgICAgIHRoaXMudmlydHVhbGl6ZWRJdGVtc1N1YmplY3QubmV4dChcbiAgICAgICAgICAgICAgICBjdXJyZW50SXRlbXMuc2xpY2UocHJldlN0YXJ0SW5kZXgsIGVuZEluZGV4KSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGN1cnJlbnRTdGFydEluZGV4ID0gaXNTdGFydFJlbWFpbmVkU2FtZSA/IHByZXZTdGFydEluZGV4IDogLTE7XG4gICAgICAgICAgICBsZXQgY3VycmVudEVuZEluZGV4ID0gaXNFbmRSZW1haW5lZFNhbWUgPyBwcmV2RW5kSW5kZXggOiAtMTtcblxuICAgICAgICAgICAgaWYgKCFpc1N0YXJ0UmVtYWluZWRTYW1lKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRTdGFydEluZGV4ID0gY3VycmVudEl0ZW1zLmZpbmRJbmRleCgoaSkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLmlzRXF1YWwoaSwgY3VycmVudEZpcnN0SXRlbSksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzRW5kUmVtYWluZWRTYW1lKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRFbmRJbmRleCA9IGN1cnJlbnRJdGVtcy5maW5kSW5kZXgoKGkpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5pc0VxdWFsKGksIGN1cnJlbnRMYXN0SXRlbSksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGhhc05ld0l0ZW1zVG9wID1cbiAgICAgICAgICAgICAgcHJldlN0YXJ0SW5kZXggPT09IDAgJiYgIWlzU3RhcnRSZW1haW5lZFNhbWVcbiAgICAgICAgICAgICAgICA/IGN1cnJlbnRTdGFydEluZGV4ICE9PSAwXG4gICAgICAgICAgICAgICAgOiBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRTdGFydEluZGV4ICE9PSAtMSAmJiBjdXJyZW50RW5kSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBoYXNOZXdJdGVtc1RvcCA/IDAgOiBjdXJyZW50U3RhcnRJbmRleDtcbiAgICAgICAgICAgICAgdGhpcy52aXJ0dWFsaXplZEl0ZW1zU3ViamVjdC5uZXh0KFxuICAgICAgICAgICAgICAgIGN1cnJlbnRJdGVtcy5zbGljZShzdGFydEluZGV4LCBjdXJyZW50RW5kSW5kZXggKyAxKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChjdXJyZW50U3RhcnRJbmRleCA9PT0gLTEgJiYgY3VycmVudEVuZEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRTdGFydEluZGV4ID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgY3VycmVudEVuZEluZGV4IC0gKHByZXZFbmRJbmRleCAtIHByZXZTdGFydEluZGV4KSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFbmRJbmRleCA9PT0gLTEgJiYgY3VycmVudFN0YXJ0SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEVuZEluZGV4ID0gTWF0aC5taW4oXG4gICAgICAgICAgICAgICAgICBjdXJyZW50SXRlbXMubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGFydEluZGV4ICsgKHByZXZFbmRJbmRleCAtIHByZXZTdGFydEluZGV4KSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhpcy52aXJ0dWFsaXplZEl0ZW1zU3ViamVjdC5uZXh0KFxuICAgICAgICAgICAgICAgIGN1cnJlbnRJdGVtcy5zbGljZShjdXJyZW50U3RhcnRJbmRleCwgY3VycmVudEVuZEluZGV4ICsgMSksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICApO1xuICAgIGlmICh0aGlzLmp1bXBUb0l0ZW0kKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgdGhpcy5qdW1wVG9JdGVtJFxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKChqdW1wVG9JdGVtKSA9PlxuICAgICAgICAgICAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLmFsbEl0ZW1zJC5waXBlKHRha2UoMSkpLCBvZihqdW1wVG9JdGVtKV0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZSgoW2FsbEl0ZW1zLCBqdW1wVG9JdGVtXSkgPT4ge1xuICAgICAgICAgICAgaWYgKGp1bXBUb0l0ZW0uaXRlbSkge1xuICAgICAgICAgICAgICBpZiAoYWxsSXRlbXMubGVuZ3RoIDwgdGhpcy5tYXhJdGVtQ291bnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpcnR1YWxpemVkSXRlbXNTdWJqZWN0Lm5leHQoYWxsSXRlbXMpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1JbmRleCA9IGFsbEl0ZW1zLmZpbmRJbmRleCgoaSkgPT5cbiAgICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVE9ETzogZG8gd2Uga25vdyBhIGJldHRlciB0eXBpbmcgaGVyZT9cbiAgICAgICAgICAgICAgICAgIHRoaXMuaXNFcXVhbChpLCBqdW1wVG9JdGVtLml0ZW0pLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1JbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBqdW1wVG9JdGVtLnBvc2l0aW9uIHx8ICdtaWRkbGUnO1xuICAgICAgICAgICAgICAgICAgY29uc3QgbnVtYmVyT2ZJdGVtc1RvUmVtb3ZlID1cbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMubGVuZ3RoIC0gTWF0aC5yb3VuZCh0aGlzLm1heEl0ZW1Db3VudCAvIDIpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgbnVtYmVyT2ZJdGVtc0FmdGVyUmVtb3ZlID1cbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMubGVuZ3RoIC0gbnVtYmVyT2ZJdGVtc1RvUmVtb3ZlO1xuICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICAgIGxldCBlbmRJbmRleCA9IC0xO1xuXG4gICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IGl0ZW1JbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICBlbmRJbmRleCA9IE1hdGgubWluKFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCArIG51bWJlck9mSXRlbXNBZnRlclJlbW92ZSxcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgICAgICAgICAgICAgIGVuZEluZGV4ID0gaXRlbUluZGV4ICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kSW5kZXggLSBudW1iZXJPZkl0ZW1zQWZ0ZXJSZW1vdmUsXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWlkZGxlJzoge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zT25Ub3AgPSBpdGVtSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbXNPbkJvdHRvbSA9IGFsbEl0ZW1zLmxlbmd0aCAtIGl0ZW1JbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtc09uVG9wIDwgTWF0aC5jZWlsKG51bWJlck9mSXRlbXNBZnRlclJlbW92ZSAvIDIpXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNPbkJvdHRvbSA8XG4gICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKG51bWJlck9mSXRlbXNBZnRlclJlbW92ZSAvIDIpICsgMVxuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kSW5kZXggPSBhbGxJdGVtcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0SW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5kSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBlbmRJbmRleCAtIG51bWJlck9mSXRlbXNBZnRlclJlbW92ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1JbmRleCAtIE1hdGguY2VpbChudW1iZXJPZkl0ZW1zQWZ0ZXJSZW1vdmUgLyAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5kSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRJbmRleCA9IHN0YXJ0SW5kZXggKyBudW1iZXJPZkl0ZW1zQWZ0ZXJSZW1vdmU7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHRoaXMudmlydHVhbGl6ZWRJdGVtc1N1YmplY3QubmV4dChcbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMuc2xpY2Uoc3RhcnRJbmRleCwgZW5kSW5kZXgpLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHZhbHVlIG9mIHZpcnR1YWxpemVkIGl0ZW1zXG4gICAqL1xuICBnZXQgdmlydHVhbGl6ZWRJdGVtcygpIHtcbiAgICByZXR1cm4gdGhpcy52aXJ0dWFsaXplZEl0ZW1zU3ViamVjdC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbGwgc3Vic2NyaXB0aW9ucywgY2FsbCB0aGlzIG9uY2UgeW91J3JlIGRvbmUgdXNpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyBzZXJ2aWNlXG4gICAqL1xuICBkaXNwb3NlKCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGxvYWRNb3JlRnJvbUJ1ZmZlcihfOiBWaXJ0dWFsaXplZExpc3RRdWVyeURpcmVjdGlvbikge1xuICAgIHRoaXMubG9hZEZyb21CdWZmZXIkLm5leHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZE1vcmUoZGlyZWN0aW9uOiBWaXJ0dWFsaXplZExpc3RRdWVyeURpcmVjdGlvbikge1xuICAgIHRoaXMucXVlcnlTdGF0ZVN1YmplY3QubmV4dCh7IHN0YXRlOiBgbG9hZGluZy0ke2RpcmVjdGlvbn1gIH0pO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnF1ZXJ5KGRpcmVjdGlvbik7XG4gICAgICB0aGlzLnF1ZXJ5U3RhdGVTdWJqZWN0Lm5leHQoeyBzdGF0ZTogJ3N1Y2Nlc3MnIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMucXVlcnlTdGF0ZVN1YmplY3QubmV4dCh7IHN0YXRlOiAnZXJyb3InLCBlcnJvcjogZSB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgaXNFcXVhbDogKHQxOiBULCB0MjogVCkgPT4gYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcXVlcnk6IChcbiAgICBkaXJlY3Rpb246IFZpcnR1YWxpemVkTGlzdFF1ZXJ5RGlyZWN0aW9uLFxuICApID0+IFByb21pc2U8dW5rbm93bj47XG59XG4iXX0=
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
const ENCODING_BIT_RATE = 128; // kbps;
|
|
2
|
-
const COUNT_SAMPLES_PER_ENCODED_BLOCK = 1152;
|
|
3
|
-
const SAMPLE_RATE = 16000;
|
|
4
|
-
const readFileAsArrayBuffer = (blob) => new Promise((resolve, reject) => {
|
|
5
|
-
const blobReader = new FileReader();
|
|
6
|
-
blobReader.onload = () => {
|
|
7
|
-
resolve(blobReader.result);
|
|
8
|
-
};
|
|
9
|
-
blobReader.onerror = () => {
|
|
10
|
-
reject(new Error(blobReader.error?.message));
|
|
11
|
-
};
|
|
12
|
-
blobReader.readAsArrayBuffer(blob);
|
|
13
|
-
});
|
|
14
|
-
const toAudioBuffer = async (blob) => {
|
|
15
|
-
const audioCtx = new AudioContext();
|
|
16
|
-
const arrayBuffer = await readFileAsArrayBuffer(blob);
|
|
17
|
-
const decodedData = await audioCtx.decodeAudioData(arrayBuffer);
|
|
18
|
-
if (audioCtx.state !== 'closed')
|
|
19
|
-
await audioCtx.close();
|
|
20
|
-
return decodedData;
|
|
21
|
-
};
|
|
22
|
-
const renderAudio = async (audioBuffer, sampleRate) => {
|
|
23
|
-
const offlineAudioCtx = new OfflineAudioContext(audioBuffer.numberOfChannels, audioBuffer.duration * sampleRate, sampleRate);
|
|
24
|
-
const source = offlineAudioCtx.createBufferSource();
|
|
25
|
-
source.buffer = audioBuffer;
|
|
26
|
-
source.connect(offlineAudioCtx.destination);
|
|
27
|
-
source.start();
|
|
28
|
-
return await offlineAudioCtx.startRendering();
|
|
29
|
-
};
|
|
30
|
-
const float32ArrayToInt16Array = (float32Arr) => {
|
|
31
|
-
const int16Arr = new Int16Array(float32Arr.length);
|
|
32
|
-
for (let i = 0; i < float32Arr.length; i++) {
|
|
33
|
-
const float32Value = float32Arr[i];
|
|
34
|
-
// Clamp the float value between -1 and 1
|
|
35
|
-
const clampedValue = Math.max(-1, Math.min(1, float32Value));
|
|
36
|
-
// Convert the float value to a signed 16-bit integer
|
|
37
|
-
int16Arr[i] = Math.round(clampedValue * 32767);
|
|
38
|
-
}
|
|
39
|
-
return int16Arr;
|
|
40
|
-
};
|
|
41
|
-
const splitDataByChannel = (audioBuffer) => Array.from({ length: audioBuffer.numberOfChannels }, (_, i) => audioBuffer.getChannelData(i)).map(float32ArrayToInt16Array);
|
|
42
|
-
/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-argument */
|
|
43
|
-
export async function encodeWebmToMp3(blob, lameJs) {
|
|
44
|
-
const audioBuffer = await renderAudio(await toAudioBuffer(blob), SAMPLE_RATE);
|
|
45
|
-
const channelCount = audioBuffer.numberOfChannels;
|
|
46
|
-
const dataByChannel = splitDataByChannel(audioBuffer);
|
|
47
|
-
const mp3Encoder = new lameJs.Mp3Encoder(channelCount, SAMPLE_RATE, ENCODING_BIT_RATE);
|
|
48
|
-
const dataBuffer = [];
|
|
49
|
-
let remaining = dataByChannel[0].length;
|
|
50
|
-
for (let i = 0; remaining >= COUNT_SAMPLES_PER_ENCODED_BLOCK; i += COUNT_SAMPLES_PER_ENCODED_BLOCK) {
|
|
51
|
-
const [leftChannelBlock, rightChannelBlock] = dataByChannel.map((channel) => channel.subarray(i, i + COUNT_SAMPLES_PER_ENCODED_BLOCK));
|
|
52
|
-
dataBuffer.push(new Int8Array(mp3Encoder.encodeBuffer(leftChannelBlock, rightChannelBlock)));
|
|
53
|
-
remaining -= COUNT_SAMPLES_PER_ENCODED_BLOCK;
|
|
54
|
-
}
|
|
55
|
-
const lastBlock = mp3Encoder.flush();
|
|
56
|
-
if (lastBlock.length)
|
|
57
|
-
dataBuffer.push(new Int8Array(lastBlock));
|
|
58
|
-
return new Blob(dataBuffer, { type: 'audio/mp3;sbu_type=voice' });
|
|
59
|
-
}
|
|
60
|
-
/* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-argument */
|
|
61
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXAzLXRyYW5zY29kZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvdm9pY2UtcmVjb3JkZXIvbXAzLXRyYW5zY29kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUMsQ0FBQyxRQUFRO0FBQ3ZDLE1BQU0sK0JBQStCLEdBQUcsSUFBSSxDQUFDO0FBQzdDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQztBQUUxQixNQUFNLHFCQUFxQixHQUFHLENBQUMsSUFBVSxFQUF3QixFQUFFLENBQ2pFLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO0lBQzlCLE1BQU0sVUFBVSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7SUFDcEMsVUFBVSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUU7UUFDdkIsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFxQixDQUFDLENBQUM7SUFDNUMsQ0FBQyxDQUFDO0lBRUYsVUFBVSxDQUFDLE9BQU8sR0FBRyxHQUFHLEVBQUU7UUFDeEIsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDLENBQUM7SUFFRixVQUFVLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckMsQ0FBQyxDQUFDLENBQUM7QUFFTCxNQUFNLGFBQWEsR0FBRyxLQUFLLEVBQUUsSUFBVSxFQUFFLEVBQUU7SUFDekMsTUFBTSxRQUFRLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUVwQyxNQUFNLFdBQVcsR0FBRyxNQUFNLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RELE1BQU0sV0FBVyxHQUFHLE1BQU0sUUFBUSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJ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QUFDLEdBQUcsK0JBQStCLENBQUMsQ0FDekQsQ0FBQztRQUNGLFVBQVUsQ0FBQyxJQUFJLENBQ2IsSUFBSSxTQUFTLENBQ1gsVUFBVSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxpQkFBaUIsQ0FBQyxDQUM3RCxDQUNGLENBQUM7UUFDRixTQUFTLElBQUksK0JBQStCLENBQUM7S0FDOUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDckMsSUFBSSxTQUFTLENBQUMsTUFBTTtRQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNoRSxPQUFPLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUNELHFOQUFxTiIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IEVOQ09ESU5HX0JJVF9SQVRFID0gMTI4OyAvLyBrYnBzO1xuY29uc3QgQ09VTlRfU0FNUExFU19QRVJfRU5DT0RFRF9CTE9DSyA9IDExNTI7XG5jb25zdCBTQU1QTEVfUkFURSA9IDE2MDAwO1xuXG5jb25zdCByZWFkRmlsZUFzQXJyYXlCdWZmZXIgPSAoYmxvYjogQmxvYik6IFByb21pc2U8QXJyYXlCdWZmZXI+ID0+XG4gIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBibG9iUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICBibG9iUmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIHJlc29sdmUoYmxvYlJlYWRlci5yZXN1bHQgYXMgQXJyYXlCdWZmZXIpO1xuICAgIH07XG5cbiAgICBibG9iUmVhZGVyLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICByZWplY3QobmV3IEVycm9yKGJsb2JSZWFkZXIuZXJyb3I/Lm1lc3NhZ2UpKTtcbiAgICB9O1xuXG4gICAgYmxvYlJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKTtcbiAgfSk7XG5cbmNvbnN0IHRvQXVkaW9CdWZmZXIgPSBhc3luYyAoYmxvYjogQmxvYikgPT4ge1xuICBjb25zdCBhdWRpb0N0eCA9IG5ldyBBdWRpb0NvbnRleHQoKTtcblxuICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IHJlYWRGaWxlQXNBcnJheUJ1ZmZlcihibG9iKTtcbiAgY29uc3QgZGVjb2RlZERhdGEgPSBhd2FpdCBhdWRpb0N0eC5kZWNvZGVBdWRpb0RhdGEoYXJyYXlCdWZmZXIpO1xuICBpZiAoYXVkaW9DdHguc3RhdGUgIT09ICdjbG9zZWQnKSBhd2FpdCBhdWRpb0N0eC5jbG9zZSgpO1xuICByZXR1cm4gZGVjb2RlZERhdGE7XG59O1xuXG5jb25zdCByZW5kZXJBdWRpbyA9IGFzeW5jIChhdWRpb0J1ZmZlcjogQXVkaW9CdWZmZXIsIHNhbXBsZVJhdGU6IG51bWJlcikgPT4ge1xuICBjb25zdCBvZmZsaW5lQXVkaW9DdHggPSBuZXcgT2ZmbGluZUF1ZGlvQ29udGV4dChcbiAgICBhdWRpb0J1ZmZlci5udW1iZXJPZkNoYW5uZWxzLFxuICAgIGF1ZGlvQnVmZmVyLmR1cmF0aW9uICogc2FtcGxlUmF0ZSxcbiAgICBzYW1wbGVSYXRlLFxuICApO1xuICBjb25zdCBzb3VyY2UgPSBvZmZsaW5lQXVkaW9DdHguY3JlYXRlQnVmZmVyU291cmNlKCk7XG4gIHNvdXJjZS5idWZmZXIgPSBhdWRpb0J1ZmZlcjtcbiAgc291cmNlLmNvbm5lY3Qob2ZmbGluZUF1ZGlvQ3R4LmRlc3RpbmF0aW9uKTtcbiAgc291cmNlLnN0YXJ0KCk7XG5cbiAgcmV0dXJuIGF3YWl0IG9mZmxpbmVBdWRpb0N0eC5zdGFydFJlbmRlcmluZygpO1xufTtcblxuY29uc3QgZmxvYXQzMkFycmF5VG9JbnQxNkFycmF5ID0gKGZsb2F0MzJBcnI6IEZsb2F0MzJBcnJheSkgPT4ge1xuICBjb25zdCBpbnQxNkFyciA9IG5ldyBJbnQxNkFycmF5KGZsb2F0MzJBcnIubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmbG9hdDMyQXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZmxvYXQzMlZhbHVlID0gZmxvYXQzMkFycltpXTtcbiAgICAvLyBDbGFtcCB0aGUgZmxvYXQgdmFsdWUgYmV0d2VlbiAtMSBhbmQgMVxuICAgIGNvbnN0IGNsYW1wZWRWYWx1ZSA9IE1hdGgubWF4KC0xLCBNYXRoLm1pbigxLCBmbG9hdDMyVmFsdWUpKTtcbiAgICAvLyBDb252ZXJ0IHRoZSBmbG9hdCB2YWx1ZSB0byBhIHNpZ25lZCAxNi1iaXQgaW50ZWdlclxuICAgIGludDE2QXJyW2ldID0gTWF0aC5yb3VuZChjbGFtcGVkVmFsdWUgKiAzMjc2Nyk7XG4gIH1cbiAgcmV0dXJuIGludDE2QXJyO1xufTtcblxuY29uc3Qgc3BsaXREYXRhQnlDaGFubmVsID0gKGF1ZGlvQnVmZmVyOiBBdWRpb0J1ZmZlcikgPT5cbiAgQXJyYXkuZnJvbSh7IGxlbmd0aDogYXVkaW9CdWZmZXIubnVtYmVyT2ZDaGFubmVscyB9LCAoXywgaSkgPT5cbiAgICBhdWRpb0J1ZmZlci5nZXRDaGFubmVsRGF0YShpKSxcbiAgKS5tYXAoZmxvYXQzMkFycmF5VG9JbnQxNkFycmF5KTtcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50LCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWNhbGwsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hcmd1bWVudCAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuY29kZVdlYm1Ub01wMyhibG9iOiBCbG9iLCBsYW1lSnM6IGFueSkge1xuICBjb25zdCBhdWRpb0J1ZmZlciA9IGF3YWl0IHJlbmRlckF1ZGlvKGF3YWl0IHRvQXVkaW9CdWZmZXIoYmxvYiksIFNBTVBMRV9SQVRFKTtcbiAgY29uc3QgY2hhbm5lbENvdW50ID0gYXVkaW9CdWZmZXIubnVtYmVyT2ZDaGFubmVscztcbiAgY29uc3QgZGF0YUJ5Q2hhbm5lbCA9IHNwbGl0RGF0YUJ5Q2hhbm5lbChhdWRpb0J1ZmZlcik7XG4gIGNvbnN0IG1wM0VuY29kZXIgPSBuZXcgbGFtZUpzLk1wM0VuY29kZXIoXG4gICAgY2hhbm5lbENvdW50LFxuICAgIFNBTVBMRV9SQVRFLFxuICAgIEVOQ09ESU5HX0JJVF9SQVRFLFxuICApO1xuXG4gIGNvbnN0IGRhdGFCdWZmZXI6IEludDhBcnJheVtdID0gW107XG4gIGxldCByZW1haW5pbmcgPSBkYXRhQnlDaGFubmVsWzBdLmxlbmd0aDtcbiAgZm9yIChcbiAgICBsZXQgaSA9IDA7XG4gICAgcmVtYWluaW5nID49IENPVU5UX1NBTVBMRVNfUEVSX0VOQ09ERURfQkxPQ0s7XG4gICAgaSArPSBDT1VOVF9TQU1QTEVTX1BFUl9FTkNPREVEX0JMT0NLXG4gICkge1xuICAgIGNvbnN0IFtsZWZ0Q2hhbm5lbEJsb2NrLCByaWdodENoYW5uZWxCbG9ja10gPSBkYXRhQnlDaGFubmVsLm1hcCgoY2hhbm5lbCkgPT5cbiAgICAgIGNoYW5uZWwuc3ViYXJyYXkoaSwgaSArIENPVU5UX1NBTVBMRVNfUEVSX0VOQ09ERURfQkxPQ0spLFxuICAgICk7XG4gICAgZGF0YUJ1ZmZlci5wdXNoKFxuICAgICAgbmV3IEludDhBcnJheShcbiAgICAgICAgbXAzRW5jb2Rlci5lbmNvZGVCdWZmZXIobGVmdENoYW5uZWxCbG9jaywgcmlnaHRDaGFubmVsQmxvY2spLFxuICAgICAgKSxcbiAgICApO1xuICAgIHJlbWFpbmluZyAtPSBDT1VOVF9TQU1QTEVTX1BFUl9FTkNPREVEX0JMT0NLO1xuICB9XG5cbiAgY29uc3QgbGFzdEJsb2NrID0gbXAzRW5jb2Rlci5mbHVzaCgpO1xuICBpZiAobGFzdEJsb2NrLmxlbmd0aCkgZGF0YUJ1ZmZlci5wdXNoKG5ldyBJbnQ4QXJyYXkobGFzdEJsb2NrKSk7XG4gIHJldHVybiBuZXcgQmxvYihkYXRhQnVmZmVyLCB7IHR5cGU6ICdhdWRpby9tcDM7c2J1X3R5cGU9dm9pY2UnIH0pO1xufVxuLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnQsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFyZ3VtZW50ICovXG4iXX0=
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import { Injectable, NgModule } from '@angular/core';
|
|
2
|
-
import { readBlobAsArrayBuffer } from '../file-utils';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
const WAV_HEADER_LENGTH_BYTES = 44;
|
|
5
|
-
const BYTES_PER_SAMPLE = 2;
|
|
6
|
-
const RIFF_FILE_MAX_BYTES = 4294967295;
|
|
7
|
-
const HEADER = {
|
|
8
|
-
AUDIO_FORMAT: { offset: 20, value: 1 },
|
|
9
|
-
BITS_PER_SAMPLE: { offset: 34, value: BYTES_PER_SAMPLE * 8 },
|
|
10
|
-
BLOCK_ALIGN: { offset: 32 },
|
|
11
|
-
BYTE_RATE: { offset: 28 },
|
|
12
|
-
CHANNEL_COUNT: { offset: 22 },
|
|
13
|
-
CHUNK_ID: { offset: 0, value: 0x52494646 },
|
|
14
|
-
CHUNK_SIZE: { offset: 4 },
|
|
15
|
-
FILE_FORMAT: { offset: 8, value: 0x57415645 },
|
|
16
|
-
SAMPLE_RATE: { offset: 24 },
|
|
17
|
-
SUBCHUNK1_ID: { offset: 12, value: 0x666d7420 },
|
|
18
|
-
SUBCHUNK1_SIZE: { offset: 16, value: 16 },
|
|
19
|
-
SUBCHUNK2_ID: { offset: 36, value: 0x64617461 },
|
|
20
|
-
SUBCHUNK2_SIZE: { offset: 40 }, // actual audio data size
|
|
21
|
-
};
|
|
22
|
-
/**
|
|
23
|
-
* The `TranscoderService` is used to transcibe audio recording to a format that's supported by all major browsers. The SDK uses this to create voice messages.
|
|
24
|
-
*
|
|
25
|
-
* If you want to use your own transcoder you can provide a `customTranscoder`.
|
|
26
|
-
*/
|
|
27
|
-
export class TranscoderService {
|
|
28
|
-
constructor() {
|
|
29
|
-
this.config = {
|
|
30
|
-
sampleRate: 16000,
|
|
31
|
-
};
|
|
32
|
-
this.splitDataByChannel = (audioBuffer) => Array.from({ length: audioBuffer.numberOfChannels }, (_, i) => audioBuffer.getChannelData(i));
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* The default transcoder will leave audio/mp4 files as is, and transcode webm files to wav. If you want to customize this, you can provide your own transcoder using the `customTranscoder` field
|
|
36
|
-
* @param blob
|
|
37
|
-
* @returns the transcoded file
|
|
38
|
-
*/
|
|
39
|
-
async transcode(blob) {
|
|
40
|
-
if (this.customTranscoder) {
|
|
41
|
-
return this.customTranscoder(blob);
|
|
42
|
-
}
|
|
43
|
-
if (blob.type.includes('audio/mp4')) {
|
|
44
|
-
return blob;
|
|
45
|
-
}
|
|
46
|
-
const audioBuffer = await this.renderAudio(await this.toAudioBuffer(blob), this.config.sampleRate);
|
|
47
|
-
const numberOfSamples = audioBuffer.duration * this.config.sampleRate;
|
|
48
|
-
const fileSizeBytes = numberOfSamples * audioBuffer.numberOfChannels * BYTES_PER_SAMPLE +
|
|
49
|
-
WAV_HEADER_LENGTH_BYTES;
|
|
50
|
-
const arrayBuffer = new ArrayBuffer(fileSizeBytes);
|
|
51
|
-
this.writeWavHeader({
|
|
52
|
-
arrayBuffer,
|
|
53
|
-
channelCount: audioBuffer.numberOfChannels,
|
|
54
|
-
sampleRate: this.config.sampleRate,
|
|
55
|
-
});
|
|
56
|
-
this.writeWavAudioData({
|
|
57
|
-
arrayBuffer,
|
|
58
|
-
dataByChannel: this.splitDataByChannel(audioBuffer),
|
|
59
|
-
});
|
|
60
|
-
return new Blob([arrayBuffer], { type: 'audio/wav' });
|
|
61
|
-
}
|
|
62
|
-
async renderAudio(audioBuffer, sampleRate) {
|
|
63
|
-
const offlineAudioCtx = new OfflineAudioContext(audioBuffer.numberOfChannels, audioBuffer.duration * sampleRate, sampleRate);
|
|
64
|
-
const source = offlineAudioCtx.createBufferSource();
|
|
65
|
-
source.buffer = audioBuffer;
|
|
66
|
-
source.connect(offlineAudioCtx.destination);
|
|
67
|
-
source.start();
|
|
68
|
-
return await offlineAudioCtx.startRendering();
|
|
69
|
-
}
|
|
70
|
-
async toAudioBuffer(blob) {
|
|
71
|
-
const audioCtx = new AudioContext();
|
|
72
|
-
const arrayBuffer = await readBlobAsArrayBuffer(blob);
|
|
73
|
-
const decodedData = await audioCtx.decodeAudioData(arrayBuffer);
|
|
74
|
-
if (audioCtx.state !== 'closed')
|
|
75
|
-
await audioCtx.close();
|
|
76
|
-
return decodedData;
|
|
77
|
-
}
|
|
78
|
-
writeWavAudioData({ arrayBuffer, dataByChannel, }) {
|
|
79
|
-
const dataView = new DataView(arrayBuffer);
|
|
80
|
-
const channelCount = dataByChannel.length;
|
|
81
|
-
dataByChannel.forEach((channelData, channelIndex) => {
|
|
82
|
-
let writeOffset = WAV_HEADER_LENGTH_BYTES + channelCount * channelIndex;
|
|
83
|
-
channelData.forEach((float32Value) => {
|
|
84
|
-
dataView.setInt16(writeOffset, float32Value < 0
|
|
85
|
-
? Math.max(-1, float32Value) * 32768
|
|
86
|
-
: Math.min(1, float32Value) * 32767, true);
|
|
87
|
-
writeOffset += channelCount * BYTES_PER_SAMPLE;
|
|
88
|
-
});
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
writeWavHeader({ arrayBuffer, channelCount, sampleRate, }) {
|
|
92
|
-
const byteRate = sampleRate * channelCount * BYTES_PER_SAMPLE; // bytes/sec
|
|
93
|
-
const blockAlign = channelCount * BYTES_PER_SAMPLE;
|
|
94
|
-
const dataView = new DataView(arrayBuffer);
|
|
95
|
-
/*
|
|
96
|
-
* The maximum size of a RIFF file is 4294967295 bytes and since the header takes up 44 bytes there are 4294967251 bytes left for the
|
|
97
|
-
* data chunk.
|
|
98
|
-
*/
|
|
99
|
-
const dataChunkSize = Math.min(dataView.byteLength - WAV_HEADER_LENGTH_BYTES, RIFF_FILE_MAX_BYTES - WAV_HEADER_LENGTH_BYTES);
|
|
100
|
-
dataView.setUint32(HEADER.CHUNK_ID.offset, HEADER.CHUNK_ID.value); // "RIFF"
|
|
101
|
-
dataView.setUint32(HEADER.CHUNK_SIZE.offset, arrayBuffer.byteLength - 8, true); // adjustment for the first two headers - chunk id + file size
|
|
102
|
-
dataView.setUint32(HEADER.FILE_FORMAT.offset, HEADER.FILE_FORMAT.value); // "WAVE"
|
|
103
|
-
dataView.setUint32(HEADER.SUBCHUNK1_ID.offset, HEADER.SUBCHUNK1_ID.value); // "fmt "
|
|
104
|
-
dataView.setUint32(HEADER.SUBCHUNK1_SIZE.offset, HEADER.SUBCHUNK1_SIZE.value, true);
|
|
105
|
-
dataView.setUint16(HEADER.AUDIO_FORMAT.offset, HEADER.AUDIO_FORMAT.value, true);
|
|
106
|
-
dataView.setUint16(HEADER.CHANNEL_COUNT.offset, channelCount, true);
|
|
107
|
-
dataView.setUint32(HEADER.SAMPLE_RATE.offset, sampleRate, true);
|
|
108
|
-
dataView.setUint32(HEADER.BYTE_RATE.offset, byteRate, true);
|
|
109
|
-
dataView.setUint16(HEADER.BLOCK_ALIGN.offset, blockAlign, true);
|
|
110
|
-
dataView.setUint16(HEADER.BITS_PER_SAMPLE.offset, HEADER.BITS_PER_SAMPLE.value, true);
|
|
111
|
-
dataView.setUint32(HEADER.SUBCHUNK2_ID.offset, HEADER.SUBCHUNK2_ID.value); // "data"
|
|
112
|
-
dataView.setUint32(HEADER.SUBCHUNK2_SIZE.offset, dataChunkSize, true);
|
|
113
|
-
}
|
|
114
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: TranscoderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
115
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: TranscoderService, providedIn: NgModule }); }
|
|
116
|
-
}
|
|
117
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: TranscoderService, decorators: [{
|
|
118
|
-
type: Injectable,
|
|
119
|
-
args: [{ providedIn: NgModule }]
|
|
120
|
-
}], ctorParameters: () => [] });
|
|
121
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNjb2Rlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL3ZvaWNlLXJlY29yZGVyL3RyYW5zY29kZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBVXRELE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxDQUFDO0FBQ25DLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDO0FBRXZDLE1BQU0sTUFBTSxHQUFHO0lBQ2IsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO0lBQ3RDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixHQUFHLENBQUMsRUFBRTtJQUM1RCxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO0lBQzNCLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUU7SUFDekIsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtJQUM3QixRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7SUFDMUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRTtJQUN6QixXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7SUFDN0MsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtJQUMzQixZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFF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QUUsSUFBSSxDQUFDLENBQUM7UUFDcEUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUQsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEUsUUFBUSxDQUFDLFNBQVMsQ0FDaEIsTUFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQzdCLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUM1QixJQUFJLENBQ0wsQ0FBQztRQUVGLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDcEYsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEUsQ0FBQzs4R0F4SVUsaUJBQWlCO2tIQUFqQixpQkFBaUIsY0FESixRQUFROzsyRkFDckIsaUJBQWlCO2tCQUQ3QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyByZWFkQmxvYkFzQXJyYXlCdWZmZXIgfSBmcm9tICcuLi9maWxlLXV0aWxzJztcblxuZXhwb3J0IHR5cGUgVHJhbnNjb2RlckNvbmZpZyA9IHtcbiAgc2FtcGxlUmF0ZTogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgVHJhbnNjb2RlUGFyYW1zID0gVHJhbnNjb2RlckNvbmZpZyAmIHtcbiAgYmxvYjogQmxvYjtcbn07XG5cbmNvbnN0IFdBVl9IRUFERVJfTEVOR1RIX0JZVEVTID0gNDQ7XG5jb25zdCBCWVRFU19QRVJfU0FNUExFID0gMjtcbmNvbnN0IFJJRkZfRklMRV9NQVhfQllURVMgPSA0Mjk0OTY3Mjk1O1xuXG5jb25zdCBIRUFERVIgPSB7XG4gIEFVRElPX0ZPUk1BVDogeyBvZmZzZXQ6IDIwLCB2YWx1ZTogMSB9LCAvLyBQQ00gPSAxXG4gIEJJVFNfUEVSX1NBTVBMRTogeyBvZmZzZXQ6IDM0LCB2YWx1ZTogQllURVNfUEVSX1NBTVBMRSAqIDggfSwgLy8gMTYgYml0cyBlbmNvZGluZ1xuICBCTE9DS19BTElHTjogeyBvZmZzZXQ6IDMyIH0sXG4gIEJZVEVfUkFURTogeyBvZmZzZXQ6IDI4IH0sXG4gIENIQU5ORUxfQ09VTlQ6IHsgb2Zmc2V0OiAyMiB9LCAvLyAxIC0gbW9ubywgMiAtIHN0ZXJlb1xuICBDSFVOS19JRDogeyBvZmZzZXQ6IDAsIHZhbHVlOiAweDUyNDk0NjQ2IH0sIC8vIGhleCByZXByZXNlbnRhdGlvbiBvZiBzdHJpbmcgXCJSSUZGXCIgKFJlc291cmNlIEludGVyY2hhbmdlIEZpbGUgRm9ybWF0KSAtIGlkZW50aWZpZXMgdGhlIGZpbGUgc3RydWN0dXJlIHRoYXQgZGVmaW5lcyBhIGNsYXNzIG9mIG1vcmUgc3BlY2lmaWMgZmlsZSBmb3JtYXRzLCBlLmcuIFdBVkVcbiAgQ0hVTktfU0laRTogeyBvZmZzZXQ6IDQgfSxcbiAgRklMRV9GT1JNQVQ6IHsgb2Zmc2V0OiA4LCB2YWx1ZTogMHg1NzQxNTY0NSB9LCAvLyBoZXggcmVwcmVzZW50YXRpb24gb2Ygc3RyaW5nIFwiV0FWRVwiXG4gIFNBTVBMRV9SQVRFOiB7IG9mZnNldDogMjQgfSxcbiAgU1VCQ0hVTksxX0lEOiB7IG9mZnNldDogMTIsIHZhbHVlOiAweDY2NmQ3NDIwIH0sIC8vIGhleCByZXByZXNlbnRhdGlvbiBvZiBzdHJpbmcgXCJmbXQgXCIgLSBpZGVudGlmaWVzIHRoZSBzdGFydCBvZiBcImZvcm1hdFwiIHNlY3Rpb24gb2YgdGhlIGhlYWRlclxuICBTVUJDSFVOSzFfU0laRTogeyBvZmZzZXQ6IDE2LCB2YWx1ZTogMTYgfSwgLy8gU3ViY2h1bmsxIFNpemUgd2l0aG91dCBTVUJDSFVOSzFfSUQgYW5kIFNVQkNIVU5LMV9TSVpFIGZpZWxkc1xuICBTVUJDSFVOSzJfSUQ6IHsgb2Zmc2V0OiAzNiwgdmFsdWU6IDB4NjQ2MTc0NjEgfSwgLy8gaGV4IHJlcHJlc2VudGF0aW9uIG9mIHN0cmluZyBcImRhdGFcIiAtIGlkZW50aWZpZXMgdGhlIHN0YXJ0IG9mIGFjdHVhbCBhdWRpbyBkYXRhIHNlY3Rpb25cbiAgU1VCQ0hVTksyX1NJWkU6IHsgb2Zmc2V0OiA0MCB9LCAvLyBhY3R1YWwgYXVkaW8gZGF0YSBzaXplXG59IGFzIGNvbnN0O1xuXG50eXBlIFdyaXRlV2F2ZUhlYWRlclBhcmFtcyA9IHtcbiAgYXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyO1xuICAvLyAxIC0gbW9ubywgMiAtIHN0ZXJlb1xuICBjaGFubmVsQ291bnQ6IG51bWJlcjtcbiAgLy8gTnVtYmVyIG9mIHNhbXBsZXMgcGVyIHNlY29uZCwgZS5nLiA0NDEwMEh6XG4gIHNhbXBsZVJhdGU6IG51bWJlcjtcbn07XG5cbnR5cGUgV3JpdGVBdWRpb0RhdGFQYXJhbXMgPSB7XG4gIGFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlcjtcbiAgZGF0YUJ5Q2hhbm5lbDogRmxvYXQzMkFycmF5W107XG59O1xuXG4vKipcbiAqIFRoZSBgVHJhbnNjb2RlclNlcnZpY2VgIGlzIHVzZWQgdG8gdHJhbnNjaWJlIGF1ZGlvIHJlY29yZGluZyB0byBhIGZvcm1hdCB0aGF0J3Mgc3VwcG9ydGVkIGJ5IGFsbCBtYWpvciBicm93c2Vycy4gVGhlIFNESyB1c2VzIHRoaXMgdG8gY3JlYXRlIHZvaWNlIG1lc3NhZ2VzLlxuICpcbiAqIElmIHlvdSB3YW50IHRvIHVzZSB5b3VyIG93biB0cmFuc2NvZGVyIHlvdSBjYW4gcHJvdmlkZSBhIGBjdXN0b21UcmFuc2NvZGVyYC5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiBOZ01vZHVsZSB9KVxuZXhwb3J0IGNsYXNzIFRyYW5zY29kZXJTZXJ2aWNlIHtcbiAgY29uZmlnOiBUcmFuc2NvZGVyQ29uZmlnID0ge1xuICAgIHNhbXBsZVJhdGU6IDE2MDAwLFxuICB9O1xuICBjdXN0b21UcmFuc2NvZGVyPzogKGJsb2I6IEJsb2IpID0+IEJsb2IgfCBQcm9taXNlPEJsb2I+O1xuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IHRyYW5zY29kZXIgd2lsbCBsZWF2ZSBhdWRpby9tcDQgZmlsZXMgYXMgaXMsIGFuZCB0cmFuc2NvZGUgd2VibSBmaWxlcyB0byB3YXYuIElmIHlvdSB3YW50IHRvIGN1c3RvbWl6ZSB0aGlzLCB5b3UgY2FuIHByb3ZpZGUgeW91ciBvd24gdHJhbnNjb2RlciB1c2luZyB0aGUgYGN1c3RvbVRyYW5zY29kZXJgIGZpZWxkXG4gICAqIEBwYXJhbSBibG9iXG4gICAqIEByZXR1cm5zIHRoZSB0cmFuc2NvZGVkIGZpbGVcbiAgICovXG4gIGFzeW5jIHRyYW5zY29kZShibG9iOiBCbG9iKSB7XG4gICAgaWYgKHRoaXMuY3VzdG9tVHJhbnNjb2Rlcikge1xuICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tVHJhbnNjb2RlcihibG9iKTtcbiAgICB9XG4gICAgaWYgKGJsb2IudHlwZS5pbmNsdWRlcygnYXVkaW8vbXA0JykpIHtcbiAgICAgIHJldHVybiBibG9iO1xuICAgIH1cbiAgICBjb25zdCBhdWRpb0J1ZmZlciA9IGF3YWl0IHRoaXMucmVuZGVyQXVkaW8oXG4gICAgICBhd2FpdCB0aGlzLnRvQXVkaW9CdWZmZXIoYmxvYiksXG4gICAgICB0aGlzLmNvbmZpZy5zYW1wbGVSYXRlLFxuICAgICk7XG4gICAgY29uc3QgbnVtYmVyT2ZTYW1wbGVzID0gYXVkaW9CdWZmZXIuZHVyYXRpb24gKiB0aGlzLmNvbmZpZy5zYW1wbGVSYXRlO1xuICAgIGNvbnN0IGZpbGVTaXplQnl0ZXMgPVxuICAgICAgbnVtYmVyT2ZTYW1wbGVzICogYXVkaW9CdWZmZXIubnVtYmVyT2ZDaGFubmVscyAqIEJZVEVTX1BFUl9TQU1QTEUgK1xuICAgICAgV0FWX0hFQURFUl9MRU5HVEhfQllURVM7XG5cbiAgICBjb25zdCBhcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihmaWxlU2l6ZUJ5dGVzKTtcbiAgICB0aGlzLndyaXRlV2F2SGVhZGVyKHtcbiAgICAgIGFycmF5QnVmZmVyLFxuICAgICAgY2hhbm5lbENvdW50OiBhdWRpb0J1ZmZlci5udW1iZXJPZkNoYW5uZWxzLFxuICAgICAgc2FtcGxlUmF0ZTogdGhpcy5jb25maWcuc2FtcGxlUmF0ZSxcbiAgICB9KTtcbiAgICB0aGlzLndyaXRlV2F2QXVkaW9EYXRhKHtcbiAgICAgIGFycmF5QnVmZmVyLFxuICAgICAgZGF0YUJ5Q2hhbm5lbDogdGhpcy5zcGxpdERhdGFCeUNoYW5uZWwoYXVkaW9CdWZmZXIpLFxuICAgIH0pO1xuICAgIHJldHVybiBuZXcgQmxvYihbYXJyYXlCdWZmZXJdLCB7IHR5cGU6ICdhdWRpby93YXYnIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlbmRlckF1ZGlvKGF1ZGlvQnVmZmVyOiBBdWRpb0J1ZmZlciwgc2FtcGxlUmF0ZTogbnVtYmVyKSB7XG4gICAgY29uc3Qgb2ZmbGluZUF1ZGlvQ3R4ID0gbmV3IE9mZmxpbmVBdWRpb0NvbnRleHQoXG4gICAgICBhdWRpb0J1ZmZlci5udW1iZXJPZkNoYW5uZWxzLFxuICAgICAgYXVkaW9CdWZmZXIuZHVyYXRpb24gKiBzYW1wbGVSYXRlLFxuICAgICAgc2FtcGxlUmF0ZSxcbiAgICApO1xuICAgIGNvbnN0IHNvdXJjZSA9IG9mZmxpbmVBdWRpb0N0eC5jcmVhdGVCdWZmZXJTb3VyY2UoKTtcbiAgICBzb3VyY2UuYnVmZmVyID0gYXVkaW9CdWZmZXI7XG4gICAgc291cmNlLmNvbm5lY3Qob2ZmbGluZUF1ZGlvQ3R4LmRlc3RpbmF0aW9uKTtcbiAgICBzb3VyY2Uuc3RhcnQoKTtcblxuICAgIHJldHVybiBhd2FpdCBvZmZsaW5lQXVkaW9DdHguc3RhcnRSZW5kZXJpbmcoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyB0b0F1ZGlvQnVmZmVyKGJsb2I6IEJsb2IpIHtcbiAgICBjb25zdCBhdWRpb0N0eCA9IG5ldyBBdWRpb0NvbnRleHQoKTtcblxuICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgcmVhZEJsb2JBc0FycmF5QnVmZmVyKGJsb2IpO1xuICAgIGNvbnN0IGRlY29kZWREYXRhID0gYXdhaXQgYXVkaW9DdHguZGVjb2RlQXVkaW9EYXRhKGFycmF5QnVmZmVyKTtcbiAgICBpZiAoYXVkaW9DdHguc3RhdGUgIT09ICdjbG9zZWQnKSBhd2FpdCBhdWRpb0N0eC5jbG9zZSgpO1xuICAgIHJldHVybiBkZWNvZGVkRGF0YTtcbiAgfVxuXG4gIHByb3RlY3RlZCB3cml0ZVdhdkF1ZGlvRGF0YSh7XG4gICAgYXJyYXlCdWZmZXIsXG4gICAgZGF0YUJ5Q2hhbm5lbCxcbiAgfTogV3JpdGVBdWRpb0RhdGFQYXJhbXMpIHtcbiAgICBjb25zdCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhhcnJheUJ1ZmZlcik7XG4gICAgY29uc3QgY2hhbm5lbENvdW50ID0gZGF0YUJ5Q2hhbm5lbC5sZW5ndGg7XG5cbiAgICBkYXRhQnlDaGFubmVsLmZvckVhY2goKGNoYW5uZWxEYXRhLCBjaGFubmVsSW5kZXgpID0+IHtcbiAgICAgIGxldCB3cml0ZU9mZnNldCA9IFdBVl9IRUFERVJfTEVOR1RIX0JZVEVTICsgY2hhbm5lbENvdW50ICogY2hhbm5lbEluZGV4O1xuXG4gICAgICBjaGFubmVsRGF0YS5mb3JFYWNoKChmbG9hdDMyVmFsdWUpID0+IHtcbiAgICAgICAgZGF0YVZpZXcuc2V0SW50MTYoXG4gICAgICAgICAgd3JpdGVPZmZzZXQsXG4gICAgICAgICAgZmxvYXQzMlZhbHVlIDwgMFxuICAgICAgICAgICAgPyBNYXRoLm1heCgtMSwgZmxvYXQzMlZhbHVlKSAqIDMyNzY4XG4gICAgICAgICAgICA6IE1hdGgubWluKDEsIGZsb2F0MzJWYWx1ZSkgKiAzMjc2NyxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICApO1xuICAgICAgICB3cml0ZU9mZnNldCArPSBjaGFubmVsQ291bnQgKiBCWVRFU19QRVJfU0FNUExFO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgd3JpdGVXYXZIZWFkZXIoe1xuICAgIGFycmF5QnVmZmVyLFxuICAgIGNoYW5uZWxDb3VudCxcbiAgICBzYW1wbGVSYXRlLFxuICB9OiBXcml0ZVdhdmVIZWFkZXJQYXJhbXMpIHtcbiAgICBjb25zdCBieXRlUmF0ZSA9IHNhbXBsZVJhdGUgKiBjaGFubmVsQ291bnQgKiBCWVRFU19QRVJfU0FNUExFOyAvLyBieXRlcy9zZWNcbiAgICBjb25zdCBibG9ja0FsaWduID0gY2hhbm5lbENvdW50ICogQllURVNfUEVSX1NBTVBMRTtcblxuICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyKTtcbiAgICAvKlxuICAgICAqIFRoZSBtYXhpbXVtIHNpemUgb2YgYSBSSUZGIGZpbGUgaXMgNDI5NDk2NzI5NSBieXRlcyBhbmQgc2luY2UgdGhlIGhlYWRlciB0YWtlcyB1cCA0NCBieXRlcyB0aGVyZSBhcmUgNDI5NDk2NzI1MSBieXRlcyBsZWZ0IGZvciB0aGVcbiAgICAgKiBkYXRhIGNodW5rLlxuICAgICAqL1xuICAgIGNvbnN0IGRhdGFDaHVua1NpemUgPSBNYXRoLm1pbihcbiAgICAgIGRhdGFWaWV3LmJ5dGVMZW5ndGggLSBXQVZfSEVBREVSX0xFTkdUSF9CWVRFUyxcbiAgICAgIFJJRkZfRklMRV9NQVhfQllURVMgLSBXQVZfSEVBREVSX0xFTkdUSF9CWVRFUyxcbiAgICApO1xuXG4gICAgZGF0YVZpZXcuc2V0VWludDMyKEhFQURFUi5DSFVOS19JRC5vZmZzZXQsIEhFQURFUi5DSFVOS19JRC52YWx1ZSk7IC8vIFwiUklGRlwiXG4gICAgZGF0YVZpZXcuc2V0VWludDMyKFxuICAgICAgSEVBREVSLkNIVU5LX1NJWkUub2Zmc2V0LFxuICAgICAgYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCAtIDgsXG4gICAgICB0cnVlLFxuICAgICk7IC8vIGFkanVzdG1lbnQgZm9yIHRoZSBmaXJzdCB0d28gaGVhZGVycyAtIGNodW5rIGlkICsgZmlsZSBzaXplXG4gICAgZGF0YVZpZXcuc2V0VWludDMyKEhFQURFUi5GSUxFX0ZPUk1BVC5vZmZzZXQsIEhFQURFUi5GSUxFX0ZPUk1BVC52YWx1ZSk7IC8vIFwiV0FWRVwiXG5cbiAgICBkYXRhVmlldy5zZXRVaW50MzIoSEVBREVSLlNVQkNIVU5LMV9JRC5vZmZzZXQsIEhFQURFUi5TVUJDSFVOSzFfSUQudmFsdWUpOyAvLyBcImZtdCBcIlxuICAgIGRhdGFWaWV3LnNldFVpbnQzMihcbiAgICAgIEhFQURFUi5TVUJDSFVOSzFfU0laRS5vZmZzZXQsXG4gICAgICBIRUFERVIuU1VCQ0hVTksxX1NJWkUudmFsdWUsXG4gICAgICB0cnVlLFxuICAgICk7XG4gICAgZGF0YVZpZXcuc2V0VWludDE2KFxuICAgICAgSEVBREVSLkFVRElPX0ZPUk1BVC5vZmZzZXQsXG4gICAgICBIRUFERVIuQVVESU9fRk9STUFULnZhbHVlLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICAgIGRhdGFWaWV3LnNldFVpbnQxNihIRUFERVIuQ0hBTk5FTF9DT1VOVC5vZmZzZXQsIGNoYW5uZWxDb3VudCwgdHJ1ZSk7XG4gICAgZGF0YVZpZXcuc2V0VWludDMyKEhFQURFUi5TQU1QTEVfUkFURS5vZmZzZXQsIHNhbXBsZVJhdGUsIHRydWUpO1xuICAgIGRhdGFWaWV3LnNldFVpbnQzMihIRUFERVIuQllURV9SQVRFLm9mZnNldCwgYnl0ZVJhdGUsIHRydWUpO1xuICAgIGRhdGFWaWV3LnNldFVpbnQxNihIRUFERVIuQkxPQ0tfQUxJR04ub2Zmc2V0LCBibG9ja0FsaWduLCB0cnVlKTtcbiAgICBkYXRhVmlldy5zZXRVaW50MTYoXG4gICAgICBIRUFERVIuQklUU19QRVJfU0FNUExFLm9mZnNldCxcbiAgICAgIEhFQURFUi5CSVRTX1BFUl9TQU1QTEUudmFsdWUsXG4gICAgICB0cnVlLFxuICAgICk7XG5cbiAgICBkYXRhVmlldy5zZXRVaW50MzIoSEVBREVSLlNVQkNIVU5LMl9JRC5vZmZzZXQsIEhFQURFUi5TVUJDSFVOSzJfSUQudmFsdWUpOyAvLyBcImRhdGFcIlxuICAgIGRhdGFWaWV3LnNldFVpbnQzMihIRUFERVIuU1VCQ0hVTksyX1NJWkUub2Zmc2V0LCBkYXRhQ2h1bmtTaXplLCB0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzcGxpdERhdGFCeUNoYW5uZWwgPSAoYXVkaW9CdWZmZXI6IEF1ZGlvQnVmZmVyKSA9PlxuICAgIEFycmF5LmZyb20oeyBsZW5ndGg6IGF1ZGlvQnVmZmVyLm51bWJlck9mQ2hhbm5lbHMgfSwgKF8sIGkpID0+XG4gICAgICBhdWRpb0J1ZmZlci5nZXRDaGFubmVsRGF0YShpKSxcbiAgICApO1xufVxuIl19
|
package/esm2022/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.mjs
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { Component } from '@angular/core';
|
|
2
|
-
import { formatDuration } from '../../format-duration';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "../amplitude-recorder.service";
|
|
5
|
-
import * as i2 from "../audio-recorder.service";
|
|
6
|
-
import * as i3 from "@angular/common";
|
|
7
|
-
/**
|
|
8
|
-
* The `VoiceRecorderWavebarComponent` displays the amplitudes of the recording while the recoding is in progress
|
|
9
|
-
*/
|
|
10
|
-
export class VoiceRecorderWavebarComponent {
|
|
11
|
-
constructor(amplitudeRecorder, audioRecorder) {
|
|
12
|
-
this.amplitudeRecorder = amplitudeRecorder;
|
|
13
|
-
this.audioRecorder = audioRecorder;
|
|
14
|
-
this.isLongerThanOneHour = false;
|
|
15
|
-
this.amplitudes$ = this.amplitudeRecorder.amplitudes$;
|
|
16
|
-
this.formattedDuration = formatDuration(this.audioRecorder.durationMs / 1000);
|
|
17
|
-
this.durationComputeInterval = setInterval(() => {
|
|
18
|
-
this.isLongerThanOneHour = this.audioRecorder.durationMs / 1000 > 3600;
|
|
19
|
-
this.formattedDuration = formatDuration(this.audioRecorder.durationMs / 1000);
|
|
20
|
-
}, 1000);
|
|
21
|
-
}
|
|
22
|
-
ngOnDestroy() {
|
|
23
|
-
clearInterval(this.durationComputeInterval);
|
|
24
|
-
}
|
|
25
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: VoiceRecorderWavebarComponent, deps: [{ token: i1.AmplitudeRecorderService }, { token: i2.AudioRecorderService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
26
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.0.0", type: VoiceRecorderWavebarComponent, selector: "stream-voice-recorder-wavebar", ngImport: i0, template: "<div\n class=\"str-chat__recording-timer\"\n [class.str-chat__recording-timer--hours]=\"isLongerThanOneHour\"\n>\n {{ formattedDuration }}\n</div>\n<div class=\"str-chat__waveform-box-container\">\n <div class=\"str-chat__audio_recorder__waveform-box\">\n @for (amplitude of amplitudes$ | async; track $index) {\n <div\n class=\"str-chat__wave-progress-bar__amplitude-bar\"\n [style.--str-chat__wave-progress-bar__amplitude-bar-height]=\"\n (amplitude ?? 0) * 100 + '%'\n \"\n ></div>\n }\n </div>\n</div>\n", dependencies: [{ kind: "pipe", type: i3.AsyncPipe, name: "async" }] }); }
|
|
27
|
-
}
|
|
28
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: VoiceRecorderWavebarComponent, decorators: [{
|
|
29
|
-
type: Component,
|
|
30
|
-
args: [{ selector: 'stream-voice-recorder-wavebar', template: "<div\n class=\"str-chat__recording-timer\"\n [class.str-chat__recording-timer--hours]=\"isLongerThanOneHour\"\n>\n {{ formattedDuration }}\n</div>\n<div class=\"str-chat__waveform-box-container\">\n <div class=\"str-chat__audio_recorder__waveform-box\">\n @for (amplitude of amplitudes$ | async; track $index) {\n <div\n class=\"str-chat__wave-progress-bar__amplitude-bar\"\n [style.--str-chat__wave-progress-bar__amplitude-bar-height]=\"\n (amplitude ?? 0) * 100 + '%'\n \"\n ></div>\n }\n </div>\n</div>\n" }]
|
|
31
|
-
}], ctorParameters: () => [{ type: i1.AmplitudeRecorderService }, { type: i2.AudioRecorderService }] });
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2UtcmVjb3JkZXItd2F2ZWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvdm9pY2UtcmVjb3JkZXIvdm9pY2UtcmVjb3JkZXItd2F2ZWJhci92b2ljZS1yZWNvcmRlci13YXZlYmFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi92b2ljZS1yZWNvcmRlci92b2ljZS1yZWNvcmRlci13YXZlYmFyL3ZvaWNlLXJlY29yZGVyLXdhdmViYXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUlyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7O0FBRXZEOztHQUVHO0FBTUgsTUFBTSxPQUFPLDZCQUE2QjtJQU14QyxZQUNVLGlCQUEyQyxFQUMzQyxhQUFtQztRQURuQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQTBCO1FBQzNDLGtCQUFhLEdBQWIsYUFBYSxDQUFzQjtRQUo3Qyx3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFNMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDO1FBQ3RELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxjQUFjLENBQ3JDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxHQUFHLElBQUksQ0FDckMsQ0FBQztRQUNGLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQzlDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxjQUFjLENBQ3JDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxHQUFHLElBQUksQ0FDckMsQ0FBQztRQUNKLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxXQUFXO1FBQ1QsYUFBYSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQzlDLENBQUM7OEdBeEJVLDZCQUE2QjtrR0FBN0IsNkJBQTZCLHFFQ2QxQyxnakJBa0JBOzsyRkRKYSw2QkFBNkI7a0JBTHpDLFNBQVM7K0JBQ0UsK0JBQStCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFtcGxpdHVkZVJlY29yZGVyU2VydmljZSB9IGZyb20gJy4uL2FtcGxpdHVkZS1yZWNvcmRlci5zZXJ2aWNlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEF1ZGlvUmVjb3JkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vYXVkaW8tcmVjb3JkZXIuc2VydmljZSc7XG5pbXBvcnQgeyBmb3JtYXREdXJhdGlvbiB9IGZyb20gJy4uLy4uL2Zvcm1hdC1kdXJhdGlvbic7XG5cbi8qKlxuICogVGhlIGBWb2ljZVJlY29yZGVyV2F2ZWJhckNvbXBvbmVudGAgZGlzcGxheXMgdGhlIGFtcGxpdHVkZXMgb2YgdGhlIHJlY29yZGluZyB3aGlsZSB0aGUgcmVjb2RpbmcgaXMgaW4gcHJvZ3Jlc3NcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3RyZWFtLXZvaWNlLXJlY29yZGVyLXdhdmViYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vdm9pY2UtcmVjb3JkZXItd2F2ZWJhci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlczogW10sXG59KVxuZXhwb3J0IGNsYXNzIFZvaWNlUmVjb3JkZXJXYXZlYmFyQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgYW1wbGl0dWRlcyQ6IE9ic2VydmFibGU8bnVtYmVyW10+O1xuICBmb3JtYXR0ZWREdXJhdGlvbjogc3RyaW5nO1xuICBkdXJhdGlvbkNvbXB1dGVJbnRlcnZhbDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+O1xuICBpc0xvbmdlclRoYW5PbmVIb3VyID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhbXBsaXR1ZGVSZWNvcmRlcjogQW1wbGl0dWRlUmVjb3JkZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXVkaW9SZWNvcmRlcjogQXVkaW9SZWNvcmRlclNlcnZpY2UsXG4gICkge1xuICAgIHRoaXMuYW1wbGl0dWRlcyQgPSB0aGlzLmFtcGxpdHVkZVJlY29yZGVyLmFtcGxpdHVkZXMkO1xuICAgIHRoaXMuZm9ybWF0dGVkRHVyYXRpb24gPSBmb3JtYXREdXJhdGlvbihcbiAgICAgIHRoaXMuYXVkaW9SZWNvcmRlci5kdXJhdGlvbk1zIC8gMTAwMCxcbiAgICApO1xuICAgIHRoaXMuZHVyYXRpb25Db21wdXRlSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLmlzTG9uZ2VyVGhhbk9uZUhvdXIgPSB0aGlzLmF1ZGlvUmVjb3JkZXIuZHVyYXRpb25NcyAvIDEwMDAgPiAzNjAwO1xuICAgICAgdGhpcy5mb3JtYXR0ZWREdXJhdGlvbiA9IGZvcm1hdER1cmF0aW9uKFxuICAgICAgICB0aGlzLmF1ZGlvUmVjb3JkZXIuZHVyYXRpb25NcyAvIDEwMDAsXG4gICAgICApO1xuICAgIH0sIDEwMDApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLmR1cmF0aW9uQ29tcHV0ZUludGVydmFsKTtcbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cInN0ci1jaGF0X19yZWNvcmRpbmctdGltZXJcIlxuICBbY2xhc3Muc3RyLWNoYXRfX3JlY29yZGluZy10aW1lci0taG91cnNdPVwiaXNMb25nZXJUaGFuT25lSG91clwiXG4+XG4gIHt7IGZvcm1hdHRlZER1cmF0aW9uIH19XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJzdHItY2hhdF9fd2F2ZWZvcm0tYm94LWNvbnRhaW5lclwiPlxuICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX2F1ZGlvX3JlY29yZGVyX193YXZlZm9ybS1ib3hcIj5cbiAgICBAZm9yIChhbXBsaXR1ZGUgb2YgYW1wbGl0dWRlcyQgfCBhc3luYzsgdHJhY2sgJGluZGV4KSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX3dhdmUtcHJvZ3Jlc3MtYmFyX19hbXBsaXR1ZGUtYmFyXCJcbiAgICAgICAgW3N0eWxlLi0tc3RyLWNoYXRfX3dhdmUtcHJvZ3Jlc3MtYmFyX19hbXBsaXR1ZGUtYmFyLWhlaWdodF09XCJcbiAgICAgICAgICAoYW1wbGl0dWRlID8/IDApICogMTAwICsgJyUnXG4gICAgICAgIFwiXG4gICAgICA+PC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|