@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add a "Reconnect" debugging action and show reconnect delays in the console

Summary: Ref T12568. Ref T12567. Allows you to force a reconnect, and shows the reconnect delay on connection close/failure.

Test Plan: {F4911879}

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T12568, T12567

Differential Revision: https://secure.phabricator.com/D17705

+122 -32
+30 -30
resources/celerity/map.php
··· 10 10 'conpherence.pkg.css' => 'a34d59bd', 11 11 'conpherence.pkg.js' => '5f86c17d', 12 12 'core.pkg.css' => '959330a2', 13 - 'core.pkg.js' => '941db947', 14 - 'darkconsole.pkg.js' => '061371d8', 13 + 'core.pkg.js' => 'd7ca5b9a', 14 + 'darkconsole.pkg.js' => 'a2faee86', 15 15 'differential.pkg.css' => '90b30783', 16 16 'differential.pkg.js' => 'ddfeb49b', 17 17 'diffusion.pkg.css' => '91c5d3a6', ··· 20 20 'maniphest.pkg.css' => '4845691a', 21 21 'maniphest.pkg.js' => '5ab2753f', 22 22 'rsrc/css/aphront/aphront-bars.css' => '231ac33c', 23 - 'rsrc/css/aphront/dark-console.css' => '07dd8d38', 23 + 'rsrc/css/aphront/dark-console.css' => 'e7c6e44d', 24 24 'rsrc/css/aphront/dialog-view.css' => '685c7e2d', 25 25 'rsrc/css/aphront/list-filter-view.css' => '5d6f0526', 26 26 'rsrc/css/aphront/multi-column.css' => '84cc6640', ··· 245 245 'rsrc/externals/javelin/lib/Sound.js' => '949c0fe5', 246 246 'rsrc/externals/javelin/lib/URI.js' => 'c989ade3', 247 247 'rsrc/externals/javelin/lib/Vector.js' => '2caa8fb8', 248 - 'rsrc/externals/javelin/lib/WebSocket.js' => 'e292eaf4', 248 + 'rsrc/externals/javelin/lib/WebSocket.js' => '0c4969d6', 249 249 'rsrc/externals/javelin/lib/Workflow.js' => '1e911d0f', 250 250 'rsrc/externals/javelin/lib/__tests__/Cookie.js' => '5ed109e8', 251 251 'rsrc/externals/javelin/lib/__tests__/DOM.js' => 'c984504b', ··· 361 361 'rsrc/image/texture/table_header.png' => '5c433037', 362 362 'rsrc/image/texture/table_header_hover.png' => '038ec3b9', 363 363 'rsrc/image/texture/table_header_tall.png' => 'd56b434f', 364 - 'rsrc/js/application/aphlict/Aphlict.js' => '5359e785', 364 + 'rsrc/js/application/aphlict/Aphlict.js' => 'ce5f793f', 365 365 'rsrc/js/application/aphlict/behavior-aphlict-dropdown.js' => 'caade6f2', 366 366 'rsrc/js/application/aphlict/behavior-aphlict-listen.js' => 'd82b1ff9', 367 367 'rsrc/js/application/aphlict/behavior-aphlict-status.js' => '5e2634b9', ··· 522 522 'rsrc/js/core/behavior-workflow.js' => '0a3f3021', 523 523 'rsrc/js/core/darkconsole/DarkLog.js' => 'c8e1ffe3', 524 524 'rsrc/js/core/darkconsole/DarkMessage.js' => 'c48cccdd', 525 - 'rsrc/js/core/darkconsole/behavior-dark-console.js' => '3725c90c', 525 + 'rsrc/js/core/darkconsole/behavior-dark-console.js' => '698614f9', 526 526 'rsrc/js/core/phtize.js' => 'd254d646', 527 527 'rsrc/js/phui/behavior-phui-dropdown-menu.js' => 'b95d6f7d', 528 528 'rsrc/js/phui/behavior-phui-file-upload.js' => 'b003d4fb', ··· 538 538 'symbols' => array( 539 539 'almanac-css' => 'dbb9b3af', 540 540 'aphront-bars' => '231ac33c', 541 - 'aphront-dark-console-css' => '07dd8d38', 541 + 'aphront-dark-console-css' => 'e7c6e44d', 542 542 'aphront-dialog-view-css' => '685c7e2d', 543 543 'aphront-list-filter-view-css' => '5d6f0526', 544 544 'aphront-multi-column-view-css' => '84cc6640', ··· 583 583 'herald-rule-editor' => 'd6a7e717', 584 584 'herald-test-css' => 'a52e323e', 585 585 'inline-comment-summary-css' => '51efda3a', 586 - 'javelin-aphlict' => '5359e785', 586 + 'javelin-aphlict' => 'ce5f793f', 587 587 'javelin-behavior' => '61cbc29a', 588 588 'javelin-behavior-aphlict-dropdown' => 'caade6f2', 589 589 'javelin-behavior-aphlict-listen' => 'd82b1ff9', ··· 605 605 'javelin-behavior-conpherence-pontificate' => '55616e04', 606 606 'javelin-behavior-conpherence-search' => '9bbf3762', 607 607 'javelin-behavior-countdown-timer' => 'e4cc26b3', 608 - 'javelin-behavior-dark-console' => '3725c90c', 608 + 'javelin-behavior-dark-console' => '698614f9', 609 609 'javelin-behavior-dashboard-async-panel' => '469c0d9e', 610 610 'javelin-behavior-dashboard-move-panels' => '408bf173', 611 611 'javelin-behavior-dashboard-query-panel-select' => '453c5375', ··· 753 753 'javelin-view-interpreter' => 'f829edb3', 754 754 'javelin-view-renderer' => '6c2b09a2', 755 755 'javelin-view-visitor' => 'efe49472', 756 - 'javelin-websocket' => 'e292eaf4', 756 + 'javelin-websocket' => '0c4969d6', 757 757 'javelin-workboard-board' => '8935deef', 758 758 'javelin-workboard-card' => 'c587b80f', 759 759 'javelin-workboard-column' => '21df4ff5', ··· 980 980 'javelin-workflow', 981 981 'javelin-dom', 982 982 'javelin-router', 983 + ), 984 + '0c4969d6' => array( 985 + 'javelin-install', 983 986 ), 984 987 '0ca788bd' => array( 985 988 'javelin-behavior', ··· 1122 1125 'javelin-dom', 1123 1126 'javelin-workflow', 1124 1127 ), 1125 - '3725c90c' => array( 1126 - 'javelin-behavior', 1127 - 'javelin-stratcom', 1128 - 'javelin-util', 1129 - 'javelin-dom', 1130 - 'javelin-request', 1131 - 'phabricator-keyboard-shortcut', 1132 - 'phabricator-darklog', 1133 - 'phabricator-darkmessage', 1134 - ), 1135 1128 '3ab51e2c' => array( 1136 1129 'javelin-behavior', 1137 1130 'javelin-behavior-device', ··· 1294 1287 '5294060f' => array( 1295 1288 'phui-theme-css', 1296 1289 ), 1297 - '5359e785' => array( 1298 - 'javelin-install', 1299 - 'javelin-util', 1300 - 'javelin-websocket', 1301 - 'javelin-leader', 1302 - 'javelin-json', 1303 - ), 1304 1290 '54b612ba' => array( 1305 1291 'javelin-color', 1306 1292 'javelin-install', ··· 1394 1380 ), 1395 1381 '6882e80a' => array( 1396 1382 'javelin-dom', 1383 + ), 1384 + '698614f9' => array( 1385 + 'javelin-behavior', 1386 + 'javelin-stratcom', 1387 + 'javelin-util', 1388 + 'javelin-dom', 1389 + 'javelin-request', 1390 + 'phabricator-keyboard-shortcut', 1391 + 'phabricator-darklog', 1392 + 'phabricator-darkmessage', 1397 1393 ), 1398 1394 '69adf288' => array( 1399 1395 'javelin-install', ··· 2018 2014 'cd2b9b77' => array( 2019 2015 'phui-oi-list-view-css', 2020 2016 ), 2017 + 'ce5f793f' => array( 2018 + 'javelin-install', 2019 + 'javelin-util', 2020 + 'javelin-websocket', 2021 + 'javelin-leader', 2022 + 'javelin-json', 2023 + ), 2021 2024 'd0c516d5' => array( 2022 2025 'javelin-behavior', 2023 2026 'javelin-dom', ··· 2127 2130 'javelin-behavior', 2128 2131 'javelin-stratcom', 2129 2132 'javelin-dom', 2130 - ), 2131 - 'e292eaf4' => array( 2132 - 'javelin-install', 2133 2133 ), 2134 2134 'e2e0a072' => array( 2135 2135 'javelin-behavior',
+30 -1
src/applications/console/plugin/DarkConsoleRealtimePlugin.php
··· 15 15 } 16 16 17 17 public function renderPanel() { 18 - return phutil_tag( 18 + $frame = phutil_tag( 19 19 'div', 20 20 array( 21 21 'id' => 'dark-console-realtime-log', 22 22 'class' => 'dark-console-log-frame', 23 + )); 24 + 25 + $reconnect_label = pht('Reconnect'); 26 + 27 + $buttons = phutil_tag( 28 + 'div', 29 + array( 30 + 'class' => 'dark-console-realtime-actions', 31 + ), 32 + array( 33 + id(new PHUIButtonView()) 34 + ->setIcon('fa-refresh') 35 + ->setColor(PHUIButtonView::GREY) 36 + ->setText($reconnect_label) 37 + ->addSigil('dark-console-realtime-action') 38 + ->setMetadata( 39 + array( 40 + 'action' => 'reconnect', 41 + 'label' => $reconnect_label, 42 + )), 43 + )); 44 + 45 + return phutil_tag( 46 + 'div', 47 + array( 48 + ), 49 + array( 50 + $buttons, 51 + $frame, 23 52 )); 24 53 } 25 54
+1 -1
webroot/rsrc/css/aphront/dark-console.css
··· 223 223 overflow: auto; 224 224 background: #303030; 225 225 border: 1px solid #202020; 226 - margin: 4px; 226 + margin: 8px 0; 227 227 } 228 228 229 229 .dark-console-log-message {
+20
webroot/rsrc/externals/javelin/lib/WebSocket.js
··· 105 105 106 106 107 107 /** 108 + * Disconnect abruptly, prompting a reconnect. 109 + */ 110 + reconnect: function() { 111 + if (!this._isOpen) { 112 + return; 113 + } 114 + 115 + this._socket.close(); 116 + }, 117 + 118 + 119 + /** 120 + * Get the current reconnect delay (in milliseconds). 121 + */ 122 + getReconnectDelay: function() { 123 + return this._delayUntilReconnect; 124 + }, 125 + 126 + 127 + /** 108 128 * Callback for connection open. 109 129 */ 110 130 _onopen: function() {
+4
webroot/rsrc/js/application/aphlict/Aphlict.js
··· 71 71 return this._status; 72 72 }, 73 73 74 + getWebsocket: function() { 75 + return this._socket; 76 + }, 77 + 74 78 _begin: function() { 75 79 JX.Leader.broadcast( 76 80 null,
+37
webroot/rsrc/js/core/darkconsole/behavior-dark-console.js
··· 353 353 354 354 JX.Leader.listen('onReceiveBroadcast', function(message, is_leader) { 355 355 var json = JX.JSON.stringify(message.data); 356 + 357 + if (message.type == 'aphlict.status') { 358 + if (message.data == 'closed') { 359 + var ws = JX.Aphlict.getInstance().getWebsocket(); 360 + if (ws) { 361 + var delay = ws.getReconnectDelay(); 362 + json += ' [Reconnect: ' + delay + 'ms]'; 363 + } 364 + } 365 + } 366 + 356 367 leader_log('onReceiveBroadcast', message.type, is_leader, json); 357 368 }); 358 369 359 370 JX.Leader.listen('onBecomeLeader', function() { 360 371 leader_log('onBecomeLeader'); 361 372 }); 373 + 374 + var action_log = function(action) { 375 + var message = new JX.DarkMessage() 376 + .setMessage('> ' + action); 377 + 378 + realtime_log.addMessage(message); 379 + }; 380 + 381 + JX.Stratcom.listen('click', 'dark-console-realtime-action', function(e) { 382 + var node = e.getNode('dark-console-realtime-action'); 383 + var data = JX.Stratcom.getData(node); 384 + 385 + action_log(data.label); 386 + 387 + var action = data.action; 388 + switch (action) { 389 + case 'reconnect': 390 + var ws = JX.Aphlict.getInstance().getWebsocket(); 391 + if (ws) { 392 + ws.reconnect(); 393 + } 394 + break; 395 + } 396 + 397 + }); 398 + 362 399 } 363 400 364 401 });