@banta/sdk 4.6.26 → 4.7.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/{esm2015/banta-sdk.js → esm2020/banta-sdk.mjs} +0 -0
- package/{esm2015/lib/attachment-scraper.js → esm2020/lib/attachment-scraper.mjs} +0 -0
- package/esm2020/lib/banta/banta.component.mjs +204 -0
- package/esm2020/lib/banta-logo.component.mjs +11 -0
- package/esm2020/lib/banta-sdk.module.mjs +144 -0
- package/esm2020/lib/chat/banta-chat/banta-chat.component.mjs +185 -0
- package/esm2020/lib/chat/chat-message/chat-message.component.mjs +62 -0
- package/esm2020/lib/chat/chat-view/chat-view.component.mjs +170 -0
- package/esm2020/lib/chat/chat.module.mjs +51 -0
- package/{esm2015/lib/chat/index.js → esm2020/lib/chat/index.mjs} +0 -0
- package/esm2020/lib/chat/live-chat-message.component.mjs +80 -0
- package/{esm2015/lib/chat-backend-base.js → esm2020/lib/chat-backend-base.mjs} +0 -0
- package/esm2020/lib/chat-backend.mjs +83 -0
- package/{esm2015/lib/chat-source-base.js → esm2020/lib/chat-source-base.mjs} +0 -0
- package/esm2020/lib/chat-source.mjs +169 -0
- package/esm2020/lib/comments/attachment-button/attachment-button.component.mjs +69 -0
- package/esm2020/lib/comments/attachment-scraper.directive.mjs +107 -0
- package/esm2020/lib/comments/banta-comments/banta-comments.component.mjs +666 -0
- package/esm2020/lib/comments/comment/comment.component.mjs +217 -0
- package/esm2020/lib/comments/comment-field/comment-field.component.mjs +377 -0
- package/esm2020/lib/comments/comment-sort/comment-sort.component.mjs +37 -0
- package/esm2020/lib/comments/comment-view/comment-view.component.mjs +379 -0
- package/esm2020/lib/comments/comments.module.mjs +111 -0
- package/{esm2015/lib/comments/index.js → esm2020/lib/comments/index.mjs} +0 -0
- package/esm2020/lib/comments/live-comment.component.mjs +80 -0
- package/esm2020/lib/comments/reply-send-options.directive.mjs +13 -0
- package/esm2020/lib/common/attachment/attachment.component.mjs +113 -0
- package/esm2020/lib/common/attachments/attachments.component.mjs +72 -0
- package/esm2020/lib/common/common.module.mjs +59 -0
- package/{esm2015/lib/common/index.js → esm2020/lib/common/index.mjs} +0 -0
- package/{esm2015/lib/common/lazy-connection.js → esm2020/lib/common/lazy-connection.mjs} +0 -0
- package/esm2020/lib/common/lightbox/lightbox.component.mjs +31 -0
- package/esm2020/lib/common/markdown-to-html.pipe.mjs +76 -0
- package/esm2020/lib/common/mention-linker.pipe.mjs +35 -0
- package/esm2020/lib/common/timestamp.component.mjs +113 -0
- package/esm2020/lib/common/trust-resource-url.pipe.mjs +22 -0
- package/esm2020/lib/emoji/emoji-selector-button.component.mjs +113 -0
- package/esm2020/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.mjs +88 -0
- package/esm2020/lib/emoji/emoji.module.mjs +55 -0
- package/{esm2015/lib/emoji/emojis.js → esm2020/lib/emoji/emojis.mjs} +0 -0
- package/{esm2015/lib/emoji/index.js → esm2020/lib/emoji/index.mjs} +0 -0
- package/esm2020/lib/giphy-attachments.mjs +16 -0
- package/{esm2015/lib/index.js → esm2020/lib/index.mjs} +0 -0
- package/esm2020/lib/live-message.component.mjs +96 -0
- package/{esm2015/lib/message-menu-item.js → esm2020/lib/message-menu-item.mjs} +0 -0
- package/{esm2015/lib/sdk-options.js → esm2020/lib/sdk-options.mjs} +0 -0
- package/esm2020/lib/tweet-attachments.mjs +13 -0
- package/esm2020/lib/url-attachments.mjs +42 -0
- package/esm2020/lib/youtube-attachments.mjs +22 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- package/fesm2015/{banta-sdk.js → banta-sdk.mjs} +2323 -2008
- package/fesm2015/banta-sdk.mjs.map +1 -0
- package/fesm2020/banta-sdk.mjs +10490 -0
- package/fesm2020/banta-sdk.mjs.map +1 -0
- package/{banta-sdk.d.ts → index.d.ts} +1 -0
- package/lib/banta/banta.component.d.ts +3 -0
- package/lib/banta-logo.component.d.ts +3 -0
- package/lib/banta-sdk.module.d.ts +24 -0
- package/lib/chat/banta-chat/banta-chat.component.d.ts +3 -0
- package/lib/chat/chat-message/chat-message.component.d.ts +3 -0
- package/lib/chat/chat-view/chat-view.component.d.ts +3 -0
- package/lib/chat/chat.module.d.ts +13 -0
- package/lib/chat/live-chat-message.component.d.ts +3 -0
- package/lib/chat-backend.d.ts +3 -0
- package/lib/chat-source.d.ts +3 -3
- package/lib/comments/attachment-button/attachment-button.component.d.ts +3 -0
- package/lib/comments/attachment-scraper.directive.d.ts +3 -0
- package/lib/comments/banta-comments/banta-comments.component.d.ts +3 -0
- package/lib/comments/comment/comment.component.d.ts +3 -0
- package/lib/comments/comment-field/comment-field.component.d.ts +3 -0
- package/lib/comments/comment-sort/comment-sort.component.d.ts +3 -0
- package/lib/comments/comment-view/comment-view.component.d.ts +3 -0
- package/lib/comments/comments.module.d.ts +28 -0
- package/lib/comments/live-comment.component.d.ts +3 -0
- package/lib/comments/reply-send-options.directive.d.ts +3 -0
- package/lib/common/attachment/attachment.component.d.ts +3 -0
- package/lib/common/attachments/attachments.component.d.ts +3 -0
- package/lib/common/common.module.d.ts +15 -0
- package/lib/common/lightbox/lightbox.component.d.ts +3 -0
- package/lib/common/markdown-to-html.pipe.d.ts +3 -0
- package/lib/common/mention-linker.pipe.d.ts +3 -0
- package/lib/common/timestamp.component.d.ts +3 -0
- package/lib/common/trust-resource-url.pipe.d.ts +3 -0
- package/lib/emoji/emoji-selector-button.component.d.ts +3 -0
- package/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.d.ts +3 -0
- package/lib/emoji/emoji.module.d.ts +14 -0
- package/lib/live-message.component.d.ts +3 -0
- package/lib/url-attachments.d.ts +3 -0
- package/package.json +22 -10
- package/banta-sdk.metadata.json +0 -1
- package/bundles/banta-sdk.umd.js +0 -11895
- package/bundles/banta-sdk.umd.js.map +0 -1
- package/bundles/banta-sdk.umd.min.js +0 -2
- package/bundles/banta-sdk.umd.min.js.map +0 -1
- package/esm2015/lib/banta/banta.component.js +0 -201
- package/esm2015/lib/banta-logo.component.js +0 -20
- package/esm2015/lib/banta-sdk.module.js +0 -98
- package/esm2015/lib/chat/banta-chat/banta-chat.component.js +0 -175
- package/esm2015/lib/chat/chat-message/chat-message.component.js +0 -56
- package/esm2015/lib/chat/chat-view/chat-view.component.js +0 -167
- package/esm2015/lib/chat/chat.module.js +0 -32
- package/esm2015/lib/chat/live-chat-message.component.js +0 -71
- package/esm2015/lib/chat-backend.js +0 -92
- package/esm2015/lib/chat-source.js +0 -205
- package/esm2015/lib/comments/attachment-button/attachment-button.component.js +0 -70
- package/esm2015/lib/comments/attachment-scraper.directive.js +0 -109
- package/esm2015/lib/comments/banta-comments/banta-comments.component.js +0 -678
- package/esm2015/lib/comments/comment/comment.component.js +0 -186
- package/esm2015/lib/comments/comment-field/comment-field.component.js +0 -350
- package/esm2015/lib/comments/comment-sort/comment-sort.component.js +0 -34
- package/esm2015/lib/comments/comment-view/comment-view.component.js +0 -364
- package/esm2015/lib/comments/comments.module.js +0 -62
- package/esm2015/lib/comments/live-comment.component.js +0 -71
- package/esm2015/lib/comments/reply-send-options.directive.js +0 -9
- package/esm2015/lib/common/attachment/attachment.component.js +0 -105
- package/esm2015/lib/common/attachments/attachments.component.js +0 -66
- package/esm2015/lib/common/common.module.js +0 -36
- package/esm2015/lib/common/lightbox/lightbox.component.js +0 -30
- package/esm2015/lib/common/markdown-to-html.pipe.js +0 -74
- package/esm2015/lib/common/mention-linker.pipe.js +0 -31
- package/esm2015/lib/common/timestamp.component.js +0 -106
- package/esm2015/lib/common/trust-resource-url.pipe.js +0 -21
- package/esm2015/lib/emoji/emoji-selector-button.component.js +0 -108
- package/esm2015/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.js +0 -86
- package/esm2015/lib/emoji/emoji.module.js +0 -34
- package/esm2015/lib/giphy-attachments.js +0 -20
- package/esm2015/lib/live-message.component.js +0 -74
- package/esm2015/lib/tweet-attachments.js +0 -16
- package/esm2015/lib/url-attachments.js +0 -46
- package/esm2015/lib/youtube-attachments.js +0 -25
- package/fesm2015/banta-sdk.js.map +0 -1
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { Component, Input, Output } from '@angular/core';
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../chat-backend-base";
|
|
5
|
+
import * as i2 from "@angular/common";
|
|
6
|
+
import * as i3 from "./chat-message/chat-message.component";
|
|
7
|
+
export class LiveChatMessageComponent {
|
|
8
|
+
constructor(backend) {
|
|
9
|
+
this.backend = backend;
|
|
10
|
+
this._upvoted = new Subject();
|
|
11
|
+
this._reported = new Subject();
|
|
12
|
+
this._selected = new Subject();
|
|
13
|
+
}
|
|
14
|
+
get upvoted() {
|
|
15
|
+
return this._upvoted;
|
|
16
|
+
}
|
|
17
|
+
get reported() {
|
|
18
|
+
return this._reported;
|
|
19
|
+
}
|
|
20
|
+
get selected() {
|
|
21
|
+
return this._selected;
|
|
22
|
+
}
|
|
23
|
+
get message() {
|
|
24
|
+
return this._message;
|
|
25
|
+
}
|
|
26
|
+
set message(value) {
|
|
27
|
+
let originalId = null;
|
|
28
|
+
if (this._message)
|
|
29
|
+
originalId = this._message.id;
|
|
30
|
+
this._message = value;
|
|
31
|
+
if (value && originalId === value.id) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (this.unsubscribe)
|
|
35
|
+
this.unsubscribe();
|
|
36
|
+
if (value) {
|
|
37
|
+
this.unsubscribe = this.backend.watchMessage(value, message => this.message = message);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
report() {
|
|
41
|
+
this._reported.next();
|
|
42
|
+
}
|
|
43
|
+
upvote() {
|
|
44
|
+
this._upvoted.next();
|
|
45
|
+
}
|
|
46
|
+
select() {
|
|
47
|
+
this._selected.next();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
LiveChatMessageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: LiveChatMessageComponent, deps: [{ token: i1.ChatBackendBase }], target: i0.ɵɵFactoryTarget.Component });
|
|
51
|
+
LiveChatMessageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: LiveChatMessageComponent, selector: "banta-live-chat-message", inputs: { message: "message" }, outputs: { upvoted: "upvoted", reported: "reported", selected: "selected" }, ngImport: i0, template: `
|
|
52
|
+
<banta-chat-message
|
|
53
|
+
*ngIf="message"
|
|
54
|
+
[message]="message"
|
|
55
|
+
(upvoted)="upvote()"
|
|
56
|
+
(reported)="report()"
|
|
57
|
+
(selected)="select()"
|
|
58
|
+
></banta-chat-message>
|
|
59
|
+
`, isInline: true, styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.ChatMessageComponent, selector: "banta-chat-message", inputs: ["message"], outputs: ["userSelected", "selected", "reported", "upvoted"] }] });
|
|
60
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: LiveChatMessageComponent, decorators: [{
|
|
61
|
+
type: Component,
|
|
62
|
+
args: [{ selector: 'banta-live-chat-message', template: `
|
|
63
|
+
<banta-chat-message
|
|
64
|
+
*ngIf="message"
|
|
65
|
+
[message]="message"
|
|
66
|
+
(upvoted)="upvote()"
|
|
67
|
+
(reported)="report()"
|
|
68
|
+
(selected)="select()"
|
|
69
|
+
></banta-chat-message>
|
|
70
|
+
` }]
|
|
71
|
+
}], ctorParameters: function () { return [{ type: i1.ChatBackendBase }]; }, propDecorators: { upvoted: [{
|
|
72
|
+
type: Output
|
|
73
|
+
}], reported: [{
|
|
74
|
+
type: Output
|
|
75
|
+
}], selected: [{
|
|
76
|
+
type: Output
|
|
77
|
+
}], message: [{
|
|
78
|
+
type: Input
|
|
79
|
+
}] } });
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGl2ZS1jaGF0LW1lc3NhZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvY2hhdC9saXZlLWNoYXQtbWVzc2FnZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpELE9BQU8sRUFBRSxPQUFPLEVBQWMsTUFBTSxNQUFNLENBQUM7Ozs7O0FBZ0IzQyxNQUFNLE9BQU8sd0JBQXdCO0lBQ2pDLFlBQ1ksT0FBeUI7UUFBekIsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUFNN0IsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDL0IsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDaEMsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFMeEMsQ0FBQztJQU9ELElBQ0ksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFDSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUNJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQ0ksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDO0lBSUQsSUFBSSxPQUFPLENBQUMsS0FBSztRQUNiLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxRQUFRO1lBQ2IsVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBRWxDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBRXRCLElBQUksS0FBSyxJQUFJLFVBQVUsS0FBSyxLQUFLLENBQUMsRUFBRSxFQUFFO1lBQ2xDLE9BQU87U0FDVjtRQUVELElBQUksSUFBSSxDQUFDLFdBQVc7WUFDaEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRXZCLElBQUksS0FBSyxFQUFFO1lBQ1AsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1NBQzFGO0lBQ0wsQ0FBQztJQUVELE1BQU07UUFDRixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxNQUFNO1FBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsTUFBTTtRQUNGLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUIsQ0FBQzs7c0hBL0RRLHdCQUF3QjswR0FBeEIsd0JBQXdCLDRLQVh2Qjs7Ozs7Ozs7S0FRVDs0RkFHUSx3QkFBd0I7a0JBYnBDLFNBQVM7K0JBQ0kseUJBQXlCLFlBQ3pCOzs7Ozs7OztLQVFUO3NHQWdCRyxPQUFPO3NCQURWLE1BQU07Z0JBTUgsUUFBUTtzQkFEWCxNQUFNO2dCQU1ILFFBQVE7c0JBRFgsTUFBTTtnQkFNSCxPQUFPO3NCQURWLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ2hhdE1lc3NhZ2UgfSBmcm9tICdAYmFudGEvY29tbW9uJztcclxuaW1wb3J0IHsgU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBDaGF0QmFja2VuZEJhc2UgfSBmcm9tICcuLi9jaGF0LWJhY2tlbmQtYmFzZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYmFudGEtbGl2ZS1jaGF0LW1lc3NhZ2UnLFxyXG4gICAgdGVtcGxhdGU6IGBcclxuICAgICAgICA8YmFudGEtY2hhdC1tZXNzYWdlIFxyXG4gICAgICAgICAgICAqbmdJZj1cIm1lc3NhZ2VcIlxyXG4gICAgICAgICAgICBbbWVzc2FnZV09XCJtZXNzYWdlXCJcclxuICAgICAgICAgICAgKHVwdm90ZWQpPVwidXB2b3RlKClcIlxyXG4gICAgICAgICAgICAocmVwb3J0ZWQpPVwicmVwb3J0KClcIlxyXG4gICAgICAgICAgICAoc2VsZWN0ZWQpPVwic2VsZWN0KClcIlxyXG4gICAgICAgICAgICA+PC9iYW50YS1jaGF0LW1lc3NhZ2U+XHJcbiAgICBgLFxyXG4gICAgc3R5bGVzOiBbYGBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMaXZlQ2hhdE1lc3NhZ2VDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBiYWNrZW5kIDogQ2hhdEJhY2tlbmRCYXNlXHJcbiAgICApIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbWVzc2FnZSA6IENoYXRNZXNzYWdlO1xyXG4gICAgcHJpdmF0ZSBfdXB2b3RlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcml2YXRlIF9yZXBvcnRlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcml2YXRlIF9zZWxlY3RlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBnZXQgdXB2b3RlZCgpIDogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Vwdm90ZWQ7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIEBPdXRwdXQoKVxyXG4gICAgZ2V0IHJlcG9ydGVkKCkgOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVwb3J0ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBnZXQgc2VsZWN0ZWQoKSA6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgQElucHV0KClcclxuICAgIGdldCBtZXNzYWdlKCkgOiBDaGF0TWVzc2FnZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21lc3NhZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1bnN1YnNjcmliZSA6IEZ1bmN0aW9uO1xyXG5cclxuICAgIHNldCBtZXNzYWdlKHZhbHVlKSB7XHJcbiAgICAgICAgbGV0IG9yaWdpbmFsSWQgPSBudWxsO1xyXG4gICAgICAgIGlmICh0aGlzLl9tZXNzYWdlKVxyXG4gICAgICAgICAgICBvcmlnaW5hbElkID0gdGhpcy5fbWVzc2FnZS5pZDtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLl9tZXNzYWdlID0gdmFsdWU7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSAmJiBvcmlnaW5hbElkID09PSB2YWx1ZS5pZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy51bnN1YnNjcmliZSlcclxuICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlID0gdGhpcy5iYWNrZW5kLndhdGNoTWVzc2FnZSh2YWx1ZSwgbWVzc2FnZSA9PiB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVwb3J0KCkge1xyXG4gICAgICAgIHRoaXMuX3JlcG9ydGVkLm5leHQoKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgdXB2b3RlKCkge1xyXG4gICAgICAgIHRoaXMuX3Vwdm90ZWQubmV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdCgpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZC5uZXh0KCk7XHJcbiAgICB9XHJcbn0iXX0=
|
|
File without changes
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { Inject, Injectable } from "@angular/core";
|
|
2
|
+
import { CommentsOrder, DurableSocket } from "@banta/common";
|
|
3
|
+
import { ChatBackendBase } from "./chat-backend-base";
|
|
4
|
+
import { ChatSource } from "./chat-source";
|
|
5
|
+
import { BANTA_SDK_OPTIONS } from "./sdk-options";
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class ChatBackend extends ChatBackendBase {
|
|
8
|
+
constructor(options) {
|
|
9
|
+
super();
|
|
10
|
+
this.options = options;
|
|
11
|
+
}
|
|
12
|
+
get serviceUrl() {
|
|
13
|
+
return `${this.options?.serviceUrl ?? 'http://localhost:3422'}`;
|
|
14
|
+
}
|
|
15
|
+
async connectToService() {
|
|
16
|
+
let socket = new DurableSocket(`${this.serviceUrl.replace(/^http/, 'ws')}/socket`);
|
|
17
|
+
await new Promise((resolve, reject) => {
|
|
18
|
+
socket.onopen = () => {
|
|
19
|
+
resolve();
|
|
20
|
+
};
|
|
21
|
+
socket.onclose = e => {
|
|
22
|
+
if (e.code === 503) {
|
|
23
|
+
console.error(`Failed to connect to chat service!`);
|
|
24
|
+
reject(e);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
socket.onerror = undefined;
|
|
29
|
+
return socket;
|
|
30
|
+
}
|
|
31
|
+
async getSourceForTopic(topicId, options) {
|
|
32
|
+
return await new ChatSource(this, topicId, undefined, options?.sortOrder || CommentsOrder.NEWEST)
|
|
33
|
+
.bind(await this.connectToService());
|
|
34
|
+
}
|
|
35
|
+
async getSourceForThread(topicId, messageId, options) {
|
|
36
|
+
return await new ChatSource(this, topicId, messageId, options?.sortOrder || CommentsOrder.NEWEST)
|
|
37
|
+
.bind(await this.connectToService());
|
|
38
|
+
}
|
|
39
|
+
async getSourceCountForTopic(topicId) {
|
|
40
|
+
let response = await fetch(`${this.serviceUrl}/topics/${topicId}`);
|
|
41
|
+
if (response.status >= 400)
|
|
42
|
+
return 0;
|
|
43
|
+
let topic = await response.json();
|
|
44
|
+
return topic.messageCount || 0;
|
|
45
|
+
}
|
|
46
|
+
refreshMessage(message) {
|
|
47
|
+
throw new Error("Method not implemented.");
|
|
48
|
+
}
|
|
49
|
+
getMessage(topicId, messageId) {
|
|
50
|
+
throw new Error("Method not implemented.");
|
|
51
|
+
}
|
|
52
|
+
getSubMessage(topicId, parentMessageId, messageId) {
|
|
53
|
+
throw new Error("Method not implemented.");
|
|
54
|
+
}
|
|
55
|
+
watchMessage(message, handler) {
|
|
56
|
+
throw new Error("Method not implemented.");
|
|
57
|
+
}
|
|
58
|
+
async getCardForUrl(url) {
|
|
59
|
+
let response = await fetch(`${this.serviceUrl}/urls`, {
|
|
60
|
+
method: 'POST',
|
|
61
|
+
headers: {
|
|
62
|
+
'Content-Type': 'application/json'
|
|
63
|
+
},
|
|
64
|
+
body: JSON.stringify({
|
|
65
|
+
url
|
|
66
|
+
})
|
|
67
|
+
});
|
|
68
|
+
if (response.status == 404)
|
|
69
|
+
return null;
|
|
70
|
+
if (response.status >= 400)
|
|
71
|
+
throw new Error(`Failed to retrieve URL card: ${response.status}. Body: '${await response.text()}'`);
|
|
72
|
+
return await response.json();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
ChatBackend.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ChatBackend, deps: [{ token: BANTA_SDK_OPTIONS }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
76
|
+
ChatBackend.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ChatBackend });
|
|
77
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ChatBackend, decorators: [{
|
|
78
|
+
type: Injectable
|
|
79
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
80
|
+
type: Inject,
|
|
81
|
+
args: [BANTA_SDK_OPTIONS]
|
|
82
|
+
}] }]; } });
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1iYWNrZW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvY2hhdC1iYWNrZW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBZSxhQUFhLEVBQUUsYUFBYSxFQUFxQyxNQUFNLGVBQWUsQ0FBQztBQUU3RyxPQUFPLEVBQUUsZUFBZSxFQUFxQixNQUFNLHFCQUFxQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFjLE1BQU0sZUFBZSxDQUFDOztBQUc5RCxNQUFNLE9BQU8sV0FBWSxTQUFRLGVBQWU7SUFDNUMsWUFDdUMsT0FBbUI7UUFFdEQsS0FBSyxFQUFFLENBQUM7UUFGMkIsWUFBTyxHQUFQLE9BQU8sQ0FBWTtJQUcxRCxDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1YsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLHVCQUF1QixFQUFFLENBQUM7SUFDcEUsQ0FBQztJQUVPLEtBQUssQ0FBQyxnQkFBZ0I7UUFDMUIsSUFBSSxNQUFNLEdBQUcsSUFBSSxhQUFhLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25GLE1BQU0sSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDeEMsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUU7Z0JBQ2pCLE9BQU8sRUFBRSxDQUFDO1lBQ2QsQ0FBQyxDQUFBO1lBRUQsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRTtnQkFDakIsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLEdBQUcs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bnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQ2hhdE1lc3NhZ2UsIENvbW1lbnRzT3JkZXIsIER1cmFibGVTb2NrZXQsIE5vdGlmaWNhdGlvbiwgVXJsQ2FyZCwgVXNlciwgVm90ZSB9IGZyb20gXCJAYmFudGEvY29tbW9uXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBDaGF0QmFja2VuZEJhc2UsIENoYXRTb3VyY2VPcHRpb25zIH0gZnJvbSBcIi4vY2hhdC1iYWNrZW5kLWJhc2VcIjtcclxuaW1wb3J0IHsgQ2hhdFNvdXJjZSB9IGZyb20gXCIuL2NoYXQtc291cmNlXCI7XHJcbmltcG9ydCB7IENoYXRTb3VyY2VCYXNlIH0gZnJvbSBcIi4vY2hhdC1zb3VyY2UtYmFzZVwiO1xyXG5pbXBvcnQgeyBCQU5UQV9TREtfT1BUSU9OUywgU2RrT3B0aW9ucyB9IGZyb20gXCIuL3Nkay1vcHRpb25zXCI7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDaGF0QmFja2VuZCBleHRlbmRzIENoYXRCYWNrZW5kQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBASW5qZWN0KEJBTlRBX1NES19PUFRJT05TKSBwcml2YXRlIG9wdGlvbnM6IFNka09wdGlvbnNcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNlcnZpY2VVcmwoKSB7XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMub3B0aW9ucz8uc2VydmljZVVybCA/PyAnaHR0cDovL2xvY2FsaG9zdDozNDIyJ31gO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgY29ubmVjdFRvU2VydmljZSgpIHtcclxuICAgICAgICBsZXQgc29ja2V0ID0gbmV3IER1cmFibGVTb2NrZXQoYCR7dGhpcy5zZXJ2aWNlVXJsLnJlcGxhY2UoL15odHRwLywgJ3dzJyl9L3NvY2tldGApO1xyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgc29ja2V0Lm9ub3BlbiA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgc29ja2V0Lm9uY2xvc2UgPSBlID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlLmNvZGUgPT09IDUwMykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjb25uZWN0IHRvIGNoYXQgc2VydmljZSFgKTtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgc29ja2V0Lm9uZXJyb3IgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIHJldHVybiBzb2NrZXQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0U291cmNlRm9yVG9waWModG9waWNJZDogc3RyaW5nLCBvcHRpb25zPzogQ2hhdFNvdXJjZU9wdGlvbnMpOiBQcm9taXNlPENoYXRTb3VyY2VCYXNlPiB7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IG5ldyBDaGF0U291cmNlKHRoaXMsIHRvcGljSWQsIHVuZGVmaW5lZCwgb3B0aW9ucz8uc29ydE9yZGVyIHx8IENvbW1lbnRzT3JkZXIuTkVXRVNUKVxyXG4gICAgICAgICAgICAuYmluZChhd2FpdCB0aGlzLmNvbm5lY3RUb1NlcnZpY2UoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0U291cmNlRm9yVGhyZWFkKHRvcGljSWQ6IHN0cmluZywgbWVzc2FnZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBDaGF0U291cmNlT3B0aW9ucyk6IFByb21pc2U8Q2hhdFNvdXJjZT4ge1xyXG4gICAgICAgIHJldHVybiBhd2FpdCBuZXcgQ2hhdFNvdXJjZSh0aGlzLCB0b3BpY0lkLCBtZXNzYWdlSWQsIG9wdGlvbnM/LnNvcnRPcmRlciB8fCBDb21tZW50c09yZGVyLk5FV0VTVClcclxuICAgICAgICAgICAgLmJpbmQoYXdhaXQgdGhpcy5jb25uZWN0VG9TZXJ2aWNlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldFNvdXJjZUNvdW50Rm9yVG9waWModG9waWNJZDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHt0aGlzLnNlcnZpY2VVcmx9L3RvcGljcy8ke3RvcGljSWR9YClcclxuXHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA+PSA0MDApXHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG5cclxuICAgICAgICBsZXQgdG9waWMgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcbiAgICAgICAgcmV0dXJuIHRvcGljLm1lc3NhZ2VDb3VudCB8fCAwO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hNZXNzYWdlKG1lc3NhZ2U6IENoYXRNZXNzYWdlKTogUHJvbWlzZTxDaGF0TWVzc2FnZT4ge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBnZXRNZXNzYWdlKHRvcGljSWQ6IHN0cmluZywgbWVzc2FnZUlkOiBzdHJpbmcpOiBQcm9taXNlPENoYXRNZXNzYWdlPiB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC5cIik7XHJcbiAgICB9XHJcbiAgICBnZXRTdWJNZXNzYWdlKHRvcGljSWQ6IHN0cmluZywgcGFyZW50TWVzc2FnZUlkOiBzdHJpbmcsIG1lc3NhZ2VJZDogc3RyaW5nKTogUHJvbWlzZTxDaGF0TWVzc2FnZT4ge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG4gICAgd2F0Y2hNZXNzYWdlKG1lc3NhZ2U6IENoYXRNZXNzYWdlLCBoYW5kbGVyOiAobWVzc2FnZTogQ2hhdE1lc3NhZ2UpID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2Qgbm90IGltcGxlbWVudGVkLlwiKTtcclxuICAgIH1cclxuICAgIG5vdGlmaWNhdGlvbnNDaGFuZ2VkOiBPYnNlcnZhYmxlPE5vdGlmaWNhdGlvbltdPjtcclxuICAgIG5ld05vdGlmaWNhdGlvbjogT2JzZXJ2YWJsZTxOb3RpZmljYXRpb24+O1xyXG4gICAgXHJcbiAgICBhc3luYyBnZXRDYXJkRm9yVXJsKHVybDogc3RyaW5nKTogUHJvbWlzZTxVcmxDYXJkPiB7XHJcbiAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5zZXJ2aWNlVXJsfS91cmxzYCwge1xyXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgICAgICB1cmxcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSA0MDQpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPj0gNDAwKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZXRyaWV2ZSBVUkwgY2FyZDogJHtyZXNwb25zZS5zdGF0dXN9LiBCb2R5OiAnJHthd2FpdCByZXNwb25zZS50ZXh0KCl9J2ApO1xyXG5cclxuICAgICAgICByZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgfVxyXG59Il19
|
|
File without changes
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { Subject, Subscription } from "rxjs";
|
|
3
|
+
import { RpcEvent, SocketRPC } from "@banta/common";
|
|
4
|
+
export class ChatSource extends SocketRPC {
|
|
5
|
+
constructor(backend, identifier, parentIdentifier, sortOrder) {
|
|
6
|
+
super();
|
|
7
|
+
this.backend = backend;
|
|
8
|
+
this.identifier = identifier;
|
|
9
|
+
this.parentIdentifier = parentIdentifier;
|
|
10
|
+
this.sortOrder = sortOrder;
|
|
11
|
+
this.subscription = new Subscription();
|
|
12
|
+
this._state = 'connecting';
|
|
13
|
+
this._connectionStateChanged = new Subject();
|
|
14
|
+
this.messageMap = new Map();
|
|
15
|
+
this._messageReceived = new Subject();
|
|
16
|
+
this._messageUpdated = new Subject();
|
|
17
|
+
this._messageSent = new Subject();
|
|
18
|
+
this._messageObserved = new Subject();
|
|
19
|
+
this.messages = [];
|
|
20
|
+
this.ready = new Promise(resolve => this.markReady = resolve);
|
|
21
|
+
}
|
|
22
|
+
get state() {
|
|
23
|
+
return this._state;
|
|
24
|
+
}
|
|
25
|
+
set state(value) {
|
|
26
|
+
this._state = value;
|
|
27
|
+
setTimeout(() => this._connectionStateChanged.next(this._state));
|
|
28
|
+
}
|
|
29
|
+
get connectionStateChanged() {
|
|
30
|
+
return this._connectionStateChanged.asObservable();
|
|
31
|
+
}
|
|
32
|
+
async bind(socket) {
|
|
33
|
+
super.bind(socket);
|
|
34
|
+
this.state = 'connected';
|
|
35
|
+
this.markReady();
|
|
36
|
+
await this.subscribeToTopic();
|
|
37
|
+
this.subscription.add(this.backend.userChanged.subscribe(() => this.authenticate()));
|
|
38
|
+
socket.addEventListener('open', async () => {
|
|
39
|
+
this.state = 'connected';
|
|
40
|
+
});
|
|
41
|
+
socket.addEventListener('lost', async () => {
|
|
42
|
+
this.state = 'lost';
|
|
43
|
+
});
|
|
44
|
+
socket.addEventListener('restore', async () => {
|
|
45
|
+
this.state = 'restored';
|
|
46
|
+
await this.authenticate();
|
|
47
|
+
await this.subscribeToTopic();
|
|
48
|
+
});
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
mapOrUpdateMessages(messages) {
|
|
52
|
+
return messages.map(message => this.mapOrUpdateMessage(message));
|
|
53
|
+
}
|
|
54
|
+
mapOrUpdateMessage(message) {
|
|
55
|
+
let existingMessage = this.messageMap.get(message.id);
|
|
56
|
+
if (existingMessage) {
|
|
57
|
+
message = Object.assign(existingMessage, message);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
this.messageMap.set(message.id, message);
|
|
61
|
+
this._messageObserved.next(message);
|
|
62
|
+
}
|
|
63
|
+
return message;
|
|
64
|
+
}
|
|
65
|
+
async getExistingMessages() {
|
|
66
|
+
let messages = await this.peer.getExistingMessages();
|
|
67
|
+
messages = this.mapOrUpdateMessages(messages);
|
|
68
|
+
return messages;
|
|
69
|
+
}
|
|
70
|
+
async ensureConnection(errorMessage) {
|
|
71
|
+
let reason = `Connection to chat services is not currently available.`;
|
|
72
|
+
if (this.state !== 'connected' && this.state !== 'restored') {
|
|
73
|
+
if (errorMessage)
|
|
74
|
+
throw new Error(`${errorMessage}: ${reason}`);
|
|
75
|
+
else
|
|
76
|
+
throw new Error(`${reason}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async editMessage(messageId, text) {
|
|
80
|
+
await this.ensureConnection();
|
|
81
|
+
await this.peer.editMessage(messageId, text);
|
|
82
|
+
}
|
|
83
|
+
async subscribeToTopic() {
|
|
84
|
+
await this.peer.subscribe(this.identifier, this.parentIdentifier, this.sortOrder);
|
|
85
|
+
}
|
|
86
|
+
async authenticate() {
|
|
87
|
+
if (this.backend.user) {
|
|
88
|
+
try {
|
|
89
|
+
await this.peer.authenticate(this.backend.user?.token);
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
console.error(`Could not authenticate with Banta server:`);
|
|
93
|
+
console.error(e);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
close() {
|
|
98
|
+
super.close();
|
|
99
|
+
this.subscription.unsubscribe();
|
|
100
|
+
}
|
|
101
|
+
onPermissions(permissions) {
|
|
102
|
+
window.bantaPermissionsDebug = permissions;
|
|
103
|
+
this.permissions = permissions;
|
|
104
|
+
}
|
|
105
|
+
onChatMessage(message) {
|
|
106
|
+
if (this.messageMap.has(message.id)) {
|
|
107
|
+
return this.mapOrUpdateMessage(message);
|
|
108
|
+
}
|
|
109
|
+
else if (!message.hidden) {
|
|
110
|
+
// Only process non-hidden messages through here.
|
|
111
|
+
// Hidden messages may be sent to us when they become hidden (ie moderation is occurring).
|
|
112
|
+
// But if we never had the message to begin with, we should discard it.
|
|
113
|
+
this.messageMap.set(message.id, message);
|
|
114
|
+
this._messageReceived.next(message);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
get messageReceived() { return this._messageReceived.asObservable(); }
|
|
118
|
+
get messageUpdated() { return this._messageUpdated.asObservable(); }
|
|
119
|
+
get messageSent() { return this._messageSent.asObservable(); }
|
|
120
|
+
get messageObserved() { return this._messageObserved.asObservable(); }
|
|
121
|
+
async send(message) {
|
|
122
|
+
await this.ensureConnection();
|
|
123
|
+
return await this.peer.sendMessage(message);
|
|
124
|
+
}
|
|
125
|
+
async loadAfter(message, count) {
|
|
126
|
+
if (!message)
|
|
127
|
+
return;
|
|
128
|
+
if (!message.pagingCursor)
|
|
129
|
+
return [];
|
|
130
|
+
return this.mapOrUpdateMessages(await this.peer.loadAfter(Number(message.pagingCursor), count));
|
|
131
|
+
}
|
|
132
|
+
async get(id) {
|
|
133
|
+
if (this.messageMap.has(id))
|
|
134
|
+
return this.messageMap.get(id);
|
|
135
|
+
await this.ensureConnection(`Could not get message`);
|
|
136
|
+
let message = await this.peer.getMessage(id);
|
|
137
|
+
if (this.messageMap.has(id)) {
|
|
138
|
+
let existingMessage = this.messageMap.get(id);
|
|
139
|
+
Object.assign(existingMessage, message);
|
|
140
|
+
message = existingMessage;
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
this.messageMap.set(id, message);
|
|
144
|
+
}
|
|
145
|
+
return message;
|
|
146
|
+
}
|
|
147
|
+
async getCount() {
|
|
148
|
+
return await this.peer.getCount();
|
|
149
|
+
}
|
|
150
|
+
async likeMessage(messageId) {
|
|
151
|
+
await this.ensureConnection();
|
|
152
|
+
return await this.peer.likeMessage(messageId);
|
|
153
|
+
}
|
|
154
|
+
async unlikeMessage(messageId) {
|
|
155
|
+
await this.ensureConnection();
|
|
156
|
+
return await this.peer.unlikeMessage(messageId);
|
|
157
|
+
}
|
|
158
|
+
async deleteMessage(messageId) {
|
|
159
|
+
await this.ensureConnection();
|
|
160
|
+
return await this.peer.deleteMessage(messageId);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
__decorate([
|
|
164
|
+
RpcEvent()
|
|
165
|
+
], ChatSource.prototype, "onPermissions", null);
|
|
166
|
+
__decorate([
|
|
167
|
+
RpcEvent()
|
|
168
|
+
], ChatSource.prototype, "onChatMessage", null);
|
|
169
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zZGsvc3JjL2xpYi9jaGF0LXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekQsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJcEQsTUFBTSxPQUFPLFVBQVcsU0FBUSxTQUFTO0lBQ3JDLFlBQ2EsT0FBb0IsRUFDcEIsVUFBa0IsRUFDbEIsZ0JBQXdCLEVBQ3hCLFNBQXdCO1FBRWpDLEtBQUssRUFBRSxDQUFDO1FBTEMsWUFBTyxHQUFQLE9BQU8sQ0FBYTtRQUNwQixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ2xCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBUTtRQUN4QixjQUFTLEdBQVQsU0FBUyxDQUFlO1FBTTdCLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQU1sQyxXQUFNLEdBQXFELFlBQVksQ0FBQztRQVd4RSw0QkFBdUIsR0FBRyxJQUFJLE9BQU8sRUFBb0QsQ0FBQztRQTBHMUYsZUFBVSxHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDO1FBQzVDLHFCQUFnQixHQUFHLElBQUksT0FBTyxFQUFlLENBQUM7UUFDOUMsb0JBQWUsR0FBRyxJQUFJLE9BQU8sRUFBZSxDQUFDO1FBQzdDLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQWUsQ0FBQztRQUMxQyxxQkFBZ0IsR0FBRyxJQUFJLE9BQU8sRUFBZSxDQUFDO1FBT3RELGFBQVEsR0FBa0IsRUFBRSxDQUFDO1FBekl6QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksT0FBTyxDQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBVUQsSUFBSSxLQUFLO1FBQ0ws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QUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUFpQjtRQUNqQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzlCLE9BQU8sTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUFpQjtRQUNqQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzlCLE9BQU8sTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwRCxDQUFDO0NBRUo7QUFyRkc7SUFEQyxRQUFRLEVBQUU7K0NBSVY7QUFHRDtJQURDLFFBQVEsRUFBRTsrQ0FXViIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYXRNZXNzYWdlLCBDaGF0UGVybWlzc2lvbnMsIENvbW1lbnRzT3JkZXIsIER1cmFibGVTb2NrZXQsIFVzZXIgfSBmcm9tIFwiQGJhbnRhL2NvbW1vblwiO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBScGNFdmVudCwgU29ja2V0UlBDIH0gZnJvbSBcIkBiYW50YS9jb21tb25cIjtcclxuaW1wb3J0IHsgQ2hhdFNvdXJjZUJhc2UgfSBmcm9tIFwiLi9jaGF0LXNvdXJjZS1iYXNlXCI7XHJcbmltcG9ydCB7IENoYXRCYWNrZW5kIH0gZnJvbSBcIi4vY2hhdC1iYWNrZW5kXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ2hhdFNvdXJjZSBleHRlbmRzIFNvY2tldFJQQyBpbXBsZW1lbnRzIENoYXRTb3VyY2VCYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHJlYWRvbmx5IGJhY2tlbmQ6IENoYXRCYWNrZW5kLFxyXG4gICAgICAgIHJlYWRvbmx5IGlkZW50aWZpZXI6IHN0cmluZyxcclxuICAgICAgICByZWFkb25seSBwYXJlbnRJZGVudGlmaWVyOiBzdHJpbmcsXHJcbiAgICAgICAgcmVhZG9ubHkgc29ydE9yZGVyOiBDb21tZW50c09yZGVyXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMucmVhZHkgPSBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHRoaXMubWFya1JlYWR5ID0gcmVzb2x2ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcbiAgICBwcml2YXRlIG1hcmtSZWFkeTogKCkgPT4gdm9pZDtcclxuXHJcbiAgICByZWFkeTogUHJvbWlzZTx2b2lkPjtcclxuXHJcbiAgICBwZXJtaXNzaW9uczogQ2hhdFBlcm1pc3Npb25zO1xyXG4gICAgcHJpdmF0ZSBfc3RhdGU6ICdjb25uZWN0ZWQnIHwgJ2Nvbm5lY3RpbmcnIHwgJ2xvc3QnIHwgJ3Jlc3RvcmVkJyA9ICdjb25uZWN0aW5nJztcclxuXHJcbiAgICBnZXQgc3RhdGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBzdGF0ZSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX3N0YXRlID0gdmFsdWU7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLl9jb25uZWN0aW9uU3RhdGVDaGFuZ2VkLm5leHQodGhpcy5fc3RhdGUpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jb25uZWN0aW9uU3RhdGVDaGFuZ2VkID0gbmV3IFN1YmplY3Q8J2Nvbm5lY3RlZCcgfCAnY29ubmVjdGluZycgfCAnbG9zdCcgfCAncmVzdG9yZWQnPigpO1xyXG4gICAgZ2V0IGNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25TdGF0ZUNoYW5nZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgYmluZChzb2NrZXQ6IER1cmFibGVTb2NrZXQpOiBQcm9taXNlPHRoaXM+IHtcclxuICAgICAgICBzdXBlci5iaW5kKHNvY2tldCk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9ICdjb25uZWN0ZWQnO1xyXG4gICAgICAgIHRoaXMubWFya1JlYWR5KCk7XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuc3Vic2NyaWJlVG9Ub3BpYygpO1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZCh0aGlzLmJhY2tlbmQudXNlckNoYW5nZWQuc3Vic2NyaWJlKCgpID0+IHRoaXMuYXV0aGVudGljYXRlKCkpKTtcclxuXHJcbiAgICAgICAgc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAnY29ubmVjdGVkJztcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2xvc3QnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAnbG9zdCc7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdyZXN0b3JlJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gJ3Jlc3RvcmVkJztcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5hdXRoZW50aWNhdGUoKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zdWJzY3JpYmVUb1RvcGljKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbWFwT3JVcGRhdGVNZXNzYWdlcyhtZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSk6IENoYXRNZXNzYWdlW10ge1xyXG4gICAgICAgIHJldHVybiBtZXNzYWdlcy5tYXAobWVzc2FnZSA9PiB0aGlzLm1hcE9yVXBkYXRlTWVzc2FnZShtZXNzYWdlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBtYXBPclVwZGF0ZU1lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpOiBDaGF0TWVzc2FnZSB7XHJcbiAgICAgICAgbGV0IGV4aXN0aW5nTWVzc2FnZSA9IHRoaXMubWVzc2FnZU1hcC5nZXQobWVzc2FnZS5pZCk7XHJcbiAgICAgICAgaWYgKGV4aXN0aW5nTWVzc2FnZSkge1xyXG4gICAgICAgICAgICBtZXNzYWdlID0gT2JqZWN0LmFzc2lnbihleGlzdGluZ01lc3NhZ2UsIG1lc3NhZ2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZU1hcC5zZXQobWVzc2FnZS5pZCwgbWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VPYnNlcnZlZC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0RXhpc3RpbmdNZXNzYWdlcygpOiBQcm9taXNlPENoYXRNZXNzYWdlW10+IHtcclxuICAgICAgICBsZXQgbWVzc2FnZXMgPSBhd2FpdCB0aGlzLnBlZXIuZ2V0RXhpc3RpbmdNZXNzYWdlcygpO1xyXG4gICAgICAgIG1lc3NhZ2VzID0gdGhpcy5tYXBPclVwZGF0ZU1lc3NhZ2VzKG1lc3NhZ2VzKTtcclxuICAgICAgICByZXR1cm4gbWVzc2FnZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBlbnN1cmVDb25uZWN0aW9uKGVycm9yTWVzc2FnZT86IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZWFzb24gPSBgQ29ubmVjdGlvbiB0byBjaGF0IHNlcnZpY2VzIGlzIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlLmA7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgIT09ICdjb25uZWN0ZWQnICYmIHRoaXMuc3RhdGUgIT09ICdyZXN0b3JlZCcpIHtcclxuICAgICAgICAgICAgaWYgKGVycm9yTWVzc2FnZSlcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlcnJvck1lc3NhZ2V9OiAke3JlYXNvbn1gKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3JlYXNvbn1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZWRpdE1lc3NhZ2UobWVzc2FnZUlkOiBzdHJpbmcsIHRleHQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlQ29ubmVjdGlvbigpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucGVlci5lZGl0TWVzc2FnZShtZXNzYWdlSWQsIHRleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHN1YnNjcmliZVRvVG9waWMoKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5wZWVyLnN1YnNjcmliZSh0aGlzLmlkZW50aWZpZXIsIHRoaXMucGFyZW50SWRlbnRpZmllciwgdGhpcy5zb3J0T3JkZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGF1dGhlbnRpY2F0ZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5iYWNrZW5kLnVzZXIpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGVlci5hdXRoZW50aWNhdGUodGhpcy5iYWNrZW5kLnVzZXI/LnRva2VuKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQ291bGQgbm90IGF1dGhlbnRpY2F0ZSB3aXRoIEJhbnRhIHNlcnZlcjpgKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2UoKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIuY2xvc2UoKTtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIEBScGNFdmVudCgpXHJcbiAgICBvblBlcm1pc3Npb25zKHBlcm1pc3Npb25zOiBDaGF0UGVybWlzc2lvbnMpIHtcclxuICAgICAgICAod2luZG93IGFzIGFueSkuYmFudGFQZXJtaXNzaW9uc0RlYnVnID0gcGVybWlzc2lvbnM7XHJcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IHBlcm1pc3Npb25zO1xyXG4gICAgfVxyXG5cclxuICAgIEBScGNFdmVudCgpXHJcbiAgICBvbkNoYXRNZXNzYWdlKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubWVzc2FnZU1hcC5oYXMobWVzc2FnZS5pZCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFwT3JVcGRhdGVNZXNzYWdlKG1lc3NhZ2UpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIW1lc3NhZ2UuaGlkZGVuKSB7XHJcbiAgICAgICAgICAgIC8vIE9ubHkgcHJvY2VzcyBub24taGlkZGVuIG1lc3NhZ2VzIHRocm91Z2ggaGVyZS4gXHJcbiAgICAgICAgICAgIC8vIEhpZGRlbiBtZXNzYWdlcyBtYXkgYmUgc2VudCB0byB1cyB3aGVuIHRoZXkgYmVjb21lIGhpZGRlbiAoaWUgbW9kZXJhdGlvbiBpcyBvY2N1cnJpbmcpLlxyXG4gICAgICAgICAgICAvLyBCdXQgaWYgd2UgbmV2ZXIgaGFkIHRoZSBtZXNzYWdlIHRvIGJlZ2luIHdpdGgsIHdlIHNob3VsZCBkaXNjYXJkIGl0LlxyXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VNYXAuc2V0KG1lc3NhZ2UuaWQsIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlUmVjZWl2ZWQubmV4dChtZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBtZXNzYWdlTWFwID0gbmV3IE1hcDxzdHJpbmcsIENoYXRNZXNzYWdlPigpO1xyXG4gICAgcHJpdmF0ZSBfbWVzc2FnZVJlY2VpdmVkID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgICBwcml2YXRlIF9tZXNzYWdlVXBkYXRlZCA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlPigpO1xyXG4gICAgcHJpdmF0ZSBfbWVzc2FnZVNlbnQgPSBuZXcgU3ViamVjdDxDaGF0TWVzc2FnZT4oKTtcclxuICAgIHByaXZhdGUgX21lc3NhZ2VPYnNlcnZlZCA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlPigpO1xyXG5cclxuICAgIGdldCBtZXNzYWdlUmVjZWl2ZWQoKSB7IHJldHVybiB0aGlzLl9tZXNzYWdlUmVjZWl2ZWQuYXNPYnNlcnZhYmxlKCk7IH1cclxuICAgIGdldCBtZXNzYWdlVXBkYXRlZCgpIHsgcmV0dXJuIHRoaXMuX21lc3NhZ2VVcGRhdGVkLmFzT2JzZXJ2YWJsZSgpOyB9XHJcbiAgICBnZXQgbWVzc2FnZVNlbnQoKSB7IHJldHVybiB0aGlzLl9tZXNzYWdlU2VudC5hc09ic2VydmFibGUoKTsgfVxyXG4gICAgZ2V0IG1lc3NhZ2VPYnNlcnZlZCgpIHsgcmV0dXJuIHRoaXMuX21lc3NhZ2VPYnNlcnZlZC5hc09ic2VydmFibGUoKTsgfVxyXG5cclxuICAgIG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdID0gW107XHJcblxyXG4gICAgYXN5bmMgc2VuZChtZXNzYWdlOiBDaGF0TWVzc2FnZSk6IFByb21pc2U8Q2hhdE1lc3NhZ2U+IHtcclxuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUNvbm5lY3Rpb24oKTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wZWVyLnNlbmRNZXNzYWdlKG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxvYWRBZnRlcihtZXNzYWdlOiBDaGF0TWVzc2FnZSwgY291bnQ6IG51bWJlcik6IFByb21pc2U8Q2hhdE1lc3NhZ2VbXT4ge1xyXG4gICAgICAgIGlmICghbWVzc2FnZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBpZiAoIW1lc3NhZ2UucGFnaW5nQ3Vyc29yKVxyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwT3JVcGRhdGVNZXNzYWdlcyhcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5wZWVyLmxvYWRBZnRlcihOdW1iZXIobWVzc2FnZS5wYWdpbmdDdXJzb3IpLCBjb3VudClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldChpZDogc3RyaW5nKTogUHJvbWlzZTxDaGF0TWVzc2FnZT4ge1xyXG4gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VNYXAuaGFzKGlkKSlcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZU1hcC5nZXQoaWQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlQ29ubmVjdGlvbihgQ291bGQgbm90IGdldCBtZXNzYWdlYCk7XHJcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSBhd2FpdCB0aGlzLnBlZXIuZ2V0TWVzc2FnZShpZCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VNYXAuaGFzKGlkKSkge1xyXG4gICAgICAgICAgICBsZXQgZXhpc3RpbmdNZXNzYWdlID0gdGhpcy5tZXNzYWdlTWFwLmdldChpZCk7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZXhpc3RpbmdNZXNzYWdlLCBtZXNzYWdlKTtcclxuICAgICAgICAgICAgbWVzc2FnZSA9IGV4aXN0aW5nTWVzc2FnZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VNYXAuc2V0KGlkLCBtZXNzYWdlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldENvdW50KCk6IFByb21pc2U8bnVtYmVyPiB7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucGVlci5nZXRDb3VudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxpa2VNZXNzYWdlKG1lc3NhZ2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVDb25uZWN0aW9uKCk7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucGVlci5saWtlTWVzc2FnZShtZXNzYWdlSWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHVubGlrZU1lc3NhZ2UobWVzc2FnZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUNvbm5lY3Rpb24oKTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wZWVyLnVubGlrZU1lc3NhZ2UobWVzc2FnZUlkKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkZWxldGVNZXNzYWdlKG1lc3NhZ2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVDb25uZWN0aW9uKCk7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucGVlci5kZWxldGVNZXNzYWdlKG1lc3NhZ2VJZCk7XHJcbiAgICB9XHJcblxyXG59Il19
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { Component, Output, ViewChild } from '@angular/core';
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@banta/common";
|
|
5
|
+
import * as i2 from "@angular/material/icon";
|
|
6
|
+
import * as i3 from "@angular/material/button";
|
|
7
|
+
import * as i4 from "@angular/material/tooltip";
|
|
8
|
+
export class AttachmentButtonComponent {
|
|
9
|
+
constructor(cdnProvider) {
|
|
10
|
+
this.cdnProvider = cdnProvider;
|
|
11
|
+
this._addedAttachment = new Subject();
|
|
12
|
+
this._attachmentError = new Subject();
|
|
13
|
+
}
|
|
14
|
+
get addedAttachment() { return this._addedAttachment.asObservable(); }
|
|
15
|
+
get attachmentError() { return this._attachmentError.asObservable(); }
|
|
16
|
+
show() {
|
|
17
|
+
this.fileInput.nativeElement.click();
|
|
18
|
+
}
|
|
19
|
+
async fileChange(event) {
|
|
20
|
+
const element = event.currentTarget;
|
|
21
|
+
if (element.files.length) {
|
|
22
|
+
console.log('[Banta] File Added to comment');
|
|
23
|
+
const file = element.files[0];
|
|
24
|
+
let publicURL;
|
|
25
|
+
let attachment = {
|
|
26
|
+
type: file.type,
|
|
27
|
+
url: undefined,
|
|
28
|
+
transientState: {
|
|
29
|
+
uploading: true,
|
|
30
|
+
error: false,
|
|
31
|
+
errorMessage: undefined
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
this._addedAttachment.next(attachment);
|
|
35
|
+
try {
|
|
36
|
+
publicURL = await this.cdnProvider.uploadImage(file);
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
39
|
+
attachment.transientState.error = true;
|
|
40
|
+
attachment.transientState.errorMessage = "Failed to upload";
|
|
41
|
+
console.error(`[Banta] Caught an error while uploading image to CDN:`);
|
|
42
|
+
console.error(e);
|
|
43
|
+
alert(`Failed to upload image. Please try again later.`);
|
|
44
|
+
this._attachmentError.next(attachment);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
// If no URL was returned, then an error must have occurred. Presumably the CDN
|
|
48
|
+
// provider has conveyed an error to the user.
|
|
49
|
+
if (!publicURL)
|
|
50
|
+
return;
|
|
51
|
+
attachment.url = publicURL;
|
|
52
|
+
attachment.transientState = undefined;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
AttachmentButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AttachmentButtonComponent, deps: [{ token: i1.CDNProvider }], target: i0.ɵɵFactoryTarget.Component });
|
|
57
|
+
AttachmentButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: AttachmentButtonComponent, selector: "banta-attachment-button", outputs: { addedAttachment: "addedAttachment", attachmentError: "attachmentError" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileUpload"], descendants: true }], ngImport: i0, template: "<button matTooltip=\"Add an image or gif\" #button type=\"button\" mat-icon-button (click)=\"show()\">\r\n\t<mat-icon>image</mat-icon>\r\n</button>\r\n<input style=\"display: none;\" #fileUpload [multiple]=\"false\" (change)=\"fileChange($event)\" type=\"file\" >", styles: ["button{color:#666}\n"], dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
|
|
58
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AttachmentButtonComponent, decorators: [{
|
|
59
|
+
type: Component,
|
|
60
|
+
args: [{ selector: 'banta-attachment-button', template: "<button matTooltip=\"Add an image or gif\" #button type=\"button\" mat-icon-button (click)=\"show()\">\r\n\t<mat-icon>image</mat-icon>\r\n</button>\r\n<input style=\"display: none;\" #fileUpload [multiple]=\"false\" (change)=\"fileChange($event)\" type=\"file\" >", styles: ["button{color:#666}\n"] }]
|
|
61
|
+
}], ctorParameters: function () { return [{ type: i1.CDNProvider }]; }, propDecorators: { fileInput: [{
|
|
62
|
+
type: ViewChild,
|
|
63
|
+
args: ['fileUpload', { static: false }]
|
|
64
|
+
}], addedAttachment: [{
|
|
65
|
+
type: Output
|
|
66
|
+
}], attachmentError: [{
|
|
67
|
+
type: Output
|
|
68
|
+
}] } });
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNobWVudC1idXR0b24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvY29tbWVudHMvYXR0YWNobWVudC1idXR0b24vYXR0YWNobWVudC1idXR0b24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvY29tbWVudHMvYXR0YWNobWVudC1idXR0b24vYXR0YWNobWVudC1idXR0b24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7OztBQU8vQixNQUFNLE9BQU8seUJBQXlCO0lBRXBDLFlBQ1UsV0FBd0I7UUFBeEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFJMUIscUJBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQXlCLENBQUM7UUFDeEQscUJBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQXlCLENBQUM7SUFIaEUsQ0FBQztJQU9ELElBQWMsZUFBZSxLQUFLLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoRixJQUFjLGVBQWUsS0FBSyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFaEYsSUFBSTtRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsYUFBa0MsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM3RCxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFZO1FBQzNCLE1BQU0sT0FBTyxHQUFJLEtBQUssQ0FBQyxhQUFrQyxDQUFDO1FBQzFELElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1lBQzdDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsSUFBSSxTQUFpQixDQUFDO1lBRXRCLElBQUksVUFBVSxHQUEwQjtnQkFDdEMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNmLEdBQUcsRUFBRSxTQUFTO2dCQUNkLGNBQWMsRUFBRTtvQkFDZCxTQUFTLEVBQUUsSUFBSTtvQkFDZixLQUFLLEVBQUUsS0FBSztvQkFDWixZQUFZLEVBQUUsU0FBUztpQkFDeEI7YUFDRixDQUFBO1lBRUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUV2QyxJQUFJO2dCQUNGLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3REO1lBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ1YsVUFBVSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO2dCQUN2QyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksR0FBRyxrQkFBa0IsQ0FBQztnQkFFNUQsT0FBTyxDQUFDLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO2dCQUN2RSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqQixLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztnQkFFekQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDdkMsT0FBTzthQUNSO1lBRUQsK0VBQStFO1lBQy9FLDhDQUE4QztZQUM5QyxJQUFJLENBQUMsU0FBUztnQkFDWixPQUFPO1lBRVQsVUFBVSxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUM7WUFDM0IsVUFBVSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUM7U0FDdkM7SUFFSCxDQUFDOzt1SEE3RFUseUJBQXlCOzJHQUF6Qix5QkFBeUIsNlBDVHRDLDBRQUd5Rzs0RkRNNUYseUJBQXlCO2tCQUxyQyxTQUFTOytCQUNFLHlCQUF5QjtrR0FjUyxTQUFTO3NCQUFwRCxTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBRTVCLGVBQWU7c0JBQTVCLE1BQU07Z0JBQ08sZUFBZTtzQkFBNUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ0ROUHJvdmlkZXIsIENoYXRNZXNzYWdlQXR0YWNobWVudCB9IGZyb20gJ0BiYW50YS9jb21tb24nO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2JhbnRhLWF0dGFjaG1lbnQtYnV0dG9uJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYXR0YWNobWVudC1idXR0b24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2F0dGFjaG1lbnQtYnV0dG9uLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEF0dGFjaG1lbnRCdXR0b25Db21wb25lbnQge1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgY2RuUHJvdmlkZXI6IENETlByb3ZpZGVyLFxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYWRkZWRBdHRhY2htZW50ID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2VBdHRhY2htZW50PigpO1xyXG4gIHByaXZhdGUgX2F0dGFjaG1lbnRFcnJvciA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlQXR0YWNobWVudD4oKTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnZmlsZVVwbG9hZCcsIHsgc3RhdGljOiBmYWxzZSB9KSBmaWxlSW5wdXQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBPdXRwdXQoKSBnZXQgYWRkZWRBdHRhY2htZW50KCkgeyByZXR1cm4gdGhpcy5fYWRkZWRBdHRhY2htZW50LmFzT2JzZXJ2YWJsZSgpOyB9XHJcbiAgQE91dHB1dCgpIGdldCBhdHRhY2htZW50RXJyb3IoKSB7IHJldHVybiB0aGlzLl9hdHRhY2htZW50RXJyb3IuYXNPYnNlcnZhYmxlKCk7IH1cclxuXHJcbiAgc2hvdygpIHtcclxuICAgICh0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNsaWNrKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBmaWxlQ2hhbmdlKGV2ZW50OiBFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgZWxlbWVudCA9IChldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpO1xyXG4gICAgaWYgKGVsZW1lbnQuZmlsZXMubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdbQmFudGFdIEZpbGUgQWRkZWQgdG8gY29tbWVudCcpO1xyXG4gICAgICBjb25zdCBmaWxlID0gZWxlbWVudC5maWxlc1swXTtcclxuICAgICAgbGV0IHB1YmxpY1VSTDogc3RyaW5nO1xyXG4gICAgICBcclxuICAgICAgbGV0IGF0dGFjaG1lbnQ6IENoYXRNZXNzYWdlQXR0YWNobWVudCA9IHtcclxuICAgICAgICB0eXBlOiBmaWxlLnR5cGUsXHJcbiAgICAgICAgdXJsOiB1bmRlZmluZWQsXHJcbiAgICAgICAgdHJhbnNpZW50U3RhdGU6IHtcclxuICAgICAgICAgIHVwbG9hZGluZzogdHJ1ZSxcclxuICAgICAgICAgIGVycm9yOiBmYWxzZSxcclxuICAgICAgICAgIGVycm9yTWVzc2FnZTogdW5kZWZpbmVkXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9hZGRlZEF0dGFjaG1lbnQubmV4dChhdHRhY2htZW50KTtcclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgcHVibGljVVJMID0gYXdhaXQgdGhpcy5jZG5Qcm92aWRlci51cGxvYWRJbWFnZShmaWxlKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGF0dGFjaG1lbnQudHJhbnNpZW50U3RhdGUuZXJyb3IgPSB0cnVlO1xyXG4gICAgICAgIGF0dGFjaG1lbnQudHJhbnNpZW50U3RhdGUuZXJyb3JNZXNzYWdlID0gXCJGYWlsZWQgdG8gdXBsb2FkXCI7XHJcblxyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtCYW50YV0gQ2F1Z2h0IGFuIGVycm9yIHdoaWxlIHVwbG9hZGluZyBpbWFnZSB0byBDRE46YCk7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICBhbGVydChgRmFpbGVkIHRvIHVwbG9hZCBpbWFnZS4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci5gKTtcclxuXHJcbiAgICAgICAgdGhpcy5fYXR0YWNobWVudEVycm9yLm5leHQoYXR0YWNobWVudCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBJZiBubyBVUkwgd2FzIHJldHVybmVkLCB0aGVuIGFuIGVycm9yIG11c3QgaGF2ZSBvY2N1cnJlZC4gUHJlc3VtYWJseSB0aGUgQ0ROXHJcbiAgICAgIC8vIHByb3ZpZGVyIGhhcyBjb252ZXllZCBhbiBlcnJvciB0byB0aGUgdXNlci5cclxuICAgICAgaWYgKCFwdWJsaWNVUkwpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICBcclxuICAgICAgYXR0YWNobWVudC51cmwgPSBwdWJsaWNVUkw7XHJcbiAgICAgIGF0dGFjaG1lbnQudHJhbnNpZW50U3RhdGUgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbn1cclxuIiwiPGJ1dHRvbiBtYXRUb29sdGlwPVwiQWRkIGFuIGltYWdlIG9yIGdpZlwiICNidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwic2hvdygpXCI+XHJcblx0PG1hdC1pY29uPmltYWdlPC9tYXQtaWNvbj5cclxuPC9idXR0b24+XHJcbjxpbnB1dCBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgI2ZpbGVVcGxvYWQgW211bHRpcGxlXT1cImZhbHNlXCIgIChjaGFuZ2UpPVwiZmlsZUNoYW5nZSgkZXZlbnQpXCIgdHlwZT1cImZpbGVcIiA+Il19
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { Directive, Input, Output } from "@angular/core";
|
|
2
|
+
import { Subject } from "rxjs";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../chat-backend-base";
|
|
5
|
+
export class AttachmentScraperDirective {
|
|
6
|
+
constructor(elementRef, chatBackend) {
|
|
7
|
+
this.elementRef = elementRef;
|
|
8
|
+
this.chatBackend = chatBackend;
|
|
9
|
+
this.attachments = [];
|
|
10
|
+
this.attachmentsChange = new Subject();
|
|
11
|
+
this.scrapeDebounce = 1500;
|
|
12
|
+
this.fragments = new Map();
|
|
13
|
+
}
|
|
14
|
+
ngOnInit() {
|
|
15
|
+
if (typeof window === 'undefined')
|
|
16
|
+
return;
|
|
17
|
+
this.element.addEventListener('keydown', () => {
|
|
18
|
+
clearTimeout(this.scrapeTimeout);
|
|
19
|
+
this.scrapeTimeout = setTimeout(() => this.scrape(), this.scrapeDebounce);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
get element() {
|
|
23
|
+
return this.elementRef?.nativeElement;
|
|
24
|
+
}
|
|
25
|
+
get text() {
|
|
26
|
+
return this.element.value;
|
|
27
|
+
}
|
|
28
|
+
scrape() {
|
|
29
|
+
let message = {
|
|
30
|
+
likes: 0,
|
|
31
|
+
message: this.text,
|
|
32
|
+
sentAt: undefined,
|
|
33
|
+
user: null,
|
|
34
|
+
attachments: this.attachments
|
|
35
|
+
};
|
|
36
|
+
let foundFragments = [];
|
|
37
|
+
for (let scraper of this.chatBackend.attachmentScrapers) {
|
|
38
|
+
let fragments = scraper.findFragments(message);
|
|
39
|
+
if (!fragments) {
|
|
40
|
+
console.error(`Attachment fragment scraper ${scraper.constructor.name} is implemented incorrectly: Returned null instead of array`);
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
for (let fragment of fragments) {
|
|
44
|
+
foundFragments.push(fragment.text);
|
|
45
|
+
if (!this.fragments.has(fragment.text)) {
|
|
46
|
+
console.log(`Scraped new fragment:`);
|
|
47
|
+
console.dir(fragment);
|
|
48
|
+
this.fragments.set(fragment.text, {
|
|
49
|
+
fragment,
|
|
50
|
+
resolution: undefined
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Remove fragments that are no longer in the message.
|
|
56
|
+
let removedFragments = [];
|
|
57
|
+
for (let [key] of this.fragments) {
|
|
58
|
+
if (!foundFragments.includes(key))
|
|
59
|
+
removedFragments.push(key);
|
|
60
|
+
}
|
|
61
|
+
for (let removedFragment of removedFragments) {
|
|
62
|
+
console.log(`Removed fragment: ${removedFragment}`);
|
|
63
|
+
this.fragments.delete(removedFragment);
|
|
64
|
+
}
|
|
65
|
+
// Process any fragments that are not yet resolved (or being
|
|
66
|
+
// resolved)
|
|
67
|
+
for (let [key, state] of this.fragments) {
|
|
68
|
+
if (state.resolution)
|
|
69
|
+
continue;
|
|
70
|
+
state.resolution = new Promise(async (resolve, reject) => {
|
|
71
|
+
console.log(`Resolving fragment ${key}`);
|
|
72
|
+
for (let resolver of this.chatBackend.attachmentResolvers) {
|
|
73
|
+
console.log(`- Trying resolver ${resolver.constructor.name}...`);
|
|
74
|
+
try {
|
|
75
|
+
let attachment = await resolver.resolveFragment(message, state.fragment);
|
|
76
|
+
if (attachment) {
|
|
77
|
+
console.log(`Resolved fragment ${key} into attachment:`);
|
|
78
|
+
console.dir(attachment);
|
|
79
|
+
this.attachments.push(attachment);
|
|
80
|
+
this.attachmentsChange.next(this.attachments.slice());
|
|
81
|
+
resolve(attachment);
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
console.error(`Caught error during attachment resolver ${resolver.constructor.name}:`);
|
|
87
|
+
console.error(e);
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
AttachmentScraperDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AttachmentScraperDirective, deps: [{ token: i0.ElementRef }, { token: i1.ChatBackendBase }], target: i0.ɵɵFactoryTarget.Directive });
|
|
96
|
+
AttachmentScraperDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.12", type: AttachmentScraperDirective, selector: "[attachmentScraper]", inputs: { attachments: "attachments" }, outputs: { attachmentsChange: "attachmentsChange" }, ngImport: i0 });
|
|
97
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AttachmentScraperDirective, decorators: [{
|
|
98
|
+
type: Directive,
|
|
99
|
+
args: [{
|
|
100
|
+
selector: '[attachmentScraper]'
|
|
101
|
+
}]
|
|
102
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.ChatBackendBase }]; }, propDecorators: { attachments: [{
|
|
103
|
+
type: Input
|
|
104
|
+
}], attachmentsChange: [{
|
|
105
|
+
type: Output
|
|
106
|
+
}] } });
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNobWVudC1zY3JhcGVyLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Nkay9zcmMvbGliL2NvbW1lbnRzL2F0dGFjaG1lbnQtc2NyYXBlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXJFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7OztBQVkvQixNQUFNLE9BQU8sMEJBQTBCO0lBQ25DLFlBQ1ksVUFBMkMsRUFDM0MsV0FBNEI7UUFENUIsZUFBVSxHQUFWLFVBQVUsQ0FBaUM7UUFDM0MsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBSS9CLGdCQUFXLEdBQTRCLEVBQUUsQ0FBQztRQUN6QyxzQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBMkIsQ0FBQztRQXFCN0QsbUJBQWMsR0FBRyxJQUFJLENBQUM7UUFDdEIsY0FBUyxHQUFHLElBQUksR0FBRyxFQUFtQyxDQUFDO0lBekIvRCxDQUFDO0lBSUQsUUFBUTtRQUNKLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVztZQUM3QixPQUFPO1FBRVgsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO1lBQzFDLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM5RSxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDUCxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDO0lBQzFDLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDSixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQzlCLENBQUM7SUFNTyxNQUFNO1FBQ1YsSUFBSSxPQUFPLEdBQWdCO1lBQ3ZCLEtBQUssRUFBRSxDQUFDO1lBQ1IsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2xCLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLElBQUksRUFBRSxJQUFJO1lBQ1YsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1NBQ2hDLENBQUM7UUFFRixJQUFJLGNBQWMsR0FBYSxFQUFFLENBQUM7UUFFbEMsS0FBSyxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixFQUFFO1lBQ3JELElBQUksU0FBUyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDWixPQUFPLENBQUMsS0FBSyxDQUFDLCtCQUErQixPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksNkRBQTZELENBQUMsQ0FBQztnQkFDcEksU0FBUzthQUNaO1lBQ0QsS0FBSyxJQUFJLFFBQVEsSUFBSSxTQUFTLEVBQUU7Z0JBQzVCLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLENBQUM7b0JBQ3JDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUU7d0JBQzlCLFFBQVE7d0JBQ1IsVUFBVSxFQUFFLFNBQVM7cUJBQ3hCLENBQUMsQ0FBQztpQkFDTjthQUNKO1NBQ0o7UUFFRCxzREFBc0Q7UUFDdEQsSUFBSSxnQkFBZ0IsR0FBYSxFQUFFLENBQUM7UUFDcEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUM5QixJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBQzdCLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNsQztRQUNELEtBQUssSUFBSSxlQUFlLElBQUksZ0JBQWdCLEVBQUU7WUFDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsZUFBZSxFQUFFLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztTQUMxQztRQUVELDZEQUE2RDtRQUM3RCxZQUFZO1FBRVosS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDckMsSUFBSSxLQUFLLENBQUMsVUFBVTtnQkFDaEIsU0FBUztZQUViLEtBQUssQ0FBQyxVQUFVLEdBQUcsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtnQkFDckQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDekMsS0FBSyxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixFQUFFO29CQUN2RCxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUM7b0JBQ2pFLElBQUk7d0JBQ0EsSUFBSSxVQUFVLEdBQUcsTUFBTSxRQUFRLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQ3pFLElBQUksVUFBVSxFQUFFOzRCQUNaLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEdBQUcsbUJBQW1CLENBQUMsQ0FBQzs0QkFDekQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQzs0QkFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7NEJBQ2xDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDOzRCQUN0RCxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7NEJBQ3BCLE1BQU07eUJBQ1Q7cUJBQ0o7b0JBQUMsT0FBTyxDQUFDLEVBQUU7d0JBQ1IsT0FBTyxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO3dCQUN2RixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNqQixTQUFTO3FCQUNaO2lCQUNKO1lBQ0wsQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7O3dIQXJHUSwwQkFBMEI7NEdBQTFCLDBCQUEwQjs0RkFBMUIsMEJBQTBCO2tCQUh0QyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxxQkFBcUI7aUJBQ2xDOytIQVFZLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0ksaUJBQWlCO3NCQUExQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQ2hhdE1lc3NhZ2UsIENoYXRNZXNzYWdlQXR0YWNobWVudCB9IGZyb20gXCJAYmFudGEvY29tbW9uXCI7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBBdHRhY2htZW50RnJhZ21lbnQgfSBmcm9tIFwiLi4vYXR0YWNobWVudC1zY3JhcGVyXCI7XHJcbmltcG9ydCB7IENoYXRCYWNrZW5kQmFzZSB9IGZyb20gXCIuLi9jaGF0LWJhY2tlbmQtYmFzZVwiO1xyXG5cclxuaW50ZXJmYWNlIEF0dGFjaG1lbnRGcmFnbWVudFN0YXRlIHtcclxuICAgIGZyYWdtZW50OiBBdHRhY2htZW50RnJhZ21lbnQ7XHJcbiAgICByZXNvbHV0aW9uOiBQcm9taXNlPENoYXRNZXNzYWdlQXR0YWNobWVudD47XHJcbn1cclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gICAgc2VsZWN0b3I6ICdbYXR0YWNobWVudFNjcmFwZXJdJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQXR0YWNobWVudFNjcmFwZXJEaXJlY3RpdmUge1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQ+LFxyXG4gICAgICAgIHByaXZhdGUgY2hhdEJhY2tlbmQ6IENoYXRCYWNrZW5kQmFzZVxyXG4gICAgKSB7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KCkgYXR0YWNobWVudHM6IENoYXRNZXNzYWdlQXR0YWNobWVudFtdID0gW107XHJcbiAgICBAT3V0cHV0KCkgYXR0YWNobWVudHNDaGFuZ2UgPSBuZXcgU3ViamVjdDxDaGF0TWVzc2FnZUF0dGFjaG1lbnRbXT4oKTtcclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5zY3JhcGVUaW1lb3V0KTtcclxuICAgICAgICAgICAgdGhpcy5zY3JhcGVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnNjcmFwZSgpLCB0aGlzLnNjcmFwZURlYm91bmNlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZWxlbWVudCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmPy5uYXRpdmVFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB0ZXh0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQudmFsdWU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgc2NyYXBlVGltZW91dDtcclxuICAgIHByaXZhdGUgc2NyYXBlRGVib3VuY2UgPSAxNTAwO1xyXG4gICAgcHJpdmF0ZSBmcmFnbWVudHMgPSBuZXcgTWFwPHN0cmluZywgQXR0YWNobWVudEZyYWdtZW50U3RhdGU+KCk7XHJcbiAgICBwcml2YXRlIHNjcmFwZSgpIHtcclxuICAgICAgICBsZXQgbWVzc2FnZTogQ2hhdE1lc3NhZ2UgPSB7XHJcbiAgICAgICAgICAgIGxpa2VzOiAwLFxyXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnRleHQsXHJcbiAgICAgICAgICAgIHNlbnRBdDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB1c2VyOiBudWxsLFxyXG4gICAgICAgICAgICBhdHRhY2htZW50czogdGhpcy5hdHRhY2htZW50c1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGxldCBmb3VuZEZyYWdtZW50czogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgc2NyYXBlciBvZiB0aGlzLmNoYXRCYWNrZW5kLmF0dGFjaG1lbnRTY3JhcGVycykge1xyXG4gICAgICAgICAgICBsZXQgZnJhZ21lbnRzID0gc2NyYXBlci5maW5kRnJhZ21lbnRzKG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBpZiAoIWZyYWdtZW50cykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQXR0YWNobWVudCBmcmFnbWVudCBzY3JhcGVyICR7c2NyYXBlci5jb25zdHJ1Y3Rvci5uYW1lfSBpcyBpbXBsZW1lbnRlZCBpbmNvcnJlY3RseTogUmV0dXJuZWQgbnVsbCBpbnN0ZWFkIG9mIGFycmF5YCk7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IgKGxldCBmcmFnbWVudCBvZiBmcmFnbWVudHMpIHtcclxuICAgICAgICAgICAgICAgIGZvdW5kRnJhZ21lbnRzLnB1c2goZnJhZ21lbnQudGV4dCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZnJhZ21lbnRzLmhhcyhmcmFnbWVudC50ZXh0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBTY3JhcGVkIG5ldyBmcmFnbWVudDpgKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRpcihmcmFnbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcmFnbWVudHMuc2V0KGZyYWdtZW50LnRleHQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb246IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBSZW1vdmUgZnJhZ21lbnRzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgbWVzc2FnZS5cclxuICAgICAgICBsZXQgcmVtb3ZlZEZyYWdtZW50czogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBba2V5XSBvZiB0aGlzLmZyYWdtZW50cykge1xyXG4gICAgICAgICAgICBpZiAoIWZvdW5kRnJhZ21lbnRzLmluY2x1ZGVzKGtleSkpXHJcbiAgICAgICAgICAgICAgICByZW1vdmVkRnJhZ21lbnRzLnB1c2goa2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgcmVtb3ZlZEZyYWdtZW50IG9mIHJlbW92ZWRGcmFnbWVudHMpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYFJlbW92ZWQgZnJhZ21lbnQ6ICR7cmVtb3ZlZEZyYWdtZW50fWApO1xyXG4gICAgICAgICAgICB0aGlzLmZyYWdtZW50cy5kZWxldGUocmVtb3ZlZEZyYWdtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFByb2Nlc3MgYW55IGZyYWdtZW50cyB0aGF0IGFyZSBub3QgeWV0IHJlc29sdmVkIChvciBiZWluZyBcclxuICAgICAgICAvLyByZXNvbHZlZClcclxuXHJcbiAgICAgICAgZm9yIChsZXQgW2tleSwgc3RhdGVdIG9mIHRoaXMuZnJhZ21lbnRzKSB7XHJcbiAgICAgICAgICAgIGlmIChzdGF0ZS5yZXNvbHV0aW9uKVxyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICBzdGF0ZS5yZXNvbHV0aW9uID0gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJlc29sdmluZyBmcmFnbWVudCAke2tleX1gKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IHJlc29sdmVyIG9mIHRoaXMuY2hhdEJhY2tlbmQuYXR0YWNobWVudFJlc29sdmVycykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAtIFRyeWluZyByZXNvbHZlciAke3Jlc29sdmVyLmNvbnN0cnVjdG9yLm5hbWV9Li4uYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF0dGFjaG1lbnQgPSBhd2FpdCByZXNvbHZlci5yZXNvbHZlRnJhZ21lbnQobWVzc2FnZSwgc3RhdGUuZnJhZ21lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJlc29sdmVkIGZyYWdtZW50ICR7a2V5fSBpbnRvIGF0dGFjaG1lbnQ6YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRpcihhdHRhY2htZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXR0YWNobWVudHMucHVzaChhdHRhY2htZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXR0YWNobWVudHNDaGFuZ2UubmV4dCh0aGlzLmF0dGFjaG1lbnRzLnNsaWNlKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShhdHRhY2htZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBDYXVnaHQgZXJyb3IgZHVyaW5nIGF0dGFjaG1lbnQgcmVzb2x2ZXIgJHtyZXNvbHZlci5jb25zdHJ1Y3Rvci5uYW1lfTpgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59Il19
|