@@ -129,12 +129,13 @@
129 129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return resized;
130 130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
})();
131 131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil.FRK = ForceResizeKludge/*for debugging*/;
132 132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const Chat = ForceResizeKludge.chat = (function(){
133 133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const cs = { // the "Chat" object (result of this function)
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- verboseErrors: false /* if true then certain, mostly extraneous,
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- error messages may be sent to the console. */,
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ beVerbose: false /* if true then certain, mostly extraneous,
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ error messages and log messages may be sent
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to the console. */,
136 137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
playedBeep: false /* used for the beep-once setting */,
137 138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
e:{/*map of certain DOM elements.*/
138 139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
messageInjectPoint: E1('#message-inject-point'),
139 140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pageTitle: E1('head title'),
140 141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
loadOlderToolbar: undefined /* the load-posts toolbar (dynamically created) */,
@@ -155,11 +156,12 @@
155 156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
viewSearch: E1('#chat-search'),
156 157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
searchContent: E1('#chat-search-content'),
157 158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
btnPreview: E1('#chat-button-preview'),
158 159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
views: document.querySelectorAll('.chat-view'),
159 160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
activeUserListWrapper: E1('#chat-user-list-wrapper'),
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- activeUserList: E1('#chat-user-list')
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ activeUserList: E1('#chat-user-list'),
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eMsgPollError: undefined /* current connection error MessageMidget */
161 163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
162 164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
me: F.user.name,
163 165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mxMsg: F.config.chat.initSize ? -F.config.chat.initSize : -50,
164 166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mnMsg: undefined/*lowest message ID we've seen so far (for history loading)*/,
165 167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pageIsActive: 'visible'===document.visibilityState,
@@ -195,32 +197,32 @@
195 197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
196 198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
timer:{
197 199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
tidPoller: undefined /* poller timer */,
198 200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
$initialDelay: 1000 /* initial polling interval (ms) */,
199 201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
currentDelay: 1000 /* current polling interval */,
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- maxDelay: 60000 /* max interval when backing off for
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ maxDelay: 60000 * 5 /* max interval when backing off for
201 203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
connection errors */,
202 204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
minDelay: 5000 /* minimum delay time */,
203 205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
tidReconnect: undefined /*timer id for reconnection determination*/,
204 206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
randomInterval: function(factor){
205 207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return Math.floor(Math.random() * factor);
206 208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
207 209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
incrDelay: function(){
208 210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( this.maxDelay > this.currentDelay ){
209 211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(this.currentDelay < this.minDelay){
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- this.currentDelay = this.minDelay + this.randomInterval(this.minDelay/2);
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.currentDelay = this.minDelay + this.randomInterval(this.minDelay);
211 213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- this.currentDelay = this.currentDelay*2 + this.randomInterval(this.currentDelay/2);
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.currentDelay = this.currentDelay*2 + this.randomInterval(this.currentDelay);
213 215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
214 216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
215 217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return this.currentDelay;
216 218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
217 219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
resetDelay: function(){
218 220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return this.currentDelay = this.$initialDelay;
219 221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
220 222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
isDelayed: function(){
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return this.currentDelay > this.$initialDelay;
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return (this.currentDelay > this.$initialDelay) ? this.currentDelay : 0;
222 224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
223 225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
224 226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**
225 227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Gets (no args) or sets (1 arg) the current input text field
226 228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
value, taking into account single- vs multi-line input. The
@@ -272,11 +274,10 @@
272 274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
273 275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ajaxStart: function(){
274 276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(1===++this.ajaxInflight){
275 277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
this.enableAjaxComponents(false);
276 278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- setupConnectionReestablished();
278 279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
279 280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Must be called after any ajax-related call for which
280 281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ajaxStart() was called, regardless of success or failure. If
281 282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
it was the last such call (as measured by calls to
282 283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ajaxStart() and ajaxEnd()), elements disabled by a prior call
@@ -697,11 +698,11 @@
697 698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
698 699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cs.reportErrorAsMessage = function f(/*msg args*/){
699 700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const args = argsToArray(arguments).map(function(v){
700 701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return (v instanceof Error) ? v.message : v;
701 702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
});
702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(Chat.verboseErrors){
703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(Chat.beVerbose){
703 704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
console.error("chat error:",args);
704 705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
705 706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const d = new Date().toISOString(),
706 707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mw = new this.MessageWidget({
707 708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
isError: true,
@@ -733,10 +734,11 @@
733 734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lmtime: d,
734 735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
xmsg: args
735 736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
});
736 737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
this.injectMessageElem(mw.e.body);
737 738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mw.scrollIntoView();
739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ //Chat.playNewMessageSound();// browser complains b/c this wasn't via human interaction
738 740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return mw;
739 741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
740 742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
741 743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cs.getMessageElemById = function(id){
742 744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return qs('[data-msgid="'+id+'"]');
@@ -842,11 +844,11 @@
842 844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const self = this;
843 845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
F.fetch('chat-fetch-one',{
844 846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
urlParams:{ name: id, raw: true},
845 847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
responseType: 'json',
846 848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
onload: function(msg){
847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- reportConnectionReestablished();
849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reportConnectionReestablished('chat-fetch-one');
848 850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
content.$elems[1] = D.append(D.pre(),msg.xmsg);
849 851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
content.$elems[1]._xmsgRaw = msg.xmsg/*used for copy-to-clipboard feature*/;
850 852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
self.toggleTextMode(e);
851 853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
852 854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aftersend:function(){
@@ -905,11 +907,11 @@
905 907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(this.userMayDelete(e)){
906 908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
this.ajaxStart();
907 909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
F.fetch("chat-delete/" + id, {
908 910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
responseType: 'json',
909 911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
onload:(r)=>{
910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- reportConnectionReestablished();
912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reportConnectionReestablished('chat-delete');
911 913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
this.deleteMessageElem(r);
912 914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
913 915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
onerror:(err)=>this.reportErrorAsMessage(err)
914 916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
});
915 917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
@@ -1527,11 +1529,11 @@
1527 1529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
n: nFetch,
1528 1530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i: iFirst
1529 1531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
1530 1532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
responseType: "json",
1531 1533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
onload:function(jx){
1532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- reportConnectionReestablished();
1534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reportConnectionReestablished('chat-query.onload');
1533 1535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( bDown ) jx.msgs.reverse();
1534 1536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
jx.msgs.forEach((m) => {
1535 1537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m.isSearchResult = true;
1536 1538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
var mw = new Chat.MessageWidget(m);
1537 1539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( bDown ){
@@ -1696,48 +1698,52 @@
1696 1698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(theMsg) Chat.deleteMessageElem(theMsg);
1697 1699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}));
1698 1700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.reportErrorAsMessage(w);
1699 1701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
1700 1702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const removeConnectionErrors = function() {
1702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- D.remove(Chat.e.viewMessages.querySelectorAll(
1703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- '.message-widget.error-connection'));
1704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- };
1705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Assume the connection has been established, reset
1707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- the Chat.timer.tidReconnect, and alert the user
1708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- that the outage appears to be over. */
1709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const reportConnectionReestablished = function(){
1703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Assume the connection has been established, reset the
1704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.timer.tidReconnect, and (if showMsg and
1705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ !!Chat.e.eMsgPollError) alert the user that the outage appears to
1706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ be over. */
1707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const reportConnectionReestablished = function(dbgContext, showMsg = true){
1708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(Chat.beVerbose){
1709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ console.warn("reportConnectionReestablished()",
1710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dbgContext, showMsg, Chat.timer.tidReconnect, Chat.e.eMsgPollError);
1711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1710 1712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( Chat.timer.tidReconnect ){
1711 1713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
clearTimeout(Chat.timer.tidReconnect);
1712 1714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.timer.tidReconnect = 0;
1713 1715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( Chat.timer.isDelayed() ){
1715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- removeConnectionErrors();
1716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Chat.timer.resetDelay();
1717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Chat.reportReconnection(
1718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "Connection restored after outage."
1719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
1720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- setTimeout( Chat.poll, 0 );
1721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.timer.resetDelay();
1717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( Chat.e.eMsgPollError ) {
1718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.e.eMsgPollError = undefined;
1719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( showMsg ){
1720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.reportReconnection(
1721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "Poller connection restored."
1722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
1723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ setTimeout( Chat.poll, 0 );
1722 1726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
1723 1727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* To be called from F.fetch() beforesend() handlers. If we're
1725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- currently in delayed-retry mode and a connection is start, try to
1726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- reset the delay after N time waiting on that connection. The fact
1727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- that the connection is waiting to respond, rather than outright
1728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- failing, is a good hint that the outage is over and we can reset
1729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- the back-off timer. */
1730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const setupConnectionReestablished = function(){
1728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* To be called from F.fetch('chat-poll') beforesend() handlers. If we're
1729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ currently in delayed-retry mode and a connection is started, try
1730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to reset the delay after N time waiting on that connection. The
1731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fact that the connection is waiting to respond, rather than
1732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ outright failing, is a good hint that the outage is over and we
1733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ can reset the back-off timer. */
1734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const clearPollErrOnWait = function(){
1731 1735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !Chat.timer.tidReconnect && Chat.timer.isDelayed() ){
1732 1736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.timer.tidReconnect = setTimeout(()=>{
1733 1737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.timer.tidReconnect = 0;
1734 1738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( poll.running ){
1735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- reportConnectionReestablished();
1739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* This chat-poll F.fetch() is still underway, so let's
1740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assume the connection is back up until/unless it times
1741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ out or breaks again. */
1742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reportConnectionReestablished('clearPollErrOnWait');
1736 1743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }, Chat.timer.$initialDelay * 5 );
1738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- removeConnectionErrors();
1744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }, Chat.timer.$initialDelay * 3 );
1739 1745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1740 1746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
1741 1747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1742 1748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**
1743 1749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Submits the contents of the message input field (if not empty)
@@ -2582,32 +2588,34 @@
2582 2588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.reportErrorAsMessage(
2583 2589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"Shutting down chat poller due to server-side error. ",
2584 2590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"Reload this page to reactivate it."
2585 2591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
2586 2592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.timer.tidPoller = undefined;
2587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- poll.running = false;
2588 2593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} else {
2589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- poll.running = false;
2590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !err ){
2591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Restart the poller. */
2592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Chat.timer.tidPoller = setTimeout(
2593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- poll, Chat.timer.resetDelay()
2594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
2594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( err && Chat.beVerbose ){
2595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ console.error("afterPollFetch:",err.name,err.status,err.message);
2596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !err || 'timeout'===err.name/*(probably) long-poll expired*/ ){
2598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Restart the poller immediately. */
2599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reportConnectionReestablished('afterPollFetch '+err, false);
2595 2600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
2596 2601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Delay a while before trying again, noting that other Chat
2597 2602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
APIs may try and succeed at connections before this timer
2598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- resolves. */
2603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ resolves, in which case they'll clear this timeout and the
2604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ UI message about the outage. */
2599 2605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const delay = Chat.timer.incrDelay();
2600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const msg = D.addClass(
2601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Chat.reportErrorAsMessage(
2602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "Connection error. Retrying in ",
2603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- delay, " ms."
2604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ).e.body,
2605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- 'error-connection'
2606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
2606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ //console.warn("afterPollFetch Chat.e.eMsgPollError",Chat.e.eMsgPollError);
2607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const msg = "Connection error. Retrying in "+delay+ " ms.";
2608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( Chat.e.eMsgPollError ){
2609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Update the error message on the current error MessageWidget */
2610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.e.eMsgPollError.e.content.innerText = msg;
2611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else {
2612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Set current (new) error MessageWidget */
2613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.e.eMsgPollError = Chat.reportErrorAsMessage(msg);
2614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ //Chat.playNewMessageSound();// browser complains b/c this wasn't via human interaction
2615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2607 2616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.timer.tidPoller = setTimeout(()=>{
2608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- D.remove(msg);
2609 2617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
poll();
2610 2618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}, delay);
2611 2619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2612 2620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
//console.log("isOkay =",isOkay,"currentDelay =",Chat.timer.currentDelay);
2613 2621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -2627,42 +2635,78 @@
2627 2635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
xhrRequest.status value to do so, with status==0 being a
2628 2636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
connection error. We do not currently have a clean way of passing
2629 2637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
that info back to the fossil.fetch() client, so we'll need to
2630 2638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
hammer on that API a bit to get this working.
2631 2639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
2632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const poll = async function f(){
2640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const poll = Chat.poll = async function f(){
2633 2641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(f.running) return;
2634 2642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
f.running = true;
2635 2643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat._isBatchLoading = f.isFirstCall;
2636 2644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(true===f.isFirstCall){
2637 2645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
f.isFirstCall = false;
2646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.aPollErr = [];
2638 2647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.ajaxStart();
2639 2648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.e.viewMessages.classList.add('loading');
2649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ setInterval(
2650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
2651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ We manager onerror() results in poll() using a
2652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ stack of error objects and we delay their handling by
2653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a small amount, rather than immediately when the
2654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ exception arrives.
2655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This level of indirection is to work around an
2657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ inexplicable behavior from the F.fetch() connections:
2658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ timeouts are always announced in pairs of an HTTP 0 and
2659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ something we can unambiguously identify as a timeout. When
2660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ that happens, we ignore the HTTP 0. If, however, an HTTP 0
2661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ is seen here without an immediately-following timeout, we
2662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ process it.
2663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ It's kinda like in the curses C API, where you to match
2665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ALT-X by first getting an ALT event, then a separate X
2666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ event, but a lot less explicable.
2667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
2668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ()=>{
2669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( Chat.aPollErr.length ){
2670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(Chat.aPollErr.length>1){
2671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ console.warn('aPollErr',Chat.aPollErr);
2672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(Chat.aPollErr[1].name='timeout'){
2673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* mysterious pairs of HTTP 0 followed immediately
2674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ by timeout response; ignore the former in that case. */
2675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.aPollErr.shift();
2676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ afterPollFetch(Chat.aPollErr.shift());
2679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
2681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 1000
2682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
2640 2683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ let nErr = 0;
2641 2685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
F.fetch("chat-poll",{
2642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- timeout: 420 * 1000/*FIXME: get the value from the server*/,
2643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- //timeout: 8000,
2686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ timeout: //420 * 1000/*FIXME: get the value from the server*/,
2687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 15000,
2644 2688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
urlParams:{
2645 2689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
name: Chat.mxMsg
2646 2690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
2647 2691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
responseType: "json",
2648 2692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// Disable the ajax start/end handling for this long-polling op:
2649 2693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
beforesend: function(){
2650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- setupConnectionReestablished();
2694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ clearPollErrOnWait();
2651 2695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
2652 2696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aftersend: function(){
2697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ poll.running = false;
2653 2698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
2654 2699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
onerror:function(err){
2655 2700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat._isBatchLoading = false;
2656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(Chat.verboseErrors) console.error("poll onerror:",err);
2657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* ^^^ we don't use Chat.reportError() here b/c the polling
2658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fails exepectedly when it times out, but is then immediately
2659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- resumed, and reportError() produces a loud error message. */
2660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- afterPollFetch(err);
2701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(Chat.beVerbose){
2702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ console.error("poll.onerror:",err.name,err.status,JSON.stringify(err));
2703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.aPollErr.push(err);
2661 2705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
2662 2706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
onload:function(y){
2663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- reportConnectionReestablished();
2707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reportConnectionReestablished('poll.onload', true);
2664 2708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
newcontent(y);
2665 2709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(Chat._isBatchLoading){
2666 2710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat._isBatchLoading = false;
2667 2711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.updateActiveUserList();
2668 2712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -2669,11 +2713,10 @@
2669 2713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
afterPollFetch();
2670 2714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2671 2715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
});
2672 2716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
2673 2717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
poll.isFirstCall = true;
2674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Chat.poll = poll;
2675 2718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat._gotServerError = poll.running = false;
2676 2719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( window.fossil.config.chat.fromcli ){
2677 2720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.chatOnlyMode(true);
2678 2721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2679 2722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.timer.tidPoller = setTimeout(poll, Chat.timer.resetDelay());
2680 2723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!