@banta/sdk 4.6.27 → 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.
Files changed (129) hide show
  1. package/README.md +2 -2
  2. package/{esm2015/banta-sdk.js → esm2020/banta-sdk.mjs} +0 -0
  3. package/{esm2015/lib/attachment-scraper.js → esm2020/lib/attachment-scraper.mjs} +0 -0
  4. package/esm2020/lib/banta/banta.component.mjs +204 -0
  5. package/esm2020/lib/banta-logo.component.mjs +11 -0
  6. package/esm2020/lib/banta-sdk.module.mjs +144 -0
  7. package/esm2020/lib/chat/banta-chat/banta-chat.component.mjs +185 -0
  8. package/esm2020/lib/chat/chat-message/chat-message.component.mjs +62 -0
  9. package/esm2020/lib/chat/chat-view/chat-view.component.mjs +170 -0
  10. package/esm2020/lib/chat/chat.module.mjs +51 -0
  11. package/{esm2015/lib/chat/index.js → esm2020/lib/chat/index.mjs} +0 -0
  12. package/esm2020/lib/chat/live-chat-message.component.mjs +80 -0
  13. package/{esm2015/lib/chat-backend-base.js → esm2020/lib/chat-backend-base.mjs} +0 -0
  14. package/esm2020/lib/chat-backend.mjs +83 -0
  15. package/{esm2015/lib/chat-source-base.js → esm2020/lib/chat-source-base.mjs} +0 -0
  16. package/esm2020/lib/chat-source.mjs +169 -0
  17. package/esm2020/lib/comments/attachment-button/attachment-button.component.mjs +69 -0
  18. package/esm2020/lib/comments/attachment-scraper.directive.mjs +107 -0
  19. package/esm2020/lib/comments/banta-comments/banta-comments.component.mjs +666 -0
  20. package/esm2020/lib/comments/comment/comment.component.mjs +217 -0
  21. package/esm2020/lib/comments/comment-field/comment-field.component.mjs +377 -0
  22. package/esm2020/lib/comments/comment-sort/comment-sort.component.mjs +37 -0
  23. package/esm2020/lib/comments/comment-view/comment-view.component.mjs +379 -0
  24. package/esm2020/lib/comments/comments.module.mjs +111 -0
  25. package/{esm2015/lib/comments/index.js → esm2020/lib/comments/index.mjs} +0 -0
  26. package/esm2020/lib/comments/live-comment.component.mjs +80 -0
  27. package/esm2020/lib/comments/reply-send-options.directive.mjs +13 -0
  28. package/esm2020/lib/common/attachment/attachment.component.mjs +113 -0
  29. package/esm2020/lib/common/attachments/attachments.component.mjs +72 -0
  30. package/esm2020/lib/common/common.module.mjs +59 -0
  31. package/{esm2015/lib/common/index.js → esm2020/lib/common/index.mjs} +0 -0
  32. package/{esm2015/lib/common/lazy-connection.js → esm2020/lib/common/lazy-connection.mjs} +0 -0
  33. package/esm2020/lib/common/lightbox/lightbox.component.mjs +31 -0
  34. package/esm2020/lib/common/markdown-to-html.pipe.mjs +76 -0
  35. package/esm2020/lib/common/mention-linker.pipe.mjs +35 -0
  36. package/esm2020/lib/common/timestamp.component.mjs +113 -0
  37. package/esm2020/lib/common/trust-resource-url.pipe.mjs +22 -0
  38. package/esm2020/lib/emoji/emoji-selector-button.component.mjs +113 -0
  39. package/esm2020/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.mjs +88 -0
  40. package/esm2020/lib/emoji/emoji.module.mjs +55 -0
  41. package/{esm2015/lib/emoji/emojis.js → esm2020/lib/emoji/emojis.mjs} +0 -0
  42. package/{esm2015/lib/emoji/index.js → esm2020/lib/emoji/index.mjs} +0 -0
  43. package/esm2020/lib/giphy-attachments.mjs +16 -0
  44. package/{esm2015/lib/index.js → esm2020/lib/index.mjs} +0 -0
  45. package/esm2020/lib/live-message.component.mjs +96 -0
  46. package/{esm2015/lib/message-menu-item.js → esm2020/lib/message-menu-item.mjs} +0 -0
  47. package/{esm2015/lib/sdk-options.js → esm2020/lib/sdk-options.mjs} +0 -0
  48. package/esm2020/lib/tweet-attachments.mjs +13 -0
  49. package/esm2020/lib/url-attachments.mjs +42 -0
  50. package/esm2020/lib/youtube-attachments.mjs +22 -0
  51. package/{esm2015/public-api.js → esm2020/public-api.mjs} +1 -1
  52. package/fesm2015/{banta-sdk.js → banta-sdk.mjs} +2559 -2239
  53. package/fesm2015/banta-sdk.mjs.map +1 -0
  54. package/fesm2020/banta-sdk.mjs +10490 -0
  55. package/fesm2020/banta-sdk.mjs.map +1 -0
  56. package/{banta-sdk.d.ts → index.d.ts} +1 -0
  57. package/lib/banta/banta.component.d.ts +3 -0
  58. package/lib/banta-logo.component.d.ts +3 -0
  59. package/lib/banta-sdk.module.d.ts +24 -0
  60. package/lib/chat/banta-chat/banta-chat.component.d.ts +3 -0
  61. package/lib/chat/chat-message/chat-message.component.d.ts +3 -0
  62. package/lib/chat/chat-view/chat-view.component.d.ts +3 -0
  63. package/lib/chat/chat.module.d.ts +13 -0
  64. package/lib/chat/live-chat-message.component.d.ts +3 -0
  65. package/lib/chat-backend.d.ts +3 -0
  66. package/lib/comments/attachment-button/attachment-button.component.d.ts +3 -0
  67. package/lib/comments/attachment-scraper.directive.d.ts +3 -0
  68. package/lib/comments/banta-comments/banta-comments.component.d.ts +3 -0
  69. package/lib/comments/comment/comment.component.d.ts +3 -0
  70. package/lib/comments/comment-field/comment-field.component.d.ts +3 -0
  71. package/lib/comments/comment-sort/comment-sort.component.d.ts +3 -0
  72. package/lib/comments/comment-view/comment-view.component.d.ts +3 -0
  73. package/lib/comments/comments.module.d.ts +28 -0
  74. package/lib/comments/live-comment.component.d.ts +3 -0
  75. package/lib/comments/reply-send-options.directive.d.ts +3 -0
  76. package/lib/common/attachment/attachment.component.d.ts +3 -0
  77. package/lib/common/attachments/attachments.component.d.ts +3 -0
  78. package/lib/common/common.module.d.ts +15 -0
  79. package/lib/common/lightbox/lightbox.component.d.ts +3 -0
  80. package/lib/common/markdown-to-html.pipe.d.ts +3 -0
  81. package/lib/common/mention-linker.pipe.d.ts +3 -0
  82. package/lib/common/timestamp.component.d.ts +3 -0
  83. package/lib/common/trust-resource-url.pipe.d.ts +3 -0
  84. package/lib/emoji/emoji-selector-button.component.d.ts +3 -0
  85. package/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.d.ts +3 -0
  86. package/lib/emoji/emoji.module.d.ts +14 -0
  87. package/lib/live-message.component.d.ts +3 -0
  88. package/lib/url-attachments.d.ts +3 -0
  89. package/package.json +22 -10
  90. package/banta-sdk.metadata.json +0 -1
  91. package/bundles/banta-sdk.umd.js +0 -11913
  92. package/bundles/banta-sdk.umd.js.map +0 -1
  93. package/esm2015/lib/banta/banta.component.js +0 -200
  94. package/esm2015/lib/banta-logo.component.js +0 -20
  95. package/esm2015/lib/banta-sdk.module.js +0 -98
  96. package/esm2015/lib/chat/banta-chat/banta-chat.component.js +0 -174
  97. package/esm2015/lib/chat/chat-message/chat-message.component.js +0 -56
  98. package/esm2015/lib/chat/chat-view/chat-view.component.js +0 -167
  99. package/esm2015/lib/chat/chat.module.js +0 -32
  100. package/esm2015/lib/chat/live-chat-message.component.js +0 -71
  101. package/esm2015/lib/chat-backend.js +0 -92
  102. package/esm2015/lib/chat-source.js +0 -199
  103. package/esm2015/lib/comments/attachment-button/attachment-button.component.js +0 -70
  104. package/esm2015/lib/comments/attachment-scraper.directive.js +0 -109
  105. package/esm2015/lib/comments/banta-comments/banta-comments.component.js +0 -678
  106. package/esm2015/lib/comments/comment/comment.component.js +0 -186
  107. package/esm2015/lib/comments/comment-field/comment-field.component.js +0 -350
  108. package/esm2015/lib/comments/comment-sort/comment-sort.component.js +0 -34
  109. package/esm2015/lib/comments/comment-view/comment-view.component.js +0 -364
  110. package/esm2015/lib/comments/comments.module.js +0 -62
  111. package/esm2015/lib/comments/live-comment.component.js +0 -71
  112. package/esm2015/lib/comments/reply-send-options.directive.js +0 -9
  113. package/esm2015/lib/common/attachment/attachment.component.js +0 -105
  114. package/esm2015/lib/common/attachments/attachments.component.js +0 -65
  115. package/esm2015/lib/common/common.module.js +0 -36
  116. package/esm2015/lib/common/lightbox/lightbox.component.js +0 -30
  117. package/esm2015/lib/common/markdown-to-html.pipe.js +0 -75
  118. package/esm2015/lib/common/mention-linker.pipe.js +0 -31
  119. package/esm2015/lib/common/timestamp.component.js +0 -106
  120. package/esm2015/lib/common/trust-resource-url.pipe.js +0 -21
  121. package/esm2015/lib/emoji/emoji-selector-button.component.js +0 -107
  122. package/esm2015/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.js +0 -86
  123. package/esm2015/lib/emoji/emoji.module.js +0 -34
  124. package/esm2015/lib/giphy-attachments.js +0 -20
  125. package/esm2015/lib/live-message.component.js +0 -74
  126. package/esm2015/lib/tweet-attachments.js +0 -16
  127. package/esm2015/lib/url-attachments.js +0 -46
  128. package/esm2015/lib/youtube-attachments.js +0 -25
  129. package/fesm2015/banta-sdk.js.map +0 -1
@@ -1,199 +0,0 @@
1
- import { __awaiter, __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
- bind(socket) {
33
- const _super = Object.create(null, {
34
- bind: { get: () => super.bind }
35
- });
36
- return __awaiter(this, void 0, void 0, function* () {
37
- _super.bind.call(this, socket);
38
- this.state = 'connected';
39
- this.markReady();
40
- yield this.subscribeToTopic();
41
- this.subscription.add(this.backend.userChanged.subscribe(() => this.authenticate()));
42
- socket.addEventListener('open', () => __awaiter(this, void 0, void 0, function* () {
43
- this.state = 'connected';
44
- }));
45
- socket.addEventListener('lost', () => __awaiter(this, void 0, void 0, function* () {
46
- this.state = 'lost';
47
- }));
48
- socket.addEventListener('restore', () => __awaiter(this, void 0, void 0, function* () {
49
- this.state = 'restored';
50
- yield this.authenticate();
51
- yield this.subscribeToTopic();
52
- }));
53
- return this;
54
- });
55
- }
56
- mapOrUpdateMessages(messages) {
57
- return messages.map(message => this.mapOrUpdateMessage(message));
58
- }
59
- mapOrUpdateMessage(message) {
60
- let existingMessage = this.messageMap.get(message.id);
61
- if (existingMessage) {
62
- message = Object.assign(existingMessage, message);
63
- }
64
- else {
65
- this.messageMap.set(message.id, message);
66
- this._messageObserved.next(message);
67
- }
68
- return message;
69
- }
70
- getExistingMessages() {
71
- return __awaiter(this, void 0, void 0, function* () {
72
- let messages = yield this.peer.getExistingMessages();
73
- messages = this.mapOrUpdateMessages(messages);
74
- return messages;
75
- });
76
- }
77
- ensureConnection(errorMessage) {
78
- return __awaiter(this, void 0, void 0, function* () {
79
- let reason = `Connection to chat services is not currently available.`;
80
- if (this.state !== 'connected' && this.state !== 'restored') {
81
- if (errorMessage)
82
- throw new Error(`${errorMessage}: ${reason}`);
83
- else
84
- throw new Error(`${reason}`);
85
- }
86
- });
87
- }
88
- editMessage(messageId, text) {
89
- return __awaiter(this, void 0, void 0, function* () {
90
- yield this.ensureConnection();
91
- yield this.peer.editMessage(messageId, text);
92
- });
93
- }
94
- subscribeToTopic() {
95
- return __awaiter(this, void 0, void 0, function* () {
96
- yield this.peer.subscribe(this.identifier, this.parentIdentifier, this.sortOrder);
97
- });
98
- }
99
- authenticate() {
100
- var _a;
101
- return __awaiter(this, void 0, void 0, function* () {
102
- if (this.backend.user) {
103
- try {
104
- yield this.peer.authenticate((_a = this.backend.user) === null || _a === void 0 ? void 0 : _a.token);
105
- }
106
- catch (e) {
107
- console.error(`Could not authenticate with Banta server:`);
108
- console.error(e);
109
- }
110
- }
111
- });
112
- }
113
- close() {
114
- super.close();
115
- this.subscription.unsubscribe();
116
- }
117
- onPermissions(permissions) {
118
- window.bantaPermissionsDebug = permissions;
119
- this.permissions = permissions;
120
- }
121
- onChatMessage(message) {
122
- if (this.messageMap.has(message.id)) {
123
- return this.mapOrUpdateMessage(message);
124
- }
125
- else if (!message.hidden) {
126
- // Only process non-hidden messages through here.
127
- // Hidden messages may be sent to us when they become hidden (ie moderation is occurring).
128
- // But if we never had the message to begin with, we should discard it.
129
- this.messageMap.set(message.id, message);
130
- this._messageReceived.next(message);
131
- }
132
- }
133
- get messageReceived() { return this._messageReceived.asObservable(); }
134
- get messageUpdated() { return this._messageUpdated.asObservable(); }
135
- get messageSent() { return this._messageSent.asObservable(); }
136
- get messageObserved() { return this._messageObserved.asObservable(); }
137
- send(message) {
138
- return __awaiter(this, void 0, void 0, function* () {
139
- yield this.ensureConnection();
140
- return yield this.peer.sendMessage(message);
141
- });
142
- }
143
- loadAfter(message, count) {
144
- return __awaiter(this, void 0, void 0, function* () {
145
- if (!message)
146
- return;
147
- if (!message.pagingCursor)
148
- return [];
149
- return this.mapOrUpdateMessages(yield this.peer.loadAfter(Number(message.pagingCursor), count));
150
- });
151
- }
152
- get(id) {
153
- return __awaiter(this, void 0, void 0, function* () {
154
- if (this.messageMap.has(id))
155
- return this.messageMap.get(id);
156
- yield this.ensureConnection(`Could not get message`);
157
- let message = yield this.peer.getMessage(id);
158
- if (this.messageMap.has(id)) {
159
- let existingMessage = this.messageMap.get(id);
160
- Object.assign(existingMessage, message);
161
- message = existingMessage;
162
- }
163
- else {
164
- this.messageMap.set(id, message);
165
- }
166
- return message;
167
- });
168
- }
169
- getCount() {
170
- return __awaiter(this, void 0, void 0, function* () {
171
- return yield this.peer.getCount();
172
- });
173
- }
174
- likeMessage(messageId) {
175
- return __awaiter(this, void 0, void 0, function* () {
176
- yield this.ensureConnection();
177
- return yield this.peer.likeMessage(messageId);
178
- });
179
- }
180
- unlikeMessage(messageId) {
181
- return __awaiter(this, void 0, void 0, function* () {
182
- yield this.ensureConnection();
183
- return yield this.peer.unlikeMessage(messageId);
184
- });
185
- }
186
- deleteMessage(messageId) {
187
- return __awaiter(this, void 0, void 0, function* () {
188
- yield this.ensureConnection();
189
- return yield this.peer.deleteMessage(messageId);
190
- });
191
- }
192
- }
193
- __decorate([
194
- RpcEvent()
195
- ], ChatSource.prototype, "onPermissions", null);
196
- __decorate([
197
- RpcEvent()
198
- ], ChatSource.prototype, "onChatMessage", null);
199
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zZGsvc3JjL2xpYi9jaGF0LXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekQsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJcEQsTUFBTSxPQUFPLFVBQVcsU0FBUSxTQUFTO0lBQ3JDLFlBQ2EsT0FBb0IsRUFDcEIsVUFBa0IsRUFDbEIsZ0JBQXdCLEVBQ3hCLFNBQXdCO1FBRWpDLEtBQUssRUFBRSxDQUFDO1FBTEMsWUFBTyxHQUFQLE9BQU8sQ0FBYTtRQUNwQixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ2xCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBUTtRQUN4QixjQUFTLEdBQVQsU0FBUyxDQUFlO1FBTTdCLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQU1sQyxXQUFNLEdBQXFELFlBQVksQ0FBQztRQVd4RSw0QkFBdUIsR0FBRyxJQUFJLE9BQU8sRUFBb0QsQ0FBQztRQTBHMUYsZUFBVSxHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDO1FBQzVDLHFCQUFnQixHQUFHLElBQUksT0FBTyxFQUFlLENBQUM7UUFDOUMsb0JBQWUsR0FBRyxJQUFJLE9BQU8sRUFBZSxDQUFDO1FBQzdDLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQWUsQ0FBQztRQUMxQyxxQkFBZ0IsR0FBRyxJQUFJLE9BQU8sRUFBZSxDQUFDO1FBT3RELGFBQVEsR0FBa0IsRUFBRSxDQUFDO1FBekl6QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksT0FBTyxDQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBVUQsSUFBSSxLQUFLO1FBQ0ws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QUFDO1FBQ2xELENBQUM7S0FBQTtJQUVLLGFBQWEsQ0FBQyxTQUFpQjs7WUFDakMsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUM5QixPQUFPLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEQsQ0FBQztLQUFBO0lBRUssYUFBYSxDQUFDLFNBQWlCOztZQUNqQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzlCLE9BQU8sTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwRCxDQUFDO0tBQUE7Q0FFSjtBQXJGRztJQURDLFFBQVEsRUFBRTsrQ0FJVjtBQUdEO0lBREMsUUFBUSxFQUFFOytDQVdWIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhdE1lc3NhZ2UsIENoYXRQZXJtaXNzaW9ucywgQ29tbWVudHNPcmRlciwgRHVyYWJsZVNvY2tldCwgVXNlciB9IGZyb20gXCJAYmFudGEvY29tbW9uXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IFJwY0V2ZW50LCBTb2NrZXRSUEMgfSBmcm9tIFwiQGJhbnRhL2NvbW1vblwiO1xyXG5pbXBvcnQgeyBDaGF0U291cmNlQmFzZSB9IGZyb20gXCIuL2NoYXQtc291cmNlLWJhc2VcIjtcclxuaW1wb3J0IHsgQ2hhdEJhY2tlbmQgfSBmcm9tIFwiLi9jaGF0LWJhY2tlbmRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBDaGF0U291cmNlIGV4dGVuZHMgU29ja2V0UlBDIGltcGxlbWVudHMgQ2hhdFNvdXJjZUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcmVhZG9ubHkgYmFja2VuZDogQ2hhdEJhY2tlbmQsXHJcbiAgICAgICAgcmVhZG9ubHkgaWRlbnRpZmllcjogc3RyaW5nLFxyXG4gICAgICAgIHJlYWRvbmx5IHBhcmVudElkZW50aWZpZXI6IHN0cmluZyxcclxuICAgICAgICByZWFkb25seSBzb3J0T3JkZXI6IENvbW1lbnRzT3JkZXJcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5yZWFkeSA9IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4gdGhpcy5tYXJrUmVhZHkgPSByZXNvbHZlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICAgIHByaXZhdGUgbWFya1JlYWR5OiAoKSA9PiB2b2lkO1xyXG5cclxuICAgIHJlYWR5OiBQcm9taXNlPHZvaWQ+O1xyXG5cclxuICAgIHBlcm1pc3Npb25zOiBDaGF0UGVybWlzc2lvbnM7XHJcbiAgICBwcml2YXRlIF9zdGF0ZTogJ2Nvbm5lY3RlZCcgfCAnY29ubmVjdGluZycgfCAnbG9zdCcgfCAncmVzdG9yZWQnID0gJ2Nvbm5lY3RpbmcnO1xyXG5cclxuICAgIGdldCBzdGF0ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHN0YXRlKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5fc3RhdGUgPSB2YWx1ZTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX2Nvbm5lY3Rpb25TdGF0ZUNoYW5nZWQubmV4dCh0aGlzLl9zdGF0ZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2Nvbm5lY3Rpb25TdGF0ZUNoYW5nZWQgPSBuZXcgU3ViamVjdDwnY29ubmVjdGVkJyB8ICdjb25uZWN0aW5nJyB8ICdsb3N0JyB8ICdyZXN0b3JlZCc+KCk7XHJcbiAgICBnZXQgY29ubmVjdGlvblN0YXRlQ2hhbmdlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29ubmVjdGlvblN0YXRlQ2hhbmdlZC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBiaW5kKHNvY2tldDogRHVyYWJsZVNvY2tldCk6IFByb21pc2U8dGhpcz4ge1xyXG4gICAgICAgIHN1cGVyLmJpbmQoc29ja2V0KTtcclxuICAgICAgICB0aGlzLnN0YXRlID0gJ2Nvbm5lY3RlZCc7XHJcbiAgICAgICAgdGhpcy5tYXJrUmVhZHkoKTtcclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5zdWJzY3JpYmVUb1RvcGljKCk7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKHRoaXMuYmFja2VuZC51c2VyQ2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5hdXRoZW50aWNhdGUoKSkpO1xyXG5cclxuICAgICAgICBzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsIGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9ICdjb25uZWN0ZWQnO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignbG9zdCcsIGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9ICdsb3N0JztcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc3RvcmUnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAncmVzdG9yZWQnO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmF1dGhlbnRpY2F0ZSgpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnN1YnNjcmliZVRvVG9waWMoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBtYXBPclVwZGF0ZU1lc3NhZ2VzKG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdKTogQ2hhdE1lc3NhZ2VbXSB7XHJcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VzLm1hcChtZXNzYWdlID0+IHRoaXMubWFwT3JVcGRhdGVNZXNzYWdlKG1lc3NhZ2UpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG1hcE9yVXBkYXRlTWVzc2FnZShtZXNzYWdlOiBDaGF0TWVzc2FnZSk6IENoYXRNZXNzYWdlIHtcclxuICAgICAgICBsZXQgZXhpc3RpbmdNZXNzYWdlID0gdGhpcy5tZXNzYWdlTWFwLmdldChtZXNzYWdlLmlkKTtcclxuICAgICAgICBpZiAoZXhpc3RpbmdNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBPYmplY3QuYXNzaWduKGV4aXN0aW5nTWVzc2FnZSwgbWVzc2FnZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlTWFwLnNldChtZXNzYWdlLmlkLCBtZXNzYWdlKTtcclxuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZU9ic2VydmVkLm5leHQobWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRFeGlzdGluZ01lc3NhZ2VzKCk6IFByb21pc2U8Q2hhdE1lc3NhZ2VbXT4ge1xyXG4gICAgICAgIGxldCBtZXNzYWdlcyA9IGF3YWl0IHRoaXMucGVlci5nZXRFeGlzdGluZ01lc3NhZ2VzKCk7XHJcbiAgICAgICAgbWVzc2FnZXMgPSB0aGlzLm1hcE9yVXBkYXRlTWVzc2FnZXMobWVzc2FnZXMpO1xyXG4gICAgICAgIHJldHVybiBtZXNzYWdlcztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIGVuc3VyZUNvbm5lY3Rpb24oZXJyb3JNZXNzYWdlPzogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHJlYXNvbiA9IGBDb25uZWN0aW9uIHRvIGNoYXQgc2VydmljZXMgaXMgbm90IGN1cnJlbnRseSBhdmFpbGFibGUuYDtcclxuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gJ2Nvbm5lY3RlZCcgJiYgdGhpcy5zdGF0ZSAhPT0gJ3Jlc3RvcmVkJykge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3JNZXNzYWdlKVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2Vycm9yTWVzc2FnZX06ICR7cmVhc29ufWApO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cmVhc29ufWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBlZGl0TWVzc2FnZShtZXNzYWdlSWQ6IHN0cmluZywgdGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVDb25uZWN0aW9uKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5wZWVyLmVkaXRNZXNzYWdlKG1lc3NhZ2VJZCwgdGV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc3Vic2NyaWJlVG9Ub3BpYygpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnBlZXIuc3Vic2NyaWJlKHRoaXMuaWRlbnRpZmllciwgdGhpcy5wYXJlbnRJZGVudGlmaWVyLCB0aGlzLnNvcnRPcmRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgYXV0aGVudGljYXRlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmJhY2tlbmQudXNlcikge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wZWVyLmF1dGhlbnRpY2F0ZSh0aGlzLmJhY2tlbmQudXNlcj8udG9rZW4pO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBDb3VsZCBub3QgYXV0aGVudGljYXRlIHdpdGggQmFudGEgc2VydmVyOmApO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjbG9zZSgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5jbG9zZSgpO1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQFJwY0V2ZW50KClcclxuICAgIG9uUGVybWlzc2lvbnMocGVybWlzc2lvbnM6IENoYXRQZXJtaXNzaW9ucykge1xyXG4gICAgICAgICh3aW5kb3cgYXMgYW55KS5iYW50YVBlcm1pc3Npb25zRGVidWcgPSBwZXJtaXNzaW9ucztcclxuICAgICAgICB0aGlzLnBlcm1pc3Npb25zID0gcGVybWlzc2lvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgQFJwY0V2ZW50KClcclxuICAgIG9uQ2hhdE1lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICBpZiAodGhpcy5tZXNzYWdlTWFwLmhhcyhtZXNzYWdlLmlkKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYXBPclVwZGF0ZU1lc3NhZ2UobWVzc2FnZSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICghbWVzc2FnZS5oaWRkZW4pIHtcclxuICAgICAgICAgICAgLy8gT25seSBwcm9jZXNzIG5vbi1oaWRkZW4gbWVzc2FnZXMgdGhyb3VnaCBoZXJlLiBcclxuICAgICAgICAgICAgLy8gSGlkZGVuIG1lc3NhZ2VzIG1heSBiZSBzZW50IHRvIHVzIHdoZW4gdGhleSBiZWNvbWUgaGlkZGVuIChpZSBtb2RlcmF0aW9uIGlzIG9jY3VycmluZykuXHJcbiAgICAgICAgICAgIC8vIEJ1dCBpZiB3ZSBuZXZlciBoYWQgdGhlIG1lc3NhZ2UgdG8gYmVnaW4gd2l0aCwgd2Ugc2hvdWxkIGRpc2NhcmQgaXQuXHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZU1hcC5zZXQobWVzc2FnZS5pZCwgbWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VSZWNlaXZlZC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG1lc3NhZ2VNYXAgPSBuZXcgTWFwPHN0cmluZywgQ2hhdE1lc3NhZ2U+KCk7XHJcbiAgICBwcml2YXRlIF9tZXNzYWdlUmVjZWl2ZWQgPSBuZXcgU3ViamVjdDxDaGF0TWVzc2FnZT4oKTtcclxuICAgIHByaXZhdGUgX21lc3NhZ2VVcGRhdGVkID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgICBwcml2YXRlIF9tZXNzYWdlU2VudCA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlPigpO1xyXG4gICAgcHJpdmF0ZSBfbWVzc2FnZU9ic2VydmVkID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2U+KCk7XHJcblxyXG4gICAgZ2V0IG1lc3NhZ2VSZWNlaXZlZCgpIHsgcmV0dXJuIHRoaXMuX21lc3NhZ2VSZWNlaXZlZC5hc09ic2VydmFibGUoKTsgfVxyXG4gICAgZ2V0IG1lc3NhZ2VVcGRhdGVkKCkgeyByZXR1cm4gdGhpcy5fbWVzc2FnZVVwZGF0ZWQuYXNPYnNlcnZhYmxlKCk7IH1cclxuICAgIGdldCBtZXNzYWdlU2VudCgpIHsgcmV0dXJuIHRoaXMuX21lc3NhZ2VTZW50LmFzT2JzZXJ2YWJsZSgpOyB9XHJcbiAgICBnZXQgbWVzc2FnZU9ic2VydmVkKCkgeyByZXR1cm4gdGhpcy5fbWVzc2FnZU9ic2VydmVkLmFzT2JzZXJ2YWJsZSgpOyB9XHJcblxyXG4gICAgbWVzc2FnZXM6IENoYXRNZXNzYWdlW10gPSBbXTtcclxuXHJcbiAgICBhc3luYyBzZW5kKG1lc3NhZ2U6IENoYXRNZXNzYWdlKTogUHJvbWlzZTxDaGF0TWVzc2FnZT4ge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlQ29ubmVjdGlvbigpO1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnBlZXIuc2VuZE1lc3NhZ2UobWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZEFmdGVyKG1lc3NhZ2U6IENoYXRNZXNzYWdlLCBjb3VudDogbnVtYmVyKTogUHJvbWlzZTxDaGF0TWVzc2FnZVtdPiB7XHJcbiAgICAgICAgaWYgKCFtZXNzYWdlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGlmICghbWVzc2FnZS5wYWdpbmdDdXJzb3IpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gdGhpcy5tYXBPclVwZGF0ZU1lc3NhZ2VzKFxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnBlZXIubG9hZEFmdGVyKE51bWJlcihtZXNzYWdlLnBhZ2luZ0N1cnNvciksIGNvdW50KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0KGlkOiBzdHJpbmcpOiBQcm9taXNlPENoYXRNZXNzYWdlPiB7XHJcbiAgICAgICAgaWYgKHRoaXMubWVzc2FnZU1hcC5oYXMoaWQpKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlTWFwLmdldChpZCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVDb25uZWN0aW9uKGBDb3VsZCBub3QgZ2V0IG1lc3NhZ2VgKTtcclxuICAgICAgICBsZXQgbWVzc2FnZSA9IGF3YWl0IHRoaXMucGVlci5nZXRNZXNzYWdlKGlkKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubWVzc2FnZU1hcC5oYXMoaWQpKSB7XHJcbiAgICAgICAgICAgIGxldCBleGlzdGluZ01lc3NhZ2UgPSB0aGlzLm1lc3NhZ2VNYXAuZ2V0KGlkKTtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihleGlzdGluZ01lc3NhZ2UsIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBtZXNzYWdlID0gZXhpc3RpbmdNZXNzYWdlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZU1hcC5zZXQoaWQsIG1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0Q291bnQoKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wZWVyLmdldENvdW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbGlrZU1lc3NhZ2UobWVzc2FnZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUNvbm5lY3Rpb24oKTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wZWVyLmxpa2VNZXNzYWdlKG1lc3NhZ2VJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdW5saWtlTWVzc2FnZShtZXNzYWdlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlQ29ubmVjdGlvbigpO1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnBlZXIudW5saWtlTWVzc2FnZShtZXNzYWdlSWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRlbGV0ZU1lc3NhZ2UobWVzc2FnZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUNvbm5lY3Rpb24oKTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wZWVyLmRlbGV0ZU1lc3NhZ2UobWVzc2FnZUlkKTtcclxuICAgIH1cclxuXHJcbn0iXX0=
@@ -1,70 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { Component, Output, ViewChild } from '@angular/core';
3
- import { CDNProvider } from '@banta/common';
4
- import { Subject } from 'rxjs';
5
- export class AttachmentButtonComponent {
6
- constructor(cdnProvider) {
7
- this.cdnProvider = cdnProvider;
8
- this._addedAttachment = new Subject();
9
- this._attachmentError = new Subject();
10
- }
11
- get addedAttachment() { return this._addedAttachment.asObservable(); }
12
- get attachmentError() { return this._attachmentError.asObservable(); }
13
- show() {
14
- this.fileInput.nativeElement.click();
15
- }
16
- fileChange(event) {
17
- return __awaiter(this, void 0, void 0, function* () {
18
- const element = event.currentTarget;
19
- if (element.files.length) {
20
- console.log('[Banta] File Added to comment');
21
- const file = element.files[0];
22
- let publicURL;
23
- let attachment = {
24
- type: file.type,
25
- url: undefined,
26
- transientState: {
27
- uploading: true,
28
- error: false,
29
- errorMessage: undefined
30
- }
31
- };
32
- this._addedAttachment.next(attachment);
33
- try {
34
- publicURL = yield this.cdnProvider.uploadImage(file);
35
- }
36
- catch (e) {
37
- attachment.transientState.error = true;
38
- attachment.transientState.errorMessage = "Failed to upload";
39
- console.error(`[Banta] Caught an error while uploading image to CDN:`);
40
- console.error(e);
41
- alert(`Failed to upload image. Please try again later.`);
42
- this._attachmentError.next(attachment);
43
- return;
44
- }
45
- // If no URL was returned, then an error must have occurred. Presumably the CDN
46
- // provider has conveyed an error to the user.
47
- if (!publicURL)
48
- return;
49
- attachment.url = publicURL;
50
- attachment.transientState = undefined;
51
- }
52
- });
53
- }
54
- }
55
- AttachmentButtonComponent.decorators = [
56
- { type: Component, args: [{
57
- selector: 'banta-attachment-button',
58
- 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\" >",
59
- styles: ["button{color:#666}\n"]
60
- },] }
61
- ];
62
- AttachmentButtonComponent.ctorParameters = () => [
63
- { type: CDNProvider }
64
- ];
65
- AttachmentButtonComponent.propDecorators = {
66
- fileInput: [{ type: ViewChild, args: ['fileUpload', { static: false },] }],
67
- addedAttachment: [{ type: Output }],
68
- attachmentError: [{ type: Output }]
69
- };
70
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNobWVudC1idXR0b24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvY29tbWVudHMvYXR0YWNobWVudC1idXR0b24vYXR0YWNobWVudC1idXR0b24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekUsT0FBTyxFQUFFLFdBQVcsRUFBeUIsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQU8vQixNQUFNLE9BQU8seUJBQXlCO0lBRXBDLFlBQ1UsV0FBd0I7UUFBeEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFJMUIscUJBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQXlCLENBQUM7UUFDeEQscUJBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQXlCLENBQUM7SUFIaEUsQ0FBQztJQU9ELElBQWMsZUFBZSxLQUFLLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoRixJQUFjLGVBQWUsS0FBSyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFaEYsSUFBSTtRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsYUFBa0MsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM3RCxDQUFDO0lBRUssVUFBVSxDQUFDLEtBQVk7O1lBQzNCLE1BQU0sT0FBTyxHQUFJLEtBQUssQ0FBQyxhQUFrQyxDQUFDO1lBQzFELElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7Z0JBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsQ0FBQztnQkFDN0MsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxTQUFpQixDQUFDO2dCQUV0QixJQUFJLFVBQVUsR0FBMEI7b0JBQ3RDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtvQkFDZixHQUFHLEVBQUUsU0FBUztvQkFDZCxjQUFjLEVBQUU7d0JBQ2QsU0FBUyxFQUFFLElBQUk7d0JBQ2YsS0FBSyxFQUFFLEtBQUs7d0JBQ1osWUFBWSxFQUFFLFNBQVM7cUJBQ3hCO2lCQUNGLENBQUE7Z0JBRUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFFdkMsSUFBSTtvQkFDRixTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDdEQ7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1YsVUFBVSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO29CQUN2QyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksR0FBRyxrQkFBa0IsQ0FBQztvQkFFNUQsT0FBTyxDQUFDLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO29CQUN2RSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNqQixLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztvQkFFekQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDdkMsT0FBTztpQkFDUjtnQkFFRCwrRUFBK0U7Z0JBQy9FLDhDQUE4QztnQkFDOUMsSUFBSSxDQUFDLFNBQVM7b0JBQ1osT0FBTztnQkFFVCxVQUFVLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQztnQkFDM0IsVUFBVSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUM7YUFDdkM7UUFFSCxDQUFDO0tBQUE7OztZQWxFRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLHlCQUF5QjtnQkFDbkMsb1JBQWlEOzthQUVsRDs7O1lBUFEsV0FBVzs7O3dCQWtCakIsU0FBUyxTQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7OEJBRXpDLE1BQU07OEJBQ04sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ0ROUHJvdmlkZXIsIENoYXRNZXNzYWdlQXR0YWNobWVudCB9IGZyb20gJ0BiYW50YS9jb21tb24nO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2JhbnRhLWF0dGFjaG1lbnQtYnV0dG9uJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYXR0YWNobWVudC1idXR0b24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2F0dGFjaG1lbnQtYnV0dG9uLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEF0dGFjaG1lbnRCdXR0b25Db21wb25lbnQge1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgY2RuUHJvdmlkZXI6IENETlByb3ZpZGVyLFxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYWRkZWRBdHRhY2htZW50ID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2VBdHRhY2htZW50PigpO1xyXG4gIHByaXZhdGUgX2F0dGFjaG1lbnRFcnJvciA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlQXR0YWNobWVudD4oKTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnZmlsZVVwbG9hZCcsIHsgc3RhdGljOiBmYWxzZSB9KSBmaWxlSW5wdXQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBPdXRwdXQoKSBnZXQgYWRkZWRBdHRhY2htZW50KCkgeyByZXR1cm4gdGhpcy5fYWRkZWRBdHRhY2htZW50LmFzT2JzZXJ2YWJsZSgpOyB9XHJcbiAgQE91dHB1dCgpIGdldCBhdHRhY2htZW50RXJyb3IoKSB7IHJldHVybiB0aGlzLl9hdHRhY2htZW50RXJyb3IuYXNPYnNlcnZhYmxlKCk7IH1cclxuXHJcbiAgc2hvdygpIHtcclxuICAgICh0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNsaWNrKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBmaWxlQ2hhbmdlKGV2ZW50OiBFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgZWxlbWVudCA9IChldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpO1xyXG4gICAgaWYgKGVsZW1lbnQuZmlsZXMubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdbQmFudGFdIEZpbGUgQWRkZWQgdG8gY29tbWVudCcpO1xyXG4gICAgICBjb25zdCBmaWxlID0gZWxlbWVudC5maWxlc1swXTtcclxuICAgICAgbGV0IHB1YmxpY1VSTDogc3RyaW5nO1xyXG4gICAgICBcclxuICAgICAgbGV0IGF0dGFjaG1lbnQ6IENoYXRNZXNzYWdlQXR0YWNobWVudCA9IHtcclxuICAgICAgICB0eXBlOiBmaWxlLnR5cGUsXHJcbiAgICAgICAgdXJsOiB1bmRlZmluZWQsXHJcbiAgICAgICAgdHJhbnNpZW50U3RhdGU6IHtcclxuICAgICAgICAgIHVwbG9hZGluZzogdHJ1ZSxcclxuICAgICAgICAgIGVycm9yOiBmYWxzZSxcclxuICAgICAgICAgIGVycm9yTWVzc2FnZTogdW5kZWZpbmVkXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9hZGRlZEF0dGFjaG1lbnQubmV4dChhdHRhY2htZW50KTtcclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgcHVibGljVVJMID0gYXdhaXQgdGhpcy5jZG5Qcm92aWRlci51cGxvYWRJbWFnZShmaWxlKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGF0dGFjaG1lbnQudHJhbnNpZW50U3RhdGUuZXJyb3IgPSB0cnVlO1xyXG4gICAgICAgIGF0dGFjaG1lbnQudHJhbnNpZW50U3RhdGUuZXJyb3JNZXNzYWdlID0gXCJGYWlsZWQgdG8gdXBsb2FkXCI7XHJcblxyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtCYW50YV0gQ2F1Z2h0IGFuIGVycm9yIHdoaWxlIHVwbG9hZGluZyBpbWFnZSB0byBDRE46YCk7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICBhbGVydChgRmFpbGVkIHRvIHVwbG9hZCBpbWFnZS4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci5gKTtcclxuXHJcbiAgICAgICAgdGhpcy5fYXR0YWNobWVudEVycm9yLm5leHQoYXR0YWNobWVudCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBJZiBubyBVUkwgd2FzIHJldHVybmVkLCB0aGVuIGFuIGVycm9yIG11c3QgaGF2ZSBvY2N1cnJlZC4gUHJlc3VtYWJseSB0aGUgQ0ROXHJcbiAgICAgIC8vIHByb3ZpZGVyIGhhcyBjb252ZXllZCBhbiBlcnJvciB0byB0aGUgdXNlci5cclxuICAgICAgaWYgKCFwdWJsaWNVUkwpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICBcclxuICAgICAgYXR0YWNobWVudC51cmwgPSBwdWJsaWNVUkw7XHJcbiAgICAgIGF0dGFjaG1lbnQudHJhbnNpZW50U3RhdGUgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbn1cclxuIl19
@@ -1,109 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { Directive, ElementRef, Input, Output } from "@angular/core";
3
- import { Subject } from "rxjs";
4
- import { ChatBackendBase } 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
- var _a;
24
- return (_a = this.elementRef) === null || _a === void 0 ? void 0 : _a.nativeElement;
25
- }
26
- get text() {
27
- return this.element.value;
28
- }
29
- scrape() {
30
- let message = {
31
- likes: 0,
32
- message: this.text,
33
- sentAt: undefined,
34
- user: null,
35
- attachments: this.attachments
36
- };
37
- let foundFragments = [];
38
- for (let scraper of this.chatBackend.attachmentScrapers) {
39
- let fragments = scraper.findFragments(message);
40
- if (!fragments) {
41
- console.error(`Attachment fragment scraper ${scraper.constructor.name} is implemented incorrectly: Returned null instead of array`);
42
- continue;
43
- }
44
- for (let fragment of fragments) {
45
- foundFragments.push(fragment.text);
46
- if (!this.fragments.has(fragment.text)) {
47
- console.log(`Scraped new fragment:`);
48
- console.dir(fragment);
49
- this.fragments.set(fragment.text, {
50
- fragment,
51
- resolution: undefined
52
- });
53
- }
54
- }
55
- }
56
- // Remove fragments that are no longer in the message.
57
- let removedFragments = [];
58
- for (let [key] of this.fragments) {
59
- if (!foundFragments.includes(key))
60
- removedFragments.push(key);
61
- }
62
- for (let removedFragment of removedFragments) {
63
- console.log(`Removed fragment: ${removedFragment}`);
64
- this.fragments.delete(removedFragment);
65
- }
66
- // Process any fragments that are not yet resolved (or being
67
- // resolved)
68
- for (let [key, state] of this.fragments) {
69
- if (state.resolution)
70
- continue;
71
- state.resolution = new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
72
- console.log(`Resolving fragment ${key}`);
73
- for (let resolver of this.chatBackend.attachmentResolvers) {
74
- console.log(`- Trying resolver ${resolver.constructor.name}...`);
75
- try {
76
- let attachment = yield resolver.resolveFragment(message, state.fragment);
77
- if (attachment) {
78
- console.log(`Resolved fragment ${key} into attachment:`);
79
- console.dir(attachment);
80
- this.attachments.push(attachment);
81
- this.attachmentsChange.next(this.attachments.slice());
82
- resolve(attachment);
83
- break;
84
- }
85
- }
86
- catch (e) {
87
- console.error(`Caught error during attachment resolver ${resolver.constructor.name}:`);
88
- console.error(e);
89
- continue;
90
- }
91
- }
92
- }));
93
- }
94
- }
95
- }
96
- AttachmentScraperDirective.decorators = [
97
- { type: Directive, args: [{
98
- selector: '[attachmentScraper]'
99
- },] }
100
- ];
101
- AttachmentScraperDirective.ctorParameters = () => [
102
- { type: ElementRef },
103
- { type: ChatBackendBase }
104
- ];
105
- AttachmentScraperDirective.propDecorators = {
106
- attachments: [{ type: Input }],
107
- attachmentsChange: [{ type: Output }]
108
- };
109
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNobWVudC1zY3JhcGVyLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Nkay9zcmMvbGliL2NvbW1lbnRzL2F0dGFjaG1lbnQtc2NyYXBlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFckUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFVdkQsTUFBTSxPQUFPLDBCQUEwQjtJQUNuQyxZQUNZLFVBQTJDLEVBQzNDLFdBQTRCO1FBRDVCLGVBQVUsR0FBVixVQUFVLENBQWlDO1FBQzNDLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUkvQixnQkFBVyxHQUE0QixFQUFFLENBQUM7UUFDekMsc0JBQWlCLEdBQUcsSUFBSSxPQUFPLEVBQTJCLENBQUM7UUFxQjdELG1CQUFjLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLGNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBbUMsQ0FBQztJQXpCL0QsQ0FBQztJQUlELFFBQVE7UUFDSixJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVc7WUFDN0IsT0FBTztRQUVYLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtZQUMxQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDOUUsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsSUFBSSxPQUFPOztRQUNQLE9BQU8sTUFB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Qzs0QkFDekQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQzs0QkFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7NEJBQ2xDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDOzRCQUN0RCxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7NEJBQ3BCLE1BQU07eUJBQ1Q7cUJBQ0o7b0JBQUMsT0FBTyxDQUFDLEVBQUU7d0JBQ1IsT0FBTyxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO3dCQUN2RixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNqQixTQUFTO3FCQUNaO2lCQUNKO1lBQ0wsQ0FBQyxDQUFBLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQzs7O1lBeEdKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUscUJBQXFCO2FBQ2xDOzs7WUFibUIsVUFBVTtZQUlyQixlQUFlOzs7MEJBaUJuQixLQUFLO2dDQUNMLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIElucHV0LCBPdXRwdXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBDaGF0TWVzc2FnZSwgQ2hhdE1lc3NhZ2VBdHRhY2htZW50IH0gZnJvbSBcIkBiYW50YS9jb21tb25cIjtcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IEF0dGFjaG1lbnRGcmFnbWVudCB9IGZyb20gXCIuLi9hdHRhY2htZW50LXNjcmFwZXJcIjtcclxuaW1wb3J0IHsgQ2hhdEJhY2tlbmRCYXNlIH0gZnJvbSBcIi4uL2NoYXQtYmFja2VuZC1iYXNlXCI7XHJcblxyXG5pbnRlcmZhY2UgQXR0YWNobWVudEZyYWdtZW50U3RhdGUge1xyXG4gICAgZnJhZ21lbnQ6IEF0dGFjaG1lbnRGcmFnbWVudDtcclxuICAgIHJlc29sdXRpb246IFByb21pc2U8Q2hhdE1lc3NhZ2VBdHRhY2htZW50PjtcclxufVxyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgICBzZWxlY3RvcjogJ1thdHRhY2htZW50U2NyYXBlcl0nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdHRhY2htZW50U2NyYXBlckRpcmVjdGl2ZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTFRleHRBcmVhRWxlbWVudD4sXHJcbiAgICAgICAgcHJpdmF0ZSBjaGF0QmFja2VuZDogQ2hhdEJhY2tlbmRCYXNlXHJcbiAgICApIHtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKSBhdHRhY2htZW50czogQ2hhdE1lc3NhZ2VBdHRhY2htZW50W10gPSBbXTtcclxuICAgIEBPdXRwdXQoKSBhdHRhY2htZW50c0NoYW5nZSA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlQXR0YWNobWVudFtdPigpO1xyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNjcmFwZVRpbWVvdXQpO1xyXG4gICAgICAgICAgICB0aGlzLnNjcmFwZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2NyYXBlKCksIHRoaXMuc2NyYXBlRGVib3VuY2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBlbGVtZW50KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWY/Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHRleHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC52YWx1ZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBzY3JhcGVUaW1lb3V0O1xyXG4gICAgcHJpdmF0ZSBzY3JhcGVEZWJvdW5jZSA9IDE1MDA7XHJcbiAgICBwcml2YXRlIGZyYWdtZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBBdHRhY2htZW50RnJhZ21lbnRTdGF0ZT4oKTtcclxuICAgIHByaXZhdGUgc2NyYXBlKCkge1xyXG4gICAgICAgIGxldCBtZXNzYWdlOiBDaGF0TWVzc2FnZSA9IHtcclxuICAgICAgICAgICAgbGlrZXM6IDAsXHJcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMudGV4dCxcclxuICAgICAgICAgICAgc2VudEF0OiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHVzZXI6IG51bGwsXHJcbiAgICAgICAgICAgIGF0dGFjaG1lbnRzOiB0aGlzLmF0dGFjaG1lbnRzXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbGV0IGZvdW5kRnJhZ21lbnRzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBzY3JhcGVyIG9mIHRoaXMuY2hhdEJhY2tlbmQuYXR0YWNobWVudFNjcmFwZXJzKSB7XHJcbiAgICAgICAgICAgIGxldCBmcmFnbWVudHMgPSBzY3JhcGVyLmZpbmRGcmFnbWVudHMobWVzc2FnZSk7XHJcbiAgICAgICAgICAgIGlmICghZnJhZ21lbnRzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBBdHRhY2htZW50IGZyYWdtZW50IHNjcmFwZXIgJHtzY3JhcGVyLmNvbnN0cnVjdG9yLm5hbWV9IGlzIGltcGxlbWVudGVkIGluY29ycmVjdGx5OiBSZXR1cm5lZCBudWxsIGluc3RlYWQgb2YgYXJyYXlgKTtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAobGV0IGZyYWdtZW50IG9mIGZyYWdtZW50cykge1xyXG4gICAgICAgICAgICAgICAgZm91bmRGcmFnbWVudHMucHVzaChmcmFnbWVudC50ZXh0KTtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5mcmFnbWVudHMuaGFzKGZyYWdtZW50LnRleHQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFNjcmFwZWQgbmV3IGZyYWdtZW50OmApO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGlyKGZyYWdtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZyYWdtZW50cy5zZXQoZnJhZ21lbnQudGV4dCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbjogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFJlbW92ZSBmcmFnbWVudHMgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBtZXNzYWdlLlxyXG4gICAgICAgIGxldCByZW1vdmVkRnJhZ21lbnRzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IFtrZXldIG9mIHRoaXMuZnJhZ21lbnRzKSB7XHJcbiAgICAgICAgICAgIGlmICghZm91bmRGcmFnbWVudHMuaW5jbHVkZXMoa2V5KSlcclxuICAgICAgICAgICAgICAgIHJlbW92ZWRGcmFnbWVudHMucHVzaChrZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCByZW1vdmVkRnJhZ21lbnQgb2YgcmVtb3ZlZEZyYWdtZW50cykge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgUmVtb3ZlZCBmcmFnbWVudDogJHtyZW1vdmVkRnJhZ21lbnR9YCk7XHJcbiAgICAgICAgICAgIHRoaXMuZnJhZ21lbnRzLmRlbGV0ZShyZW1vdmVkRnJhZ21lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gUHJvY2VzcyBhbnkgZnJhZ21lbnRzIHRoYXQgYXJlIG5vdCB5ZXQgcmVzb2x2ZWQgKG9yIGJlaW5nIFxyXG4gICAgICAgIC8vIHJlc29sdmVkKVxyXG5cclxuICAgICAgICBmb3IgKGxldCBba2V5LCBzdGF0ZV0gb2YgdGhpcy5mcmFnbWVudHMpIHtcclxuICAgICAgICAgICAgaWYgKHN0YXRlLnJlc29sdXRpb24pXHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgIHN0YXRlLnJlc29sdXRpb24gPSBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgUmVzb2x2aW5nIGZyYWdtZW50ICR7a2V5fWApO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcmVzb2x2ZXIgb2YgdGhpcy5jaGF0QmFja2VuZC5hdHRhY2htZW50UmVzb2x2ZXJzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYC0gVHJ5aW5nIHJlc29sdmVyICR7cmVzb2x2ZXIuY29uc3RydWN0b3IubmFtZX0uLi5gKTtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXR0YWNobWVudCA9IGF3YWl0IHJlc29sdmVyLnJlc29sdmVGcmFnbWVudChtZXNzYWdlLCBzdGF0ZS5mcmFnbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgUmVzb2x2ZWQgZnJhZ21lbnQgJHtrZXl9IGludG8gYXR0YWNobWVudDpgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGlyKGF0dGFjaG1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdHRhY2htZW50cy5wdXNoKGF0dGFjaG1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdHRhY2htZW50c0NoYW5nZS5uZXh0KHRoaXMuYXR0YWNobWVudHMuc2xpY2UoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGF0dGFjaG1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENhdWdodCBlcnJvciBkdXJpbmcgYXR0YWNobWVudCByZXNvbHZlciAke3Jlc29sdmVyLmNvbnN0cnVjdG9yLm5hbWV9OmApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0iXX0=