@banta/sdk 4.9.0 → 5.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/{esm2020 → esm2022}/banta-sdk.mjs +4 -4
- package/{esm2020 → esm2022}/lib/attachment-scraper.mjs +1 -1
- package/esm2022/lib/banta/banta.component.mjs +204 -0
- package/{esm2020 → esm2022}/lib/banta-logo.component.mjs +11 -11
- package/esm2022/lib/banta-sdk.module.mjs +143 -0
- package/esm2022/lib/chat/banta-chat/banta-chat.component.mjs +187 -0
- package/esm2022/lib/chat/chat-message/chat-message.component.mjs +62 -0
- package/esm2022/lib/chat/chat-view/chat-view.component.mjs +170 -0
- package/{esm2020 → esm2022}/lib/chat/chat.module.mjs +51 -51
- package/{esm2020 → esm2022}/lib/chat/index.mjs +5 -5
- package/esm2022/lib/chat/live-chat-message.component.mjs +80 -0
- package/{esm2020 → esm2022}/lib/chat-backend-base.mjs +30 -30
- package/esm2022/lib/chat-backend.mjs +163 -0
- package/{esm2020 → esm2022}/lib/chat-source-base.mjs +1 -1
- package/esm2022/lib/chat-source.mjs +233 -0
- package/esm2022/lib/comments/attachment-button/attachment-button.component.mjs +76 -0
- package/esm2022/lib/comments/attachment-scraper.directive.mjs +107 -0
- package/esm2022/lib/comments/banta-comments/banta-comments.component.mjs +739 -0
- package/esm2022/lib/comments/comment/comment.component.mjs +175 -0
- package/esm2022/lib/comments/comment-field/comment-field.component.mjs +401 -0
- package/esm2022/lib/comments/comment-sort/comment-sort.component.mjs +37 -0
- package/esm2022/lib/comments/comment-view/comment-view.component.mjs +470 -0
- package/esm2022/lib/comments/comments.module.mjs +111 -0
- package/{esm2020 → esm2022}/lib/comments/index.mjs +10 -10
- package/esm2022/lib/comments/live-comment.component.mjs +80 -0
- package/{esm2020 → esm2022}/lib/comments/reply-send-options.directive.mjs +13 -13
- package/esm2022/lib/common/attachment/attachment.component.mjs +112 -0
- package/{esm2020 → esm2022}/lib/common/attachments/attachments.component.mjs +75 -75
- package/{esm2020 → esm2022}/lib/common/common.module.mjs +68 -68
- package/{esm2020 → esm2022}/lib/common/index.mjs +10 -10
- package/{esm2020 → esm2022}/lib/common/lazy-connection.mjs +14 -14
- package/esm2022/lib/common/lightbox/lightbox.component.mjs +31 -0
- package/esm2022/lib/common/markdown-to-html.pipe.mjs +89 -0
- package/esm2022/lib/common/mention-linker.pipe.mjs +35 -0
- package/esm2022/lib/common/timer-pool.service.mjs +83 -0
- package/esm2022/lib/common/timestamp.component.mjs +123 -0
- package/{esm2020 → esm2022}/lib/common/trust-resource-url.pipe.mjs +22 -22
- package/esm2022/lib/emoji/emoji-selector-button.component.mjs +115 -0
- package/esm2022/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.mjs +98 -0
- package/{esm2020 → esm2022}/lib/emoji/emoji.module.mjs +55 -55
- package/{esm2020 → esm2022}/lib/emoji/emojis.mjs +6507 -6507
- package/{esm2020 → esm2022}/lib/emoji/index.mjs +4 -4
- package/esm2022/lib/giphy-attachments.mjs +16 -0
- package/{esm2020 → esm2022}/lib/index.mjs +19 -19
- package/{esm2020 → esm2022}/lib/live-message.component.mjs +61 -61
- package/{esm2020 → esm2022}/lib/message-menu-item.mjs +1 -1
- package/{esm2020 → esm2022}/lib/sdk-options.mjs +1 -1
- package/esm2022/lib/static-chat-source.mjs +71 -0
- package/esm2022/lib/tweet-attachments.mjs +13 -0
- package/esm2022/lib/url-attachments.mjs +42 -0
- package/esm2022/lib/youtube-attachments.mjs +29 -0
- package/{esm2020 → esm2022}/public-api.mjs +4 -4
- package/{fesm2020 → fesm2022}/banta-sdk.mjs +10753 -10754
- package/fesm2022/banta-sdk.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/attachment-scraper.d.ts +15 -15
- package/lib/banta/banta.component.d.ts +58 -58
- package/lib/banta-logo.component.d.ts +5 -5
- package/lib/banta-sdk.module.d.ts +31 -31
- package/lib/chat/banta-chat/banta-chat.component.d.ts +70 -70
- package/lib/chat/chat-message/chat-message.component.d.ts +21 -21
- package/lib/chat/chat-view/chat-view.component.d.ts +52 -52
- package/lib/chat/chat.module.d.ts +15 -15
- package/lib/chat/index.d.ts +5 -5
- package/lib/chat/live-chat-message.component.d.ts +23 -23
- package/lib/chat-backend-base.d.ts +36 -36
- package/lib/chat-backend.d.ts +55 -55
- package/lib/chat-source-base.d.ts +44 -44
- package/lib/chat-source.d.ts +65 -65
- package/lib/comments/attachment-button/attachment-button.component.d.ts +17 -17
- package/lib/comments/attachment-scraper.directive.d.ts +21 -21
- package/lib/comments/banta-comments/banta-comments.component.d.ts +196 -196
- package/lib/comments/comment/comment.component.d.ts +72 -72
- package/lib/comments/comment-field/comment-field.component.d.ts +89 -89
- package/lib/comments/comment-sort/comment-sort.component.d.ts +12 -12
- package/lib/comments/comment-view/comment-view.component.d.ts +121 -121
- package/lib/comments/comments.module.d.ts +30 -30
- package/lib/comments/index.d.ts +10 -10
- package/lib/comments/live-comment.component.d.ts +23 -23
- package/lib/comments/reply-send-options.directive.d.ts +5 -5
- package/lib/common/attachment/attachment.component.d.ts +33 -33
- package/lib/common/attachments/attachments.component.d.ts +26 -26
- package/lib/common/common.module.d.ts +19 -19
- package/lib/common/index.d.ts +10 -10
- package/lib/common/lazy-connection.d.ts +6 -6
- package/lib/common/lightbox/lightbox.component.d.ts +14 -14
- package/lib/common/markdown-to-html.pipe.d.ts +15 -15
- package/lib/common/mention-linker.pipe.d.ts +13 -13
- package/lib/common/timer-pool.service.d.ts +15 -15
- package/lib/common/timestamp.component.d.ts +19 -19
- package/lib/common/trust-resource-url.pipe.d.ts +10 -10
- package/lib/emoji/emoji-selector-button.component.d.ts +30 -30
- package/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.d.ts +26 -26
- package/lib/emoji/emoji.module.d.ts +16 -16
- package/lib/emoji/emojis.d.ts +6507 -6507
- package/lib/emoji/index.d.ts +4 -4
- package/lib/giphy-attachments.d.ts +5 -5
- package/lib/index.d.ts +19 -19
- package/lib/live-message.component.d.ts +22 -22
- package/lib/message-menu-item.d.ts +6 -6
- package/lib/sdk-options.d.ts +5 -5
- package/lib/static-chat-source.d.ts +42 -42
- package/lib/tweet-attachments.d.ts +5 -5
- package/lib/url-attachments.d.ts +14 -14
- package/lib/youtube-attachments.d.ts +5 -5
- package/package.json +15 -21
- package/public-api.d.ts +1 -1
- package/esm2020/lib/banta/banta.component.mjs +0 -204
- package/esm2020/lib/banta-sdk.module.mjs +0 -143
- package/esm2020/lib/chat/banta-chat/banta-chat.component.mjs +0 -187
- package/esm2020/lib/chat/chat-message/chat-message.component.mjs +0 -62
- package/esm2020/lib/chat/chat-view/chat-view.component.mjs +0 -170
- package/esm2020/lib/chat/live-chat-message.component.mjs +0 -80
- package/esm2020/lib/chat-backend.mjs +0 -163
- package/esm2020/lib/chat-source.mjs +0 -233
- package/esm2020/lib/comments/attachment-button/attachment-button.component.mjs +0 -76
- package/esm2020/lib/comments/attachment-scraper.directive.mjs +0 -107
- package/esm2020/lib/comments/banta-comments/banta-comments.component.mjs +0 -740
- package/esm2020/lib/comments/comment/comment.component.mjs +0 -175
- package/esm2020/lib/comments/comment-field/comment-field.component.mjs +0 -401
- package/esm2020/lib/comments/comment-sort/comment-sort.component.mjs +0 -37
- package/esm2020/lib/comments/comment-view/comment-view.component.mjs +0 -470
- package/esm2020/lib/comments/comments.module.mjs +0 -111
- package/esm2020/lib/comments/live-comment.component.mjs +0 -80
- package/esm2020/lib/common/attachment/attachment.component.mjs +0 -112
- package/esm2020/lib/common/lightbox/lightbox.component.mjs +0 -31
- package/esm2020/lib/common/markdown-to-html.pipe.mjs +0 -89
- package/esm2020/lib/common/mention-linker.pipe.mjs +0 -35
- package/esm2020/lib/common/timer-pool.service.mjs +0 -83
- package/esm2020/lib/common/timestamp.component.mjs +0 -123
- package/esm2020/lib/emoji/emoji-selector-button.component.mjs +0 -116
- package/esm2020/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.mjs +0 -98
- package/esm2020/lib/giphy-attachments.mjs +0 -16
- package/esm2020/lib/static-chat-source.mjs +0 -71
- package/esm2020/lib/tweet-attachments.mjs +0 -13
- package/esm2020/lib/url-attachments.mjs +0 -42
- package/esm2020/lib/youtube-attachments.mjs +0 -29
- package/fesm2015/banta-sdk.mjs +0 -11181
- package/fesm2015/banta-sdk.mjs.map +0 -1
- package/fesm2020/banta-sdk.mjs.map +0 -1
|
@@ -1,68 +1,68 @@
|
|
|
1
|
-
import { NgModule } from '@angular/core';
|
|
2
|
-
import { TimestampComponent } from './timestamp.component';
|
|
3
|
-
import { CommonModule } from '@angular/common';
|
|
4
|
-
import { LightboxComponent } from './lightbox/lightbox.component';
|
|
5
|
-
import { MatIconModule } from '@angular/material/icon';
|
|
6
|
-
import { BantaMarkdownToHtmlPipe } from './markdown-to-html.pipe';
|
|
7
|
-
import { BantaAttachmentsComponent } from './attachments/attachments.component';
|
|
8
|
-
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
|
9
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
10
|
-
import { BantaTrustResourceUrlPipe } from './trust-resource-url.pipe';
|
|
11
|
-
import { BantaAttachmentComponent } from './attachment/attachment.component';
|
|
12
|
-
import { BantaMentionLinkerPipe } from './mention-linker.pipe';
|
|
13
|
-
import { TimerPool } from './timer-pool.service';
|
|
14
|
-
import * as i0 from "@angular/core";
|
|
15
|
-
const COMPONENTS = [
|
|
16
|
-
TimestampComponent,
|
|
17
|
-
LightboxComponent,
|
|
18
|
-
BantaMarkdownToHtmlPipe,
|
|
19
|
-
BantaMentionLinkerPipe,
|
|
20
|
-
BantaTrustResourceUrlPipe,
|
|
21
|
-
BantaAttachmentComponent,
|
|
22
|
-
BantaAttachmentsComponent
|
|
23
|
-
];
|
|
24
|
-
export class BantaCommonModule {
|
|
25
|
-
static forRoot() {
|
|
26
|
-
return {
|
|
27
|
-
ngModule: BantaCommonModule,
|
|
28
|
-
providers: [
|
|
29
|
-
TimerPool
|
|
30
|
-
]
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
56
|
-
type: NgModule,
|
|
57
|
-
args: [{
|
|
58
|
-
declarations: COMPONENTS,
|
|
59
|
-
imports: [
|
|
60
|
-
CommonModule,
|
|
61
|
-
MatIconModule,
|
|
62
|
-
MatProgressSpinnerModule,
|
|
63
|
-
MatButtonModule
|
|
64
|
-
],
|
|
65
|
-
exports: COMPONENTS
|
|
66
|
-
}]
|
|
67
|
-
}] });
|
|
68
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { TimestampComponent } from './timestamp.component';
|
|
3
|
+
import { CommonModule } from '@angular/common';
|
|
4
|
+
import { LightboxComponent } from './lightbox/lightbox.component';
|
|
5
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
6
|
+
import { BantaMarkdownToHtmlPipe } from './markdown-to-html.pipe';
|
|
7
|
+
import { BantaAttachmentsComponent } from './attachments/attachments.component';
|
|
8
|
+
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
|
9
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
10
|
+
import { BantaTrustResourceUrlPipe } from './trust-resource-url.pipe';
|
|
11
|
+
import { BantaAttachmentComponent } from './attachment/attachment.component';
|
|
12
|
+
import { BantaMentionLinkerPipe } from './mention-linker.pipe';
|
|
13
|
+
import { TimerPool } from './timer-pool.service';
|
|
14
|
+
import * as i0 from "@angular/core";
|
|
15
|
+
const COMPONENTS = [
|
|
16
|
+
TimestampComponent,
|
|
17
|
+
LightboxComponent,
|
|
18
|
+
BantaMarkdownToHtmlPipe,
|
|
19
|
+
BantaMentionLinkerPipe,
|
|
20
|
+
BantaTrustResourceUrlPipe,
|
|
21
|
+
BantaAttachmentComponent,
|
|
22
|
+
BantaAttachmentsComponent
|
|
23
|
+
];
|
|
24
|
+
export class BantaCommonModule {
|
|
25
|
+
static forRoot() {
|
|
26
|
+
return {
|
|
27
|
+
ngModule: BantaCommonModule,
|
|
28
|
+
providers: [
|
|
29
|
+
TimerPool
|
|
30
|
+
]
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: BantaCommonModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
34
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.8", ngImport: i0, type: BantaCommonModule, declarations: [TimestampComponent,
|
|
35
|
+
LightboxComponent,
|
|
36
|
+
BantaMarkdownToHtmlPipe,
|
|
37
|
+
BantaMentionLinkerPipe,
|
|
38
|
+
BantaTrustResourceUrlPipe,
|
|
39
|
+
BantaAttachmentComponent,
|
|
40
|
+
BantaAttachmentsComponent], imports: [CommonModule,
|
|
41
|
+
MatIconModule,
|
|
42
|
+
MatProgressSpinnerModule,
|
|
43
|
+
MatButtonModule], exports: [TimestampComponent,
|
|
44
|
+
LightboxComponent,
|
|
45
|
+
BantaMarkdownToHtmlPipe,
|
|
46
|
+
BantaMentionLinkerPipe,
|
|
47
|
+
BantaTrustResourceUrlPipe,
|
|
48
|
+
BantaAttachmentComponent,
|
|
49
|
+
BantaAttachmentsComponent] }); }
|
|
50
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: BantaCommonModule, imports: [CommonModule,
|
|
51
|
+
MatIconModule,
|
|
52
|
+
MatProgressSpinnerModule,
|
|
53
|
+
MatButtonModule] }); }
|
|
54
|
+
}
|
|
55
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: BantaCommonModule, decorators: [{
|
|
56
|
+
type: NgModule,
|
|
57
|
+
args: [{
|
|
58
|
+
declarations: COMPONENTS,
|
|
59
|
+
imports: [
|
|
60
|
+
CommonModule,
|
|
61
|
+
MatIconModule,
|
|
62
|
+
MatProgressSpinnerModule,
|
|
63
|
+
MatButtonModule
|
|
64
|
+
],
|
|
65
|
+
exports: COMPONENTS
|
|
66
|
+
}]
|
|
67
|
+
}] });
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Nkay9zcmMvbGliL2NvbW1vbi9jb21tb24ubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQXVCLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDaEYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFFakQsTUFBTSxVQUFVLEdBQUc7SUFDZixrQkFBa0I7SUFDbEIsaUJBQWlCO0lBQ2pCLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIseUJBQXlCO0lBQ3pCLHdCQUF3QjtJQUN4Qix5QkFBeUI7Q0FDNUIsQ0FBQztBQVlGLE1BQU0sT0FBTyxpQkFBaUI7SUFDMUIsTUFBTSxDQUFDLE9BQU87UUFDVixPQUFPO1lBQ0gsUUFBUSxFQUFFLGlCQUFpQjtZQUMzQixTQUFTLEVBQUU7Z0JBQ1AsU0FBUzthQUNaO1NBQ0osQ0FBQTtJQUNMLENBQUM7OEdBUlEsaUJBQWlCOytHQUFqQixpQkFBaUIsaUJBbkIxQixrQkFBa0I7WUFDbEIsaUJBQWlCO1lBQ2pCLHVCQUF1QjtZQUN2QixzQkFBc0I7WUFDdEIseUJBQXlCO1lBQ3pCLHdCQUF3QjtZQUN4Qix5QkFBeUIsYUFNckIsWUFBWTtZQUNaLGFBQWE7WUFDYix3QkFBd0I7WUFDeEIsZUFBZSxhQWZuQixrQkFBa0I7WUFDbEIsaUJBQWlCO1lBQ2pCLHVCQUF1QjtZQUN2QixzQkFBc0I7WUFDdEIseUJBQXlCO1lBQ3pCLHdCQUF3QjtZQUN4Qix5QkFBeUI7K0dBYWhCLGlCQUFpQixZQVB0QixZQUFZO1lBQ1osYUFBYTtZQUNiLHdCQUF3QjtZQUN4QixlQUFlOzsyRkFJVixpQkFBaUI7a0JBVjdCLFFBQVE7bUJBQUM7b0JBQ04sWUFBWSxFQUFFLFVBQVU7b0JBQ3hCLE9BQU8sRUFBRTt3QkFDTCxZQUFZO3dCQUNaLGFBQWE7d0JBQ2Isd0JBQXdCO3dCQUN4QixlQUFlO3FCQUNsQjtvQkFDRCxPQUFPLEVBQUUsVUFBVTtpQkFDdEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSwgTW9kdWxlV2l0aFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUaW1lc3RhbXBDb21wb25lbnQgfSBmcm9tICcuL3RpbWVzdGFtcC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBMaWdodGJveENvbXBvbmVudCB9IGZyb20gJy4vbGlnaHRib3gvbGlnaHRib3guY29tcG9uZW50JztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBCYW50YU1hcmtkb3duVG9IdG1sUGlwZSB9IGZyb20gJy4vbWFya2Rvd24tdG8taHRtbC5waXBlJztcclxuaW1wb3J0IHsgQmFudGFBdHRhY2htZW50c0NvbXBvbmVudCB9IGZyb20gJy4vYXR0YWNobWVudHMvYXR0YWNobWVudHMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3Mtc3Bpbm5lcic7XHJcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IEJhbnRhVHJ1c3RSZXNvdXJjZVVybFBpcGUgfSBmcm9tICcuL3RydXN0LXJlc291cmNlLXVybC5waXBlJztcclxuaW1wb3J0IHsgQmFudGFBdHRhY2htZW50Q29tcG9uZW50IH0gZnJvbSAnLi9hdHRhY2htZW50L2F0dGFjaG1lbnQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQmFudGFNZW50aW9uTGlua2VyUGlwZSB9IGZyb20gJy4vbWVudGlvbi1saW5rZXIucGlwZSc7XHJcbmltcG9ydCB7IFRpbWVyUG9vbCB9IGZyb20gJy4vdGltZXItcG9vbC5zZXJ2aWNlJztcclxuXHJcbmNvbnN0IENPTVBPTkVOVFMgPSBbXHJcbiAgICBUaW1lc3RhbXBDb21wb25lbnQsXHJcbiAgICBMaWdodGJveENvbXBvbmVudCxcclxuICAgIEJhbnRhTWFya2Rvd25Ub0h0bWxQaXBlLFxyXG4gICAgQmFudGFNZW50aW9uTGlua2VyUGlwZSxcclxuICAgIEJhbnRhVHJ1c3RSZXNvdXJjZVVybFBpcGUsXHJcbiAgICBCYW50YUF0dGFjaG1lbnRDb21wb25lbnQsXHJcbiAgICBCYW50YUF0dGFjaG1lbnRzQ29tcG9uZW50XHJcbl07XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gICAgZGVjbGFyYXRpb25zOiBDT01QT05FTlRTLFxyXG4gICAgaW1wb3J0czogW1xyXG4gICAgICAgIENvbW1vbk1vZHVsZSxcclxuICAgICAgICBNYXRJY29uTW9kdWxlLFxyXG4gICAgICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSxcclxuICAgICAgICBNYXRCdXR0b25Nb2R1bGVcclxuICAgIF0sXHJcbiAgICBleHBvcnRzOiBDT01QT05FTlRTXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCYW50YUNvbW1vbk1vZHVsZSB7XHJcbiAgICBzdGF0aWMgZm9yUm9vdCgpOiBNb2R1bGVXaXRoUHJvdmlkZXJzPEJhbnRhQ29tbW9uTW9kdWxlPiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbmdNb2R1bGU6IEJhbnRhQ29tbW9uTW9kdWxlLFxyXG4gICAgICAgICAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICAgICAgICAgIFRpbWVyUG9vbFxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59Il19
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
export * from './lazy-connection';
|
|
2
|
-
export * from './timestamp.component';
|
|
3
|
-
export * from './lightbox/lightbox.component';
|
|
4
|
-
export * from './markdown-to-html.pipe';
|
|
5
|
-
export * from './trust-resource-url.pipe';
|
|
6
|
-
export * from './mention-linker.pipe';
|
|
7
|
-
export * from './attachment/attachment.component';
|
|
8
|
-
export * from './attachments/attachments.component';
|
|
9
|
-
export * from './timer-pool.service';
|
|
10
|
-
export * from './common.module';
|
|
1
|
+
export * from './lazy-connection';
|
|
2
|
+
export * from './timestamp.component';
|
|
3
|
+
export * from './lightbox/lightbox.component';
|
|
4
|
+
export * from './markdown-to-html.pipe';
|
|
5
|
+
export * from './trust-resource-url.pipe';
|
|
6
|
+
export * from './mention-linker.pipe';
|
|
7
|
+
export * from './attachment/attachment.component';
|
|
8
|
+
export * from './attachments/attachments.component';
|
|
9
|
+
export * from './timer-pool.service';
|
|
10
|
+
export * from './common.module';
|
|
11
11
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZGsvc3JjL2xpYi9jb21tb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxtQ0FBbUMsQ0FBQztBQUNsRCxjQUFjLHFDQUFxQyxDQUFDO0FBQ3BELGNBQWMsc0JBQXNCLENBQUM7QUFFckMsY0FBYyxpQkFBaUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGF6eS1jb25uZWN0aW9uJztcclxuZXhwb3J0ICogZnJvbSAnLi90aW1lc3RhbXAuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWdodGJveC9saWdodGJveC5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL21hcmtkb3duLXRvLWh0bWwucGlwZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vdHJ1c3QtcmVzb3VyY2UtdXJsLnBpcGUnO1xyXG5leHBvcnQgKiBmcm9tICcuL21lbnRpb24tbGlua2VyLnBpcGUnO1xyXG5leHBvcnQgKiBmcm9tICcuL2F0dGFjaG1lbnQvYXR0YWNobWVudC5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2F0dGFjaG1lbnRzL2F0dGFjaG1lbnRzLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vdGltZXItcG9vbC5zZXJ2aWNlJztcclxuXHJcbmV4cG9ydCAqIGZyb20gJy4vY29tbW9uLm1vZHVsZSc7Il19
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { Subject, Observable } from 'rxjs';
|
|
2
|
-
import { publish } from 'rxjs/operators';
|
|
3
|
-
export function lazyConnection(options) {
|
|
4
|
-
let obs = new Observable(observer => {
|
|
5
|
-
let subject = new Subject();
|
|
6
|
-
let subscription = subject.subscribe(observer);
|
|
7
|
-
options.start(subject);
|
|
8
|
-
return () => {
|
|
9
|
-
subscription.unsubscribe();
|
|
10
|
-
options.stop();
|
|
11
|
-
};
|
|
12
|
-
});
|
|
13
|
-
return obs.pipe(publish()).refCount();
|
|
14
|
-
}
|
|
1
|
+
import { Subject, Observable } from 'rxjs';
|
|
2
|
+
import { publish } from 'rxjs/operators';
|
|
3
|
+
export function lazyConnection(options) {
|
|
4
|
+
let obs = new Observable(observer => {
|
|
5
|
+
let subject = new Subject();
|
|
6
|
+
let subscription = subject.subscribe(observer);
|
|
7
|
+
options.start(subject);
|
|
8
|
+
return () => {
|
|
9
|
+
subscription.unsubscribe();
|
|
10
|
+
options.stop();
|
|
11
|
+
};
|
|
12
|
+
});
|
|
13
|
+
return obs.pipe(publish()).refCount();
|
|
14
|
+
}
|
|
15
15
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF6eS1jb25uZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvY29tbW9uL2xhenktY29ubmVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBeUIsTUFBTSxNQUFNLENBQUM7QUFDbEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBT3pDLE1BQU0sVUFBVSxjQUFjLENBQUksT0FBa0M7SUFFaEUsSUFBSSxHQUFHLEdBQUcsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUU7UUFDaEMsSUFBSSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUssQ0FBQztRQUMvQixJQUFJLFlBQVksR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRS9DLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkIsT0FBTyxHQUFHLEVBQUU7WUFDUixZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDM0IsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25CLENBQUMsQ0FBQztJQUNOLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBa0MsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ3RFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdWJqZWN0LCBPYnNlcnZhYmxlLCBDb25uZWN0YWJsZU9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgcHVibGlzaCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGF6eUNvbm5lY3Rpb25PcHRpb25zPFQ+IHtcclxuICAgIHN0YXJ0IDogKHN1YmplY3QgOiBTdWJqZWN0PFQ+KSA9PiB2b2lkO1xyXG4gICAgc3RvcCA6ICgpID0+IHZvaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBsYXp5Q29ubmVjdGlvbjxUPihvcHRpb25zIDogTGF6eUNvbm5lY3Rpb25PcHRpb25zPFQ+KTogT2JzZXJ2YWJsZTxUPiB7XHJcblxyXG4gICAgbGV0IG9icyA9IG5ldyBPYnNlcnZhYmxlKG9ic2VydmVyID0+IHtcclxuICAgICAgICBsZXQgc3ViamVjdCA9IG5ldyBTdWJqZWN0PFQ+KCk7XHJcbiAgICAgICAgbGV0IHN1YnNjcmlwdGlvbiA9IHN1YmplY3Quc3Vic2NyaWJlKG9ic2VydmVyKTtcclxuXHJcbiAgICAgICAgb3B0aW9ucy5zdGFydChzdWJqZWN0KTtcclxuICAgICAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgb3B0aW9ucy5zdG9wKCk7XHJcbiAgICAgICAgfTtcclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICByZXR1cm4gKDxDb25uZWN0YWJsZU9ic2VydmFibGU8VD4+b2JzLnBpcGUocHVibGlzaCgpKSkucmVmQ291bnQoKTtcclxufSJdfQ==
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Component, ViewChild } from "@angular/core";
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/material/icon";
|
|
4
|
+
export class LightboxComponent {
|
|
5
|
+
ngAfterViewInit() {
|
|
6
|
+
if (typeof window !== 'undefined') {
|
|
7
|
+
document.body.appendChild(this.containerElement.nativeElement);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
ngOnDestroy() {
|
|
11
|
+
this.containerElement.nativeElement.remove();
|
|
12
|
+
}
|
|
13
|
+
close() {
|
|
14
|
+
this.isOpen = false;
|
|
15
|
+
}
|
|
16
|
+
open(currentImage, images) {
|
|
17
|
+
this.currentImage = currentImage;
|
|
18
|
+
this.images = images;
|
|
19
|
+
this.isOpen = true;
|
|
20
|
+
}
|
|
21
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: LightboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
22
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.8", type: LightboxComponent, selector: "banta-lightbox", viewQueries: [{ propertyName: "containerElement", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: "<div \r\n class=\"banta-lightbox-container\" \r\n #container\r\n [class.open]=\"isOpen\"\r\n >\r\n\r\n <a class=\"underlay\" (click)=\"close()\" href=\"javascript:;\"></a>\r\n\r\n <a class=\"close-button\" href=\"javascript:;\" (click)=\"close()\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n\r\n <img [src]=\"currentImage\" />\r\n</div>\r\n", styles: ["::ng-deep .banta-lightbox-container{position:fixed;inset:0;opacity:0;pointer-events:none;background-color:#000000bf;color:#fff;z-index:10000;transition:.25s opacity ease-in-out;display:flex;align-items:center;justify-content:center}::ng-deep .banta-lightbox-container a.underlay{z-index:0;position:absolute;inset:0;opacity:0}::ng-deep .banta-lightbox-container img{z-index:10;max-width:95%}::ng-deep .banta-lightbox-container.open{opacity:1;pointer-events:initial}::ng-deep .banta-lightbox-container a.close-button{position:absolute;top:0;right:0;padding:.75em;z-index:20}\n"], dependencies: [{ kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
|
|
23
|
+
}
|
|
24
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: LightboxComponent, decorators: [{
|
|
25
|
+
type: Component,
|
|
26
|
+
args: [{ selector: 'banta-lightbox', template: "<div \r\n class=\"banta-lightbox-container\" \r\n #container\r\n [class.open]=\"isOpen\"\r\n >\r\n\r\n <a class=\"underlay\" (click)=\"close()\" href=\"javascript:;\"></a>\r\n\r\n <a class=\"close-button\" href=\"javascript:;\" (click)=\"close()\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n\r\n <img [src]=\"currentImage\" />\r\n</div>\r\n", styles: ["::ng-deep .banta-lightbox-container{position:fixed;inset:0;opacity:0;pointer-events:none;background-color:#000000bf;color:#fff;z-index:10000;transition:.25s opacity ease-in-out;display:flex;align-items:center;justify-content:center}::ng-deep .banta-lightbox-container a.underlay{z-index:0;position:absolute;inset:0;opacity:0}::ng-deep .banta-lightbox-container img{z-index:10;max-width:95%}::ng-deep .banta-lightbox-container.open{opacity:1;pointer-events:initial}::ng-deep .banta-lightbox-container a.close-button{position:absolute;top:0;right:0;padding:.75em;z-index:20}\n"] }]
|
|
27
|
+
}], propDecorators: { containerElement: [{
|
|
28
|
+
type: ViewChild,
|
|
29
|
+
args: ['container']
|
|
30
|
+
}] } });
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvY29tbW9uL2xpZ2h0Ym94L2xpZ2h0Ym94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Nkay9zcmMvbGliL2NvbW1vbi9saWdodGJveC9saWdodGJveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBT2pFLE1BQU0sT0FBTyxpQkFBaUI7SUFJMUIsZUFBZTtRQUNYLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDaEMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ25FLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDakQsQ0FBQztJQU9ELEtBQUs7UUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBSSxDQUFDLFlBQW9CLEVBQUUsTUFBZ0I7UUFDdkMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDdkIsQ0FBQzs4R0EzQlEsaUJBQWlCO2tHQUFqQixpQkFBaUIscUtDUDlCLHNYQWNBOzsyRkRQYSxpQkFBaUI7a0JBTDdCLFNBQVM7K0JBQ0ksZ0JBQWdCOzhCQU0xQixnQkFBZ0I7c0JBRGYsU0FBUzt1QkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2JhbnRhLWxpZ2h0Ym94JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9saWdodGJveC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9saWdodGJveC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMaWdodGJveENvbXBvbmVudCB7XHJcbiAgICBAVmlld0NoaWxkKCdjb250YWluZXInKSBcclxuICAgIGNvbnRhaW5lckVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xyXG5cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmNvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGltYWdlczogc3RyaW5nW107XHJcbiAgICBjdXJyZW50SW1hZ2U6IHN0cmluZztcclxuXHJcbiAgICBpc09wZW46IGJvb2xlYW47XHJcblxyXG4gICAgY2xvc2UoKSB7XHJcbiAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBvcGVuKGN1cnJlbnRJbWFnZTogc3RyaW5nLCBpbWFnZXM6IHN0cmluZ1tdKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50SW1hZ2UgPSBjdXJyZW50SW1hZ2U7XHJcbiAgICAgICAgdGhpcy5pbWFnZXMgPSBpbWFnZXM7XHJcbiAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xyXG4gICAgfVxyXG59IiwiPGRpdiBcclxuICAgIGNsYXNzPVwiYmFudGEtbGlnaHRib3gtY29udGFpbmVyXCIgXHJcbiAgICAjY29udGFpbmVyXHJcbiAgICBbY2xhc3Mub3Blbl09XCJpc09wZW5cIlxyXG4gICAgPlxyXG5cclxuICAgIDxhIGNsYXNzPVwidW5kZXJsYXlcIiAoY2xpY2spPVwiY2xvc2UoKVwiIGhyZWY9XCJqYXZhc2NyaXB0OjtcIj48L2E+XHJcblxyXG4gICAgPGEgY2xhc3M9XCJjbG9zZS1idXR0b25cIiBocmVmPVwiamF2YXNjcmlwdDo7XCIgKGNsaWNrKT1cImNsb3NlKClcIj5cclxuICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgPC9hPlxyXG5cclxuICAgIDxpbWcgW3NyY109XCJjdXJyZW50SW1hZ2VcIiAvPlxyXG48L2Rpdj5cclxuIl19
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { Pipe, Inject, Optional } from '@angular/core';
|
|
2
|
+
import * as marked from 'marked';
|
|
3
|
+
import createDOMPurify from 'dompurify';
|
|
4
|
+
import twemoji from 'twemoji';
|
|
5
|
+
import { BANTA_SDK_OPTIONS } from '../sdk-options';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/platform-browser";
|
|
8
|
+
const underline = {
|
|
9
|
+
name: 'underline',
|
|
10
|
+
level: 'inline', // Is this a block-level or inline-level tokenizer?
|
|
11
|
+
start(src) { return src.match(/\+\+/)?.index; }, // Hint to Marked.js to stop and check for a match
|
|
12
|
+
tokenizer(src, tokens) {
|
|
13
|
+
const rule = /^\+\+(.*?)\+\+/; // Regex for the complete token
|
|
14
|
+
const match = rule.exec(src);
|
|
15
|
+
if (match) {
|
|
16
|
+
return {
|
|
17
|
+
type: 'underline', // Should match "name" above
|
|
18
|
+
raw: match[0], // Text to consume from the source
|
|
19
|
+
text: this.lexer.inlineTokens(match[1].trim()), // Additional custom properties
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
renderer(token) {
|
|
24
|
+
return `<u>${this.parser.parseInline(token.text)}</u>`;
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
marked.marked.use({
|
|
28
|
+
extensions: [underline]
|
|
29
|
+
});
|
|
30
|
+
export class BantaMarkdownToHtmlPipe {
|
|
31
|
+
constructor(sanitizer, sdkOptions) {
|
|
32
|
+
this.sanitizer = sanitizer;
|
|
33
|
+
this.sdkOptions = sdkOptions;
|
|
34
|
+
this.renderer = new marked.Renderer({
|
|
35
|
+
headerPrefix: ''
|
|
36
|
+
});
|
|
37
|
+
const linkRenderer = this.renderer.link;
|
|
38
|
+
this.renderer.link = (href, title, text) => {
|
|
39
|
+
const html = linkRenderer.call(this.renderer, href, title, text);
|
|
40
|
+
return html.replace(/^<a /, '<a target="_blank" rel="noopener noreferrer nofollow" ');
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
get emojiUrl() {
|
|
44
|
+
return this.sdkOptions?.emojiUrl ?? 'https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/';
|
|
45
|
+
}
|
|
46
|
+
transform(value) {
|
|
47
|
+
if (!value)
|
|
48
|
+
return '';
|
|
49
|
+
let purifier = createDOMPurify(window);
|
|
50
|
+
// https://github.com/cure53/DOMPurify/blob/e1c19cf6407d782b666cb1d02a6af191f9cbc09e/demos/hooks-target-blank-demo.html
|
|
51
|
+
// Add a hook to make all links open a new window
|
|
52
|
+
purifier.addHook('afterSanitizeAttributes', function (node) {
|
|
53
|
+
// set all elements owning target to target=_blank
|
|
54
|
+
if ('target' in node) {
|
|
55
|
+
node.setAttribute('target', '_blank');
|
|
56
|
+
// prevent https://www.owasp.org/index.php/Reverse_Tabnabbing
|
|
57
|
+
node.setAttribute('rel', 'noopener noreferrer nofollow');
|
|
58
|
+
}
|
|
59
|
+
// set non-HTML/MathML links to xlink:show=new
|
|
60
|
+
if (!node.hasAttribute('target')
|
|
61
|
+
&& (node.hasAttribute('xlink:href')
|
|
62
|
+
|| node.hasAttribute('href'))) {
|
|
63
|
+
node.setAttribute('xlink:show', 'new');
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
value = marked.marked.parse(value, {
|
|
67
|
+
renderer: this.renderer
|
|
68
|
+
});
|
|
69
|
+
value = twemoji.parse(value, { base: this.emojiUrl });
|
|
70
|
+
return this.sanitizer.bypassSecurityTrustHtml(purifier.sanitize(value, {
|
|
71
|
+
FORBID_TAGS: ['h1', 'h2', 'h3', 'h4'],
|
|
72
|
+
KEEP_CONTENT: true
|
|
73
|
+
}));
|
|
74
|
+
}
|
|
75
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: BantaMarkdownToHtmlPipe, deps: [{ token: i1.DomSanitizer }, { token: BANTA_SDK_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
76
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.3.8", ngImport: i0, type: BantaMarkdownToHtmlPipe, name: "markdownToHtml" }); }
|
|
77
|
+
}
|
|
78
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: BantaMarkdownToHtmlPipe, decorators: [{
|
|
79
|
+
type: Pipe,
|
|
80
|
+
args: [{
|
|
81
|
+
name: 'markdownToHtml'
|
|
82
|
+
}]
|
|
83
|
+
}], ctorParameters: () => [{ type: i1.DomSanitizer }, { type: undefined, decorators: [{
|
|
84
|
+
type: Inject,
|
|
85
|
+
args: [BANTA_SDK_OPTIONS]
|
|
86
|
+
}, {
|
|
87
|
+
type: Optional
|
|
88
|
+
}] }] });
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24tdG8taHRtbC5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvY29tbW9uL21hcmtkb3duLXRvLWh0bWwucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RFLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sZUFBZSxNQUFNLFdBQVcsQ0FBQztBQUV4QyxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFFLGlCQUFpQixFQUFjLE1BQU0sZ0JBQWdCLENBQUM7OztBQUUvRCxNQUFNLFNBQVMsR0FBRztJQUNkLElBQUksRUFBRSxXQUFXO0lBQ2pCLEtBQUssRUFBRSxRQUFRLEVBQUUsbURBQW1EO0lBQ3BFLEtBQUssQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxrREFBa0Q7SUFDbkcsU0FBUyxDQUFDLEdBQUcsRUFBRSxNQUFNO1FBQ2pCLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLENBQUMsK0JBQStCO1FBQzlELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0IsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNSLE9BQU87Z0JBQ0gsSUFBSSxFQUFFLFdBQVcsRUFBRSw0QkFBNEI7Z0JBQy9DLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsa0NBQWtDO2dCQUNqRCxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsK0JBQStCO2FBQ2xG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Qjs0R0FKcEIsdUJBQXVCOzsyRkFBdkIsdUJBQXVCO2tCQUhuQyxJQUFJO21CQUFDO29CQUNGLElBQUksRUFBRSxnQkFBZ0I7aUJBQ3pCOzswQkFLUSxNQUFNOzJCQUFDLGlCQUFpQjs7MEJBQUcsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0sIEluamVjdCwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0ICogYXMgbWFya2VkIGZyb20gJ21hcmtlZCc7XHJcbmltcG9ydCBjcmVhdGVET01QdXJpZnkgZnJvbSAnZG9tcHVyaWZ5JztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB0d2Vtb2ppIGZyb20gJ3R3ZW1vamknO1xyXG5pbXBvcnQgeyBCQU5UQV9TREtfT1BUSU9OUywgU2RrT3B0aW9ucyB9IGZyb20gJy4uL3Nkay1vcHRpb25zJztcclxuXHJcbmNvbnN0IHVuZGVybGluZSA9IHtcclxuICAgIG5hbWU6ICd1bmRlcmxpbmUnLFxyXG4gICAgbGV2ZWw6ICdpbmxpbmUnLCAvLyBJcyB0aGlzIGEgYmxvY2stbGV2ZWwgb3IgaW5saW5lLWxldmVsIHRva2VuaXplcj9cclxuICAgIHN0YXJ0KHNyYykgeyByZXR1cm4gc3JjLm1hdGNoKC9cXCtcXCsvKT8uaW5kZXg7IH0sIC8vIEhpbnQgdG8gTWFya2VkLmpzIHRvIHN0b3AgYW5kIGNoZWNrIGZvciBhIG1hdGNoXHJcbiAgICB0b2tlbml6ZXIoc3JjLCB0b2tlbnMpIHtcclxuICAgICAgICBjb25zdCBydWxlID0gL15cXCtcXCsoLio/KVxcK1xcKy87IC8vIFJlZ2V4IGZvciB0aGUgY29tcGxldGUgdG9rZW5cclxuICAgICAgICBjb25zdCBtYXRjaCA9IHJ1bGUuZXhlYyhzcmMpO1xyXG4gICAgICAgIGlmIChtYXRjaCkge1xyXG4gICAgICAgICAgICByZXR1cm4geyAvLyBUb2tlbiB0byBnZW5lcmF0ZVxyXG4gICAgICAgICAgICAgICAgdHlwZTogJ3VuZGVybGluZScsIC8vIFNob3VsZCBtYXRjaCBcIm5hbWVcIiBhYm92ZVxyXG4gICAgICAgICAgICAgICAgcmF3OiBtYXRjaFswXSwgLy8gVGV4dCB0byBjb25zdW1lIGZyb20gdGhlIHNvdXJjZVxyXG4gICAgICAgICAgICAgICAgdGV4dDogdGhpcy5sZXhlci5pbmxpbmVUb2tlbnMobWF0Y2hbMV0udHJpbSgpKSwgLy8gQWRkaXRpb25hbCBjdXN0b20gcHJvcGVydGllc1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICByZW5kZXJlcih0b2tlbikge1xyXG4gICAgICAgIHJldHVybiBgPHU+JHt0aGlzLnBhcnNlci5wYXJzZUlubGluZSh0b2tlbi50ZXh0KX08L3U+YDtcclxuICAgIH1cclxufTtcclxuXHJcbm1hcmtlZC5tYXJrZWQudXNlKHtcclxuICAgIGV4dGVuc2lvbnM6IFt1bmRlcmxpbmVdXHJcbn0pO1xyXG5cclxuQFBpcGUoe1xyXG4gICAgbmFtZTogJ21hcmtkb3duVG9IdG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQmFudGFNYXJrZG93blRvSHRtbFBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXHJcblxyXG4gICAgICAgIEBJbmplY3QoQkFOVEFfU0RLX09QVElPTlMpIEBPcHRpb25hbCgpXHJcbiAgICAgICAgcHJpdmF0ZSBzZGtPcHRpb25zOiBTZGtPcHRpb25zXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyID0gbmV3IG1hcmtlZC5SZW5kZXJlcih7XHJcbiAgICAgICAgICAgIGhlYWRlclByZWZpeDogJydcclxuICAgICAgICB9KTtcclxuICAgICAgICBjb25zdCBsaW5rUmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyLmxpbms7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5saW5rID0gKGhyZWYsIHRpdGxlLCB0ZXh0KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBsaW5rUmVuZGVyZXIuY2FsbCh0aGlzLnJlbmRlcmVyLCBocmVmLCB0aXRsZSwgdGV4dCk7XHJcbiAgICAgICAgICAgIHJldHVybiBodG1sLnJlcGxhY2UoL148YSAvLCAnPGEgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlciBub2ZvbGxvd1wiICcpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG5cdHByaXZhdGUgZ2V0IGVtb2ppVXJsKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuc2RrT3B0aW9ucz8uZW1vamlVcmwgPz8gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9naC90d2l0dGVyL3R3ZW1vamlAMTQuMC4yL2Fzc2V0cy8nO1xyXG5cdH1cclxuXHJcbiAgICByZW5kZXJlcjogbWFya2VkLlJlbmRlcmVyO1xyXG4gICAgdHJhbnNmb3JtKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoIXZhbHVlKVxyXG4gICAgICAgICAgICByZXR1cm4gJyc7XHJcblxyXG4gICAgICAgIGxldCBwdXJpZmllciA9IGNyZWF0ZURPTVB1cmlmeSh3aW5kb3cpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jdXJlNTMvRE9NUHVyaWZ5L2Jsb2IvZTFjMTljZjY0MDdkNzgyYjY2NmNiMWQwMmE2YWYxOTFmOWNiYzA5ZS9kZW1vcy9ob29rcy10YXJnZXQtYmxhbmstZGVtby5odG1sXHJcbiAgICAgICAgLy8gQWRkIGEgaG9vayB0byBtYWtlIGFsbCBsaW5rcyBvcGVuIGEgbmV3IHdpbmRvd1xyXG4gICAgICAgIHB1cmlmaWVyLmFkZEhvb2soJ2FmdGVyU2FuaXRpemVBdHRyaWJ1dGVzJywgZnVuY3Rpb24obm9kZTogSFRNTEVsZW1lbnQgJiB7IHRhcmdldD86IHN0cmluZyB9KSB7XHJcbiAgICAgICAgICAgIC8vIHNldCBhbGwgZWxlbWVudHMgb3duaW5nIHRhcmdldCB0byB0YXJnZXQ9X2JsYW5rXHJcbiAgICAgICAgICAgIGlmICgndGFyZ2V0JyBpbiBub2RlKSB7XHJcbiAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgndGFyZ2V0JywnX2JsYW5rJyk7XHJcbiAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGh0dHBzOi8vd3d3Lm93YXNwLm9yZy9pbmRleC5waHAvUmV2ZXJzZV9UYWJuYWJiaW5nXHJcbiAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgncmVsJywgJ25vb3BlbmVyIG5vcmVmZXJyZXIgbm9mb2xsb3cnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBzZXQgbm9uLUhUTUwvTWF0aE1MIGxpbmtzIHRvIHhsaW5rOnNob3c9bmV3XHJcbiAgICAgICAgICAgIGlmICghbm9kZS5oYXNBdHRyaWJ1dGUoJ3RhcmdldCcpXHJcbiAgICAgICAgICAgICAgICAmJiAobm9kZS5oYXNBdHRyaWJ1dGUoJ3hsaW5rOmhyZWYnKVxyXG4gICAgICAgICAgICAgICAgICAgIHx8IG5vZGUuaGFzQXR0cmlidXRlKCdocmVmJykpKSB7XHJcbiAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgneGxpbms6c2hvdycsICduZXcnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB2YWx1ZSA9IG1hcmtlZC5tYXJrZWQucGFyc2UodmFsdWUsIHtcclxuICAgICAgICAgICAgcmVuZGVyZXI6IHRoaXMucmVuZGVyZXJcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdmFsdWUgPSB0d2Vtb2ppLnBhcnNlKHZhbHVlLCB7IGJhc2U6IHRoaXMuZW1vamlVcmwgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChcclxuICAgICAgICAgICAgcHVyaWZpZXIuc2FuaXRpemUodmFsdWUsXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgRk9SQklEX1RBR1M6IFsnaDEnLCAnaDInLCAnaDMnLCAnaDQnXSxcclxuICAgICAgICAgICAgICAgICAgICBLRUVQX0NPTlRFTlQ6IHRydWVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iXX0=
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Pipe } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class BantaMentionLinkerPipe {
|
|
4
|
+
transform(value, links) {
|
|
5
|
+
if (!value)
|
|
6
|
+
return '';
|
|
7
|
+
if (!links)
|
|
8
|
+
return value;
|
|
9
|
+
let text = value;
|
|
10
|
+
for (let i = 0, max = links.length; i < max; ++i) {
|
|
11
|
+
let mention = links[i];
|
|
12
|
+
text = text.replace(new RegExp(`${this.escapeRegExp(mention.text)}`, `gi`), `@{${i + 1}}`);
|
|
13
|
+
}
|
|
14
|
+
text = text.replace(/@\{(\d+)\}/g, (text, i) => links[i - 1] ? this.formatLink(links[i - 1]) : text);
|
|
15
|
+
return text;
|
|
16
|
+
}
|
|
17
|
+
formatLink(link) {
|
|
18
|
+
return `<a${link.external ? ` target="_blank" rel="noopener"` : ``} class="mention" href="${link.link}">${link.text}</a>`;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex
|
|
22
|
+
*/
|
|
23
|
+
escapeRegExp(string) {
|
|
24
|
+
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
|
|
25
|
+
}
|
|
26
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: BantaMentionLinkerPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
27
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.3.8", ngImport: i0, type: BantaMentionLinkerPipe, name: "mentionLinker" }); }
|
|
28
|
+
}
|
|
29
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: BantaMentionLinkerPipe, decorators: [{
|
|
30
|
+
type: Pipe,
|
|
31
|
+
args: [{
|
|
32
|
+
name: 'mentionLinker'
|
|
33
|
+
}]
|
|
34
|
+
}] });
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudGlvbi1saW5rZXIucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Nkay9zcmMvbGliL2NvbW1vbi9tZW50aW9uLWxpbmtlci5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDOztBQU9wRCxNQUFNLE9BQU8sc0JBQXNCO0lBQy9CLFNBQVMsQ0FBQyxLQUFhLEVBQUUsS0FBNEI7UUFDakQsSUFBSSxDQUFDLEtBQUs7WUFDTixPQUFPLEVBQUUsQ0FBQztRQUVkLElBQUksQ0FBQyxLQUFLO1lBQ04sT0FBTyxLQUFLLENBQUM7UUFFakIsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBRWpCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUMvQyxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0YsQ0FBQztRQUVELElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVyRyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsVUFBVSxDQUFDLElBQXdCO1FBQy9CLE9BQU8sS0FBTSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLENBQUMsRUFBRywwQkFBMEIsSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUM7SUFDaEksQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWSxDQUFDLE1BQU07UUFDZixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxvQ0FBb0M7SUFDOUYsQ0FBQzs4R0E3QlEsc0JBQXNCOzRHQUF0QixzQkFBc0I7OzJGQUF0QixzQkFBc0I7a0JBSGxDLElBQUk7bUJBQUM7b0JBQ0YsSUFBSSxFQUFFLGVBQWU7aUJBQ3hCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgQ2hhdE1lc3NhZ2VNZW50aW9uIH0gZnJvbSAnQGJhbnRhL2NvbW1vbic7XHJcblxyXG5AUGlwZSh7XHJcbiAgICBuYW1lOiAnbWVudGlvbkxpbmtlcidcclxufSlcclxuZXhwb3J0IGNsYXNzIEJhbnRhTWVudGlvbkxpbmtlclBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcclxuICAgIHRyYW5zZm9ybSh2YWx1ZTogc3RyaW5nLCBsaW5rcz86IENoYXRNZXNzYWdlTWVudGlvbltdKSB7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSlcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG5cclxuICAgICAgICBpZiAoIWxpbmtzKVxyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcblxyXG4gICAgICAgIGxldCB0ZXh0ID0gdmFsdWU7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBtYXggPSBsaW5rcy5sZW5ndGg7IGkgPCBtYXg7ICsraSkge1xyXG4gICAgICAgICAgICBsZXQgbWVudGlvbiA9IGxpbmtzW2ldO1xyXG4gICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAoYCR7dGhpcy5lc2NhcGVSZWdFeHAobWVudGlvbi50ZXh0KX1gLCBgZ2lgKSwgYEB7JHtpICsgMX19YCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9AXFx7KFxcZCspXFx9L2csICh0ZXh0LCBpKSA9PiBsaW5rc1tpIC0gMV0gPyB0aGlzLmZvcm1hdExpbmsobGlua3NbaSAtIDFdKSA6IHRleHQpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGV4dDtcclxuICAgIH1cclxuXHJcbiAgICBmb3JtYXRMaW5rKGxpbms6IENoYXRNZXNzYWdlTWVudGlvbikge1xyXG4gICAgICAgIHJldHVybiBgPGEkeyBsaW5rLmV4dGVybmFsID8gYCB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lclwiYCA6IGBgIH0gY2xhc3M9XCJtZW50aW9uXCIgaHJlZj1cIiR7bGluay5saW5rfVwiPiR7bGluay50ZXh0fTwvYT5gO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleFxyXG4gICAgICovXHJcbiAgICBlc2NhcGVSZWdFeHAoc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpOyAvLyAkJiBtZWFucyB0aGUgd2hvbGUgbWF0Y2hlZCBzdHJpbmdcclxuICAgIH1cclxufSJdfQ==
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { Injectable } from "@banta/common";
|
|
3
|
+
/**
|
|
4
|
+
* Provides a way to hook in to a shared set of timers, instead of creating a timer per instance.
|
|
5
|
+
* This is very useful for cases where the update is not extremely time-sensitive, but happens at scale.
|
|
6
|
+
* The principal use case is the TimestampComponent. When several hundred (or several thousand) comments are
|
|
7
|
+
* being displayed, we do not want to trigger thousands of independent relative timestamp updates, because over
|
|
8
|
+
* time the updates will saturate the CPU since they don't perfectly align.
|
|
9
|
+
*/
|
|
10
|
+
let TimerPool = class TimerPool {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.subscriptions = new Map();
|
|
13
|
+
this.newSubscriptions = new Map();
|
|
14
|
+
this.removedSubscriptions = new Map();
|
|
15
|
+
}
|
|
16
|
+
addTimer(interval, callback) {
|
|
17
|
+
if (interval <= 0) {
|
|
18
|
+
console.warn(`Refusing to set timer with interval of ${interval}!`);
|
|
19
|
+
return () => { };
|
|
20
|
+
}
|
|
21
|
+
let state;
|
|
22
|
+
let sizeWas = this.subscriptions.size;
|
|
23
|
+
if (!this.subscriptions.has(interval)) {
|
|
24
|
+
state = { subscribers: [] };
|
|
25
|
+
state.handle = setInterval(() => {
|
|
26
|
+
console.debug(`[Banta/TimerPool] Notifying ${state.subscribers.length} subs [${interval}ms]`);
|
|
27
|
+
state.subscribers.forEach(sub => sub());
|
|
28
|
+
}, interval);
|
|
29
|
+
this.subscriptions.set(interval, state);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
state = this.subscriptions.get(interval);
|
|
33
|
+
}
|
|
34
|
+
state.subscribers.push(callback);
|
|
35
|
+
// Debug information //////////////////////////
|
|
36
|
+
//
|
|
37
|
+
if (!this.newSubscriptions.has(interval))
|
|
38
|
+
this.newSubscriptions.set(interval, 0);
|
|
39
|
+
this.newSubscriptions.set(interval, (this.newSubscriptions.get(interval) ?? 0) + 1);
|
|
40
|
+
clearTimeout(this.newSubscriptionsNotice);
|
|
41
|
+
this.newSubscriptionsNotice = setTimeout(() => {
|
|
42
|
+
for (let [interval, count] of this.newSubscriptions) {
|
|
43
|
+
console.debug(`[Banta/TimerPool] ${count} new subscriptions to ${interval}ms [${state.subscribers.length} total]`);
|
|
44
|
+
}
|
|
45
|
+
this.newSubscriptions.clear();
|
|
46
|
+
});
|
|
47
|
+
//
|
|
48
|
+
///////////////////////////////////////////////
|
|
49
|
+
if (sizeWas === 0) {
|
|
50
|
+
console.debug(`[Banta/TimerPool] No longer idle.`);
|
|
51
|
+
}
|
|
52
|
+
// Unsubscribe function
|
|
53
|
+
return () => {
|
|
54
|
+
let state = this.subscriptions.get(interval);
|
|
55
|
+
let index = state.subscribers.indexOf(callback);
|
|
56
|
+
if (index >= 0)
|
|
57
|
+
state.subscribers.splice(index, 1);
|
|
58
|
+
if (state.subscribers.length === 0) {
|
|
59
|
+
clearInterval(state.handle);
|
|
60
|
+
this.subscriptions.delete(interval);
|
|
61
|
+
}
|
|
62
|
+
if (!this.removedSubscriptions.has(interval))
|
|
63
|
+
this.removedSubscriptions.set(interval, 0);
|
|
64
|
+
this.removedSubscriptions.set(interval, (this.removedSubscriptions.get(interval) ?? 0) + 1);
|
|
65
|
+
// Debug information ////////////////////////////////////////////////////////////////////
|
|
66
|
+
clearTimeout(this.removedSubscriptionsNotice);
|
|
67
|
+
this.removedSubscriptionsNotice = setTimeout(() => {
|
|
68
|
+
for (let [interval, count] of this.removedSubscriptions) {
|
|
69
|
+
let state = this.subscriptions.get(interval);
|
|
70
|
+
console.debug(`[Banta/TimerPool] ${count} unsubscribed from ${interval}ms [${state?.subscribers?.length ?? 0} remain]`);
|
|
71
|
+
}
|
|
72
|
+
if (this.subscriptions.size === 0)
|
|
73
|
+
console.debug(`[Banta/TimerPool] All subscriptions have been removed. Now idle.`);
|
|
74
|
+
this.removedSubscriptions.clear();
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
TimerPool = __decorate([
|
|
80
|
+
Injectable()
|
|
81
|
+
], TimerPool);
|
|
82
|
+
export { TimerPool };
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXItcG9vbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvY29tbW9uL3RpbWVyLXBvb2wuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU8zQzs7Ozs7O0dBTUc7QUFFSSxJQUFNLFNBQVMsR0FBZixNQUFNLFNBQVM7SUFBZjtRQUNLLGtCQUFhLEdBQUcsSUFBSSxHQUFHLEVBQXNCLENBQUM7UUFHOUMscUJBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFHN0MseUJBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFnRjdELENBQUM7SUE5RUcsUUFBUSxDQUFDLFFBQWdCLEVBQUUsUUFBb0I7UUFDM0MsSUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDaEIsT0FBTyxDQUFDLElBQUksQ0FBQywwQ0FBMEMsUUFBUSxHQUFHLENBQUMsQ0FBQztZQUNwRSxPQUFPLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUNwQixDQUFDO1FBRUQsSUFBSSxLQUFpQixDQUFDO1FBQ3RCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO1FBRXRDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3BDLEtBQUssR0FBRyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUM1QixLQUFLLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUU7Z0JBQzVCLE9BQU8sQ0FBQyxLQUFLLENBQUMsK0JBQStCLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxVQUFVLFFBQVEsS0FBSyxDQUFDLENBQUM7Z0JBQzlGLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFD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QUMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztvQkFDdEQsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQzdDLE9BQU8sQ0FBQyxLQUFLLENBQUMscUJBQXFCLEtBQUssc0JBQXNCLFFBQVEsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUM1SCxDQUFDO2dCQUVELElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEtBQUssQ0FBQztvQkFDN0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO2dCQUV0RixJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUM7SUFDTixDQUFDO0NBQ0osQ0FBQTtBQXZGWSxTQUFTO0lBRHJCLFVBQVUsRUFBRTtHQUNBLFNBQVMsQ0F1RnJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYmFudGEvY29tbW9uXCI7XHJcblxyXG5pbnRlcmZhY2UgVGltZXJTdGF0ZSB7XHJcbiAgICBoYW5kbGU/O1xyXG4gICAgc3Vic2NyaWJlcnM6ICgoKSA9PiB2b2lkKVtdO1xyXG59XHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgYSB3YXkgdG8gaG9vayBpbiB0byBhIHNoYXJlZCBzZXQgb2YgdGltZXJzLCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgdGltZXIgcGVyIGluc3RhbmNlLlxyXG4gKiBUaGlzIGlzIHZlcnkgdXNlZnVsIGZvciBjYXNlcyB3aGVyZSB0aGUgdXBkYXRlIGlzIG5vdCBleHRyZW1lbHkgdGltZS1zZW5zaXRpdmUsIGJ1dCBoYXBwZW5zIGF0IHNjYWxlLlxyXG4gKiBUaGUgcHJpbmNpcGFsIHVzZSBjYXNlIGlzIHRoZSBUaW1lc3RhbXBDb21wb25lbnQuIFdoZW4gc2V2ZXJhbCBodW5kcmVkIChvciBzZXZlcmFsIHRob3VzYW5kKSBjb21tZW50cyBhcmUgXHJcbiAqIGJlaW5nIGRpc3BsYXllZCwgd2UgZG8gbm90IHdhbnQgdG8gdHJpZ2dlciB0aG91c2FuZHMgb2YgaW5kZXBlbmRlbnQgcmVsYXRpdmUgdGltZXN0YW1wIHVwZGF0ZXMsIGJlY2F1c2Ugb3ZlciBcclxuICogdGltZSB0aGUgdXBkYXRlcyB3aWxsIHNhdHVyYXRlIHRoZSBDUFUgc2luY2UgdGhleSBkb24ndCBwZXJmZWN0bHkgYWxpZ24uIFxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgVGltZXJQb29sIHtcclxuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBNYXA8bnVtYmVyLCBUaW1lclN0YXRlPigpO1xyXG5cclxuICAgIHByaXZhdGUgbmV3U3Vic2NyaXB0aW9uc05vdGljZTtcclxuICAgIHByaXZhdGUgbmV3U3Vic2NyaXB0aW9ucyA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XHJcblxyXG4gICAgcHJpdmF0ZSByZW1vdmVkU3Vic2NyaXB0aW9uc05vdGljZTtcclxuICAgIHByaXZhdGUgcmVtb3ZlZFN1YnNjcmlwdGlvbnMgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xyXG5cclxuICAgIGFkZFRpbWVyKGludGVydmFsOiBudW1iZXIsIGNhbGxiYWNrOiAoKSA9PiB2b2lkKSB7XHJcbiAgICAgICAgaWYgKGludGVydmFsIDw9IDApIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKGBSZWZ1c2luZyB0byBzZXQgdGltZXIgd2l0aCBpbnRlcnZhbCBvZiAke2ludGVydmFsfSFgKTtcclxuICAgICAgICAgICAgcmV0dXJuICgpID0+IHt9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHN0YXRlOiBUaW1lclN0YXRlO1xyXG4gICAgICAgIGxldCBzaXplV2FzID0gdGhpcy5zdWJzY3JpcHRpb25zLnNpemU7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5zdWJzY3JpcHRpb25zLmhhcyhpbnRlcnZhbCkpIHtcclxuICAgICAgICAgICAgc3RhdGUgPSB7IHN1YnNjcmliZXJzOiBbXSB9O1xyXG4gICAgICAgICAgICBzdGF0ZS5oYW5kbGUgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKGBbQmFudGEvVGltZXJQb29sXSBOb3RpZnlpbmcgJHtzdGF0ZS5zdWJzY3JpYmVycy5sZW5ndGh9IHN1YnMgWyR7aW50ZXJ2YWx9bXNdYCk7XHJcbiAgICAgICAgICAgICAgICBzdGF0ZS5zdWJzY3JpYmVycy5mb3JFYWNoKHN1YiA9PiBzdWIoKSk7XHJcbiAgICAgICAgICAgIH0sIGludGVydmFsKTtcclxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnNldChpbnRlcnZhbCwgc3RhdGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHN0YXRlID0gdGhpcy5zdWJzY3JpcHRpb25zLmdldChpbnRlcnZhbCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdGF0ZS5zdWJzY3JpYmVycy5wdXNoKGNhbGxiYWNrKTtcclxuXHJcbiAgICAgICAgLy8gRGVidWcgaW5mb3JtYXRpb24gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgICAgICAvL1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMubmV3U3Vic2NyaXB0aW9ucy5oYXMoaW50ZXJ2YWwpKVxyXG4gICAgICAgICAgICB0aGlzLm5ld1N1YnNjcmlwdGlvbnMuc2V0KGludGVydmFsLCAwKTtcclxuICAgICAgICB0aGlzLm5ld1N1YnNjcmlwdGlvbnMuc2V0KGludGVydmFsLCAodGhpcy5uZXdTdWJzY3JpcHRpb25zLmdldChpbnRlcnZhbCkgPz8gMCkgKyAxKTtcclxuXHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubmV3U3Vic2NyaXB0aW9uc05vdGljZSk7XHJcbiAgICAgICAgdGhpcy5uZXdTdWJzY3JpcHRpb25zTm90aWNlID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IFtpbnRlcnZhbCwgY291bnRdIG9mIHRoaXMubmV3U3Vic2NyaXB0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhgW0JhbnRhL1RpbWVyUG9vbF0gJHtjb3VudH0gbmV3IHN1YnNjcmlwdGlvbnMgdG8gJHtpbnRlcnZhbH1tcyBbJHtzdGF0ZS5zdWJzY3JpYmVycy5sZW5ndGh9IHRvdGFsXWApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLm5ld1N1YnNjcmlwdGlvbnMuY2xlYXIoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG5cclxuICAgICAgICBpZiAoc2l6ZVdhcyA9PT0gMCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKGBbQmFudGEvVGltZXJQb29sXSBObyBsb25nZXIgaWRsZS5gKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFVuc3Vic2NyaWJlIGZ1bmN0aW9uIFxyXG5cclxuICAgICAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN1YnNjcmlwdGlvbnMuZ2V0KGludGVydmFsKTtcclxuICAgICAgICAgICAgbGV0IGluZGV4ID0gc3RhdGUuc3Vic2NyaWJlcnMuaW5kZXhPZihjYWxsYmFjayk7XHJcbiAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKVxyXG4gICAgICAgICAgICAgICAgc3RhdGUuc3Vic2NyaWJlcnMuc3BsaWNlKGluZGV4LCAxKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzdGF0ZS5zdWJzY3JpYmVycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoc3RhdGUuaGFuZGxlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5kZWxldGUoaW50ZXJ2YWwpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMucmVtb3ZlZFN1YnNjcmlwdGlvbnMuaGFzKGludGVydmFsKSlcclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlZFN1YnNjcmlwdGlvbnMuc2V0KGludGVydmFsLCAwKTtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVkU3Vic2NyaXB0aW9ucy5zZXQoaW50ZXJ2YWwsICh0aGlzLnJlbW92ZWRTdWJzY3JpcHRpb25zLmdldChpbnRlcnZhbCkgPz8gMCkgKyAxKTtcclxuXHJcbiAgICAgICAgICAgIC8vIERlYnVnIGluZm9ybWF0aW9uIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcblxyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZW1vdmVkU3Vic2NyaXB0aW9uc05vdGljZSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlZFN1YnNjcmlwdGlvbnNOb3RpY2UgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IFtpbnRlcnZhbCwgY291bnRdIG9mIHRoaXMucmVtb3ZlZFN1YnNjcmlwdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN1YnNjcmlwdGlvbnMuZ2V0KGludGVydmFsKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKGBbQmFudGEvVGltZXJQb29sXSAke2NvdW50fSB1bnN1YnNjcmliZWQgZnJvbSAke2ludGVydmFsfW1zIFske3N0YXRlPy5zdWJzY3JpYmVycz8ubGVuZ3RoID8/IDB9IHJlbWFpbl1gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25zLnNpemUgPT09IDApXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhgW0JhbnRhL1RpbWVyUG9vbF0gQWxsIHN1YnNjcmlwdGlvbnMgaGF2ZSBiZWVuIHJlbW92ZWQuIE5vdyBpZGxlLmApO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlZFN1YnNjcmlwdGlvbnMuY2xlYXIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufSJdfQ==
|