2020-03-30 11:44:18 +00:00
import * as loader from "tc-loader" ;
import { settings , Settings } from "tc-shared/settings" ;
import * as log from "tc-shared/log" ;
2020-06-12 09:04:18 +00:00
import { LogCategory } from "tc-shared/log" ;
2020-07-20 17:08:13 +00:00
import * as bipc from "./ipc/BrowserIPC" ;
2020-03-30 11:44:18 +00:00
import * as sound from "./sound/Sounds" ;
import * as i18n from "./i18n/localize" ;
2020-06-12 09:04:18 +00:00
import { tra } from "./i18n/localize" ;
2020-09-16 17:30:28 +00:00
import { ConnectionHandler , ConnectionState } from "tc-shared/ConnectionHandler" ;
2020-03-30 11:44:18 +00:00
import { createInfoModal } from "tc-shared/ui/elements/Modal" ;
import * as stats from "./stats" ;
import * as fidentity from "./profiles/identities/TeaForumIdentity" ;
2020-09-07 10:42:00 +00:00
import { defaultRecorder , RecorderProfile , setDefaultRecorder } from "tc-shared/voice/RecorderProfile" ;
2020-03-30 11:44:18 +00:00
import * as cmanager from "tc-shared/ui/frames/connection_handlers" ;
2020-06-12 09:04:18 +00:00
import { server_connections } from "tc-shared/ui/frames/connection_handlers" ;
2020-03-30 11:44:18 +00:00
import { spawnConnectModal } from "tc-shared/ui/modal/ModalConnect" ;
import * as top_menu from "./ui/frames/MenuBar" ;
import { spawnYesNo } from "tc-shared/ui/modal/ModalYesNo" ;
import { formatMessage } from "tc-shared/ui/frames/chat" ;
import { openModalNewcomer } from "tc-shared/ui/modal/ModalNewcomer" ;
import * as aplayer from "tc-backend/audio/player" ;
import * as ppt from "tc-backend/ppt" ;
2020-04-10 18:57:50 +00:00
import * as keycontrol from "./KeyControl" ;
2020-04-06 14:28:15 +00:00
import * as React from "react" ;
import * as ReactDOM from "react-dom" ;
import * as cbar from "./ui/frames/control-bar" ;
2020-04-09 13:10:14 +00:00
import * as global_ev_handler from "./events/ClientGlobalControlHandler" ;
2020-04-21 14:17:21 +00:00
import { global_client_actions } from "tc-shared/events/GlobalEvents" ;
2020-06-12 09:04:18 +00:00
import { FileTransferState , TransferProvider , } from "tc-shared/file/Transfer" ;
import { MenuEntryType , spawn_context_menu } from "tc-shared/ui/elements/ContextMenu" ;
import { copy_to_clipboard } from "tc-shared/utils/helpers" ;
2020-08-23 08:48:15 +00:00
import { checkForUpdatedApp } from "tc-shared/update" ;
import { setupJSRender } from "tc-shared/ui/jsrender" ;
2020-08-09 12:30:17 +00:00
import "svg-sprites/client-icons" ;
2020-04-06 14:28:15 +00:00
2020-03-30 11:44:18 +00:00
/* required import for init */
2020-08-05 14:34:39 +00:00
import "../css/load-css"
2020-07-19 16:49:00 +00:00
import "./proto" ;
import "./ui/elements/ContextDivider" ;
import "./ui/elements/Tab" ;
2020-07-20 17:08:13 +00:00
import "./connection/CommandHandler" ;
2020-08-20 22:02:05 +00:00
import "./connection/ConnectionBase" ;
2020-07-20 17:08:13 +00:00
import { ConnectRequestData } from "tc-shared/ipc/ConnectHandler" ;
2020-08-08 13:20:32 +00:00
import "./video-viewer/Controller" ;
2020-09-16 17:30:28 +00:00
import "./profiles/ConnectionProfile" ;
2020-08-22 19:20:25 +00:00
import "./update/UpdaterWeb" ;
2020-09-16 17:30:28 +00:00
import ContextMenuEvent = JQuery . ContextMenuEvent ;
import { defaultConnectProfile , findConnectProfile } from "tc-shared/profiles/ConnectionProfile" ;
2020-09-17 21:06:02 +00:00
import { spawnGlobalSettingsEditor } from "tc-shared/ui/modal/global-settings-editor/Controller" ;
2018-10-14 11:27:48 +00:00
2020-09-16 18:37:39 +00:00
let preventWelcomeUI = false ;
2020-03-29 10:54:15 +00:00
async function initialize() {
2018-12-15 12:06:41 +00:00
try {
await i18n . initialize ( ) ;
} catch ( error ) {
console . error ( tr ( "Failed to initialized the translation system!\nError: %o" ) , error ) ;
2019-08-30 21:06:39 +00:00
loader . critical_error ( "Failed to setup the translation system" ) ;
2018-12-15 12:06:41 +00:00
return ;
}
2019-04-04 19:47:52 +00:00
bipc . setup ( ) ;
}
2020-03-29 10:54:15 +00:00
async function initialize_app() {
2018-12-14 23:09:47 +00:00
try { //Initialize main template
2019-08-21 08:00:01 +00:00
const main = $ ( "#tmpl_main" ) . renderTag ( {
multi_session : ! settings . static_global ( Settings . KEY_DISABLE_MULTI_SESSION ) ,
2020-04-01 19:47:33 +00:00
app_version : __build.version
2019-08-21 08:00:01 +00:00
} ) . dividerfy ( ) ;
2019-01-19 12:16:12 +00:00
2018-12-14 23:09:47 +00:00
$ ( "body" ) . append ( main ) ;
} catch ( error ) {
2019-08-30 21:06:39 +00:00
log . error ( LogCategory . GENERAL , error ) ;
loader . critical_error ( tr ( "Failed to setup main page!" ) ) ;
2018-12-14 23:09:47 +00:00
return ;
}
2020-04-09 13:10:14 +00:00
cmanager . initialize ( ) ;
global_ev_handler . initialize ( global_client_actions ) ;
2020-04-06 14:28:15 +00:00
{
const bar = (
2020-04-06 14:29:40 +00:00
< cbar.ControlBar ref = { cbar . react_reference ( ) } multiSession = { true } / >
2020-04-06 14:28:15 +00:00
) ;
ReactDOM . render ( bar , $ ( ".container-control-bar" ) [ 0 ] ) ;
}
2020-04-09 13:10:14 +00:00
/ *
loader . register_task ( loader . Stage . JAVASCRIPT_INITIALIZING , {
name : "settings init" ,
priority : 10 ,
function : async ( ) = > global_ev_handler . load_default_states ( client_control_events )
} ) ;
* /
2019-04-04 19:47:52 +00:00
2020-03-30 11:44:18 +00:00
if ( ! aplayer . initialize ( ) )
2019-04-04 19:47:52 +00:00
console . warn ( tr ( "Failed to initialize audio controller!" ) ) ;
2020-02-09 20:42:49 +00:00
2020-03-30 11:44:18 +00:00
aplayer . on_ready ( ( ) = > {
if ( aplayer . set_master_volume )
aplayer . on_ready ( ( ) = > aplayer . set_master_volume ( settings . global ( Settings . KEY_SOUND_MASTER ) / 100 ) ) ;
2020-02-09 20:42:49 +00:00
else
2020-03-30 11:44:18 +00:00
log . warn ( LogCategory . GENERAL , tr ( "Client does not support aplayer.set_master_volume()... May client is too old?" ) ) ;
2020-02-09 20:42:49 +00:00
} ) ;
2019-04-04 19:47:52 +00:00
2020-09-07 10:42:00 +00:00
setDefaultRecorder ( new RecorderProfile ( "default" ) ) ;
defaultRecorder . initialize ( ) . catch ( error = > {
2020-02-09 20:42:49 +00:00
log . error ( LogCategory . AUDIO , tr ( "Failed to initialize default recorder: %o" ) , error ) ;
} ) ;
2019-05-20 16:57:14 +00:00
2019-04-04 19:47:52 +00:00
sound . initialize ( ) . then ( ( ) = > {
2019-08-30 21:06:39 +00:00
log . info ( LogCategory . AUDIO , tr ( "Sounds initialized" ) ) ;
2019-04-04 19:47:52 +00:00
} ) ;
2019-08-21 08:00:01 +00:00
sound . set_master_volume ( settings . global ( Settings . KEY_SOUND_MASTER_SOUNDS ) / 100 ) ;
2019-04-04 19:47:52 +00:00
2018-12-09 19:18:49 +00:00
try {
await ppt . initialize ( ) ;
} catch ( error ) {
2019-08-30 21:06:39 +00:00
log . error ( LogCategory . GENERAL , tr ( "Failed to initialize ppt!\nError: %o" ) , error ) ;
loader . critical_error ( tr ( "Failed to initialize ppt!" ) ) ;
2018-12-09 19:18:49 +00:00
return ;
}
}
2020-07-20 17:08:13 +00:00
export function handle_connect_request ( properties : ConnectRequestData , connection : ConnectionHandler ) {
2020-09-16 17:30:28 +00:00
const profile_uuid = properties . profile || ( defaultConnectProfile ( ) || { id : 'default' } ) . id ;
const profile = findConnectProfile ( profile_uuid ) || defaultConnectProfile ( ) ;
const username = properties . username || profile . connectUsername ( ) ;
2019-11-06 13:27:29 +00:00
const password = properties . password ? properties . password . value : "" ;
const password_hashed = properties . password ? properties.password.hashed : false ;
if ( profile && profile . valid ( ) ) {
2020-09-16 18:37:39 +00:00
settings . changeGlobal ( Settings . KEY_USER_IS_NEW , false ) ;
2019-11-06 13:27:29 +00:00
connection . startConnection ( properties . address , profile , true , {
nickname : username ,
password : password.length > 0 ? {
password : password ,
hashed : password_hashed
} : undefined
} ) ;
2020-04-09 13:10:14 +00:00
server_connections . set_active_connection ( connection ) ;
2019-11-06 13:27:29 +00:00
} else {
2020-03-30 11:44:18 +00:00
spawnConnectModal ( { } , {
2019-11-06 13:27:29 +00:00
url : properties.address ,
enforce : true
} , {
profile : profile ,
enforce : true
} ) ;
2019-09-18 23:25:57 +00:00
}
}
2018-12-09 19:18:49 +00:00
function main() {
2019-08-21 08:00:01 +00:00
/* initialize font */
{
2020-09-17 21:06:02 +00:00
const font = settings . static_global ( Settings . KEY_FONT_SIZE ) ;
2019-08-21 08:00:01 +00:00
$ ( document . body ) . css ( "font-size" , font + "px" ) ;
2020-09-17 21:06:02 +00:00
settings . globalChangeListener ( Settings . KEY_FONT_SIZE , value = > {
$ ( document . body ) . css ( "font-size" , value + "px" ) ;
} )
2019-08-21 08:00:01 +00:00
}
/* context menu prevent */
2020-06-12 09:04:18 +00:00
$ ( document ) . on ( 'contextmenu' , ( event : ContextMenuEvent ) = > {
2019-08-21 08:00:01 +00:00
if ( event . isDefaultPrevented ( ) )
return ;
2020-06-12 09:04:18 +00:00
if ( event . target instanceof HTMLInputElement ) {
2020-06-12 09:36:47 +00:00
if ( ( ! ! event . target . value || __build . target === "client" ) && ! event . target . disabled && ! event . target . readOnly && event . target . type !== "number" ) {
2020-06-12 09:04:18 +00:00
spawn_context_menu ( event . pageX , event . pageY , {
type : MenuEntryType . ENTRY ,
name : tr ( "Copy" ) ,
callback : ( ) = > {
copy_to_clipboard ( event . target . value ) ;
} ,
icon_class : "client-copy" ,
visible : ! ! event . target . value
} , {
type : MenuEntryType . ENTRY ,
name : tr ( "Paste" ) ,
callback : ( ) = > {
const { clipboard } = __non_webpack_require__ ( 'electron' ) ;
event . target . value = clipboard . readText ( ) ;
} ,
icon_class : "client-copy" ,
visible : __build.target === "client" ,
} ) ;
}
event . preventDefault ( ) ;
return ;
}
2019-08-21 08:00:01 +00:00
if ( ! settings . static_global ( Settings . KEY_DISABLE_GLOBAL_CONTEXT_MENU ) )
event . preventDefault ( ) ;
} ) ;
top_menu . initialize ( ) ;
2020-04-09 13:10:14 +00:00
const initial_handler = server_connections . spawn_server_connection ( ) ;
2020-08-19 17:33:57 +00:00
initial_handler . acquireInputHardware ( ) . then ( ( ) = > { } ) ;
2020-04-09 13:10:14 +00:00
cmanager . server_connections . set_active_connection ( initial_handler ) ;
2018-04-11 15:56:09 +00:00
/** Setup the XF forum identity **/
2020-03-30 11:44:18 +00:00
fidentity . update_forum ( ) ;
2020-04-10 18:57:50 +00:00
keycontrol . initialize ( ) ;
2019-02-25 14:59:42 +00:00
stats . initialize ( {
verbose : true ,
anonymize_ip_addresses : true ,
volatile_collection_only : false
} ) ;
stats . register_user_count_listener ( status = > {
2019-08-30 21:06:39 +00:00
log . info ( LogCategory . STATISTICS , tr ( "Received user count update: %o" ) , status ) ;
2019-02-25 14:59:42 +00:00
} ) ;
2019-03-25 19:04:04 +00:00
2020-04-09 13:10:14 +00:00
server_connections . set_active_connection ( server_connections . all_connections ( ) [ 0 ] ) ;
2020-08-22 19:20:25 +00:00
checkForUpdatedApp ( ) ;
2019-09-18 23:25:57 +00:00
2020-06-10 16:13:56 +00:00
( window as any ) . test_download = async ( ) = > {
const connection = server_connections . active_connection ( ) ;
const download = connection . fileManager . initializeFileDownload ( {
targetSupplier : async ( ) = > await TransferProvider . provider ( ) . createDownloadTarget ( ) ,
name : "HomeStudent2019Retail.img" ,
path : "/" ,
channel : 4
} ) ;
console . log ( "Download stated" ) ;
await download . awaitFinished ( ) ;
console . log ( "Download finished (%s)" , FileTransferState [ download . transferState ( ) ] ) ;
//console.log(await (download.target as ResponseTransferTarget).getResponse().blob());
console . log ( "Have buffer" ) ;
} ;
( window as any ) . test_upload = async ( ) = > {
const connection = server_connections . active_connection ( ) ;
const download = connection . fileManager . initializeFileUpload ( {
source : async ( ) = > await TransferProvider . provider ( ) . createTextSource ( "Hello my lovely world...." ) ,
name : "test-upload.txt" ,
path : "/" ,
channel : 4
} ) ;
console . log ( "Download stated" ) ;
await download . awaitFinished ( ) ;
console . log ( "Download finished (%s)" , FileTransferState [ download . transferState ( ) ] ) ;
//console.log(await (download.target as ResponseTransferTarget).getResponse().blob());
console . log ( "Have buffer" ) ;
} ;
2019-04-04 19:47:52 +00:00
2019-09-18 23:25:57 +00:00
/* schedule it a bit later then the main because the main function is still within the loader */
2019-08-21 08:00:01 +00:00
setTimeout ( ( ) = > {
2020-04-09 13:10:14 +00:00
const connection = server_connections . active_connection ( ) ;
2019-08-21 08:00:01 +00:00
/ *
Modals . createChannelModal ( connection , undefined , undefined , connection . permissions , ( cb , perms ) = > {
} ) ;
* /
2019-08-30 21:06:39 +00:00
// Modals.openServerInfo(connection.channelTree.server);
2019-08-21 08:00:01 +00:00
//Modals.createServerModal(connection.channelTree.server, properties => Promise.resolve());
2019-09-12 21:59:35 +00:00
//Modals.openClientInfo(connection.getClient());
//Modals.openServerInfoBandwidth(connection.channelTree.server);
2019-09-18 23:25:57 +00:00
//Modals.openBanList(connection);
/ *
Modals . spawnBanClient ( connection , [
{ name : "WolverinDEV" , unique_id : "XXXX" } ,
{ name : "WolverinDEV" , unique_id : "XXXX" } ,
{ name : "WolverinDEV" , unique_id : "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" } ,
{ name : "WolverinDEV" , unique_id : "YYY" }
] , ( ) = > { } ) ;
* /
2019-09-12 21:59:35 +00:00
} , 4000 ) ;
2020-04-10 19:08:41 +00:00
//spawnSettingsModal("general-keymap");
2019-08-21 08:00:01 +00:00
//Modals.spawnKeySelect(console.log);
2019-09-12 21:59:35 +00:00
//Modals.spawnBookmarkModal();
/ *
{
const modal = createModal ( {
header : tr ( "Test Net Graph" ) ,
body : ( ) = > {
const canvas = $ . spawn ( "canvas" )
. css ( "position" , "absolute" )
. css ( {
top : 0 ,
bottom : 0 ,
right : 0 ,
left : 0
} ) ;
return $ . spawn ( "div" )
. css ( "height" , "5em" )
. css ( "width" , "30em" )
. css ( "position" , "relative" )
. append ( canvas ) ;
} ,
footer : null
} ) ;
const graph = new net . graph . Graph ( modal . htmlTag . find ( "canvas" ) [ 0 ] as any ) ;
graph . initialize ( ) ;
modal . close_listener . push ( ( ) = > graph . terminate ( ) ) ;
modal . open ( ) ;
}
* /
2020-06-15 14:56:05 +00:00
//setTimeout(() => spawnPermissionEditorModal(server_connections.active_connection()), 3000);
//setTimeout(() => spawnGroupCreate(server_connections.active_connection(), "server"), 3000);
2020-03-27 15:15:15 +00:00
2020-09-16 18:37:39 +00:00
if ( settings . static_global ( Settings . KEY_USER_IS_NEW ) && ! preventWelcomeUI ) {
const modal = openModalNewcomer ( ) ;
modal . close_listener . push ( ( ) = > settings . changeGlobal ( Settings . KEY_USER_IS_NEW , false ) ) ;
2020-03-27 15:15:15 +00:00
}
2020-06-10 16:13:56 +00:00
2020-09-17 21:06:02 +00:00
spawnGlobalSettingsEditor ( ) ;
2020-08-07 11:40:11 +00:00
//spawnVideoPopout(server_connections.active_connection(), "https://www.youtube.com/watch?v=9683D18fyvs");
2018-04-19 16:42:34 +00:00
}
2019-04-04 19:47:52 +00:00
const task_teaweb_starter : loader.Task = {
name : "voice app starter" ,
2018-12-30 00:38:13 +00:00
function : async ( ) = > {
try {
2019-04-04 19:47:52 +00:00
await initialize_app ( ) ;
2018-12-30 00:38:13 +00:00
main ( ) ;
2020-03-30 11:44:18 +00:00
if ( ! aplayer . initialized ( ) ) {
2018-12-30 00:38:13 +00:00
log . info ( LogCategory . VOICE , tr ( "Initialize audio controller later!" ) ) ;
2020-03-30 11:44:18 +00:00
if ( ! aplayer . initializeFromGesture ) {
console . error ( tr ( "Missing aplayer.initializeFromGesture" ) ) ;
2018-12-30 00:38:13 +00:00
} else
2020-08-13 11:05:37 +00:00
$ ( document ) . one ( 'click' , ( ) = > aplayer . initializeFromGesture ( ) ) ;
2018-12-30 00:38:13 +00:00
}
} catch ( ex ) {
console . error ( ex . stack ) ;
if ( ex instanceof ReferenceError || ex instanceof TypeError )
ex = ex . name + ": " + ex . message ;
2019-08-30 21:06:39 +00:00
loader . critical_error ( "Failed to invoke main function:<br>" + ex ) ;
2018-09-25 15:39:38 +00:00
}
2018-12-30 00:38:13 +00:00
} ,
priority : 10
2019-04-04 19:47:52 +00:00
} ;
2019-11-06 13:27:29 +00:00
const task_connect_handler : loader.Task = {
name : "Connect handler" ,
function : async ( ) = > {
const address = settings . static ( Settings . KEY_CONNECT_ADDRESS , "" ) ;
2020-07-20 17:08:13 +00:00
const chandler = bipc . getInstanceConnectHandler ( ) ;
2019-11-06 13:27:29 +00:00
if ( settings . static ( Settings . KEY_FLAG_CONNECT_DEFAULT , false ) && address ) {
const connect_data = {
address : address ,
profile : settings.static ( Settings . KEY_CONNECT_PROFILE , "" ) ,
username : settings.static ( Settings . KEY_CONNECT_USERNAME , "" ) ,
password : {
value : settings.static ( Settings . KEY_CONNECT_PASSWORD , "" ) ,
hashed : settings.static ( Settings . KEY_FLAG_CONNECT_PASSWORD , false )
}
} ;
2020-06-15 14:56:05 +00:00
if ( chandler && ! settings . static ( Settings . KEY_CONNECT_NO_SINGLE_INSTANCE ) ) {
2019-11-06 13:27:29 +00:00
try {
await chandler . post_connect_request ( connect_data , ( ) = > new Promise < boolean > ( ( resolve , reject ) = > {
spawnYesNo ( tr ( "Another TeaWeb instance is already running" ) , tra ( "Another TeaWeb instance is already running.{:br:}Would you like to connect there?" ) , response = > {
resolve ( response ) ;
} , {
closeable : false
} ) . open ( ) ;
} ) ) ;
log . info ( LogCategory . CLIENT , tr ( "Executed connect successfully in another browser window. Closing this window" ) ) ;
const message =
"You're connecting to {0} within the other TeaWeb instance.{:br:}" +
"You could now close this page." ;
createInfoModal (
tr ( "Connecting successfully within other instance" ) ,
2020-03-31 13:19:53 +00:00
formatMessage ( /* @tr-ignore */ tr ( message ) , connect_data . address ) ,
2019-11-06 13:27:29 +00:00
{
closeable : false ,
footer : undefined
}
) . open ( ) ;
return ;
} catch ( error ) {
log . info ( LogCategory . CLIENT , tr ( "Failed to execute connect within other TeaWeb instance. Using this one. Error: %o" ) , error ) ;
}
}
2020-09-16 18:37:39 +00:00
preventWelcomeUI = true ;
2019-11-06 13:27:29 +00:00
loader . register_task ( loader . Stage . LOADED , {
priority : 0 ,
2020-04-09 13:10:14 +00:00
function : async ( ) = > handle_connect_request ( connect_data , server_connections . active_connection ( ) || server_connections . spawn_server_connection ( ) ) ,
2019-11-06 13:27:29 +00:00
name : tr ( "default url connect" )
} ) ;
}
if ( chandler ) {
/* no instance avail, so lets make us avail */
chandler . callback_available = data = > {
return ! settings . static_global ( Settings . KEY_DISABLE_MULTI_SESSION ) ;
} ;
chandler . callback_execute = data = > {
2020-09-16 18:37:39 +00:00
preventWelcomeUI = true ;
2020-04-09 13:10:14 +00:00
handle_connect_request ( data , server_connections . spawn_server_connection ( ) ) ;
2019-11-06 13:27:29 +00:00
return true ;
}
}
loader . register_task ( loader . Stage . LOADED , task_teaweb_starter ) ;
} ,
priority : 10
} ;
2019-04-04 19:47:52 +00:00
const task_certificate_callback : loader.Task = {
name : "certificate accept tester" ,
function : async ( ) = > {
2020-08-05 16:48:27 +00:00
/ *
This is not needed any more . If we would use the certificate accept stuff , we would have an extra loader target .
I 'm just keeping this, so later I' ve not to to any work , writing this , again .
2019-04-04 19:47:52 +00:00
const certificate_accept = settings . static_global ( Settings . KEY_CERTIFICATE_CALLBACK , undefined ) ;
if ( certificate_accept ) {
log . info ( LogCategory . IPC , tr ( "Using this instance as certificate callback. ID: %s" ) , certificate_accept ) ;
try {
try {
2020-07-20 17:08:13 +00:00
await bipc . getInstance ( ) . post_certificate_accpected ( certificate_accept ) ;
2019-04-04 19:47:52 +00:00
} catch ( e ) { } //FIXME remove!
log . info ( LogCategory . IPC , tr ( "Other instance has acknowledged out work. Closing this window." ) ) ;
const seconds_tag = $ . spawn ( "a" ) ;
let seconds = 5 ;
let interval_id ;
interval_id = setInterval ( ( ) = > {
seconds -- ;
seconds_tag . text ( seconds . toString ( ) ) ;
if ( seconds <= 0 ) {
clearTimeout ( interval_id ) ;
log . info ( LogCategory . GENERAL , tr ( "Closing window" ) ) ;
window . close ( ) ;
return ;
}
} , 1000 ) ;
createInfoModal (
tr ( "Certificate acccepted successfully" ) ,
2020-08-05 16:48:27 +00:00
formatMessage ( tr ( "You've successfully accepted the certificate.{:br:}This page will close in {0} seconds." ) , seconds_tag ) ,
2019-04-04 19:47:52 +00:00
{
closeable : false ,
footer : undefined
}
) . open ( ) ;
return ;
} catch ( error ) {
log . warn ( LogCategory . IPC , tr ( "Failed to successfully post certificate accept status: %o" ) , error ) ;
}
} else {
log . info ( LogCategory . IPC , tr ( "We're not used to accept certificated. Booting app." ) ) ;
}
2020-08-05 16:48:27 +00:00
* /
2019-11-06 13:27:29 +00:00
loader . register_task ( loader . Stage . LOADED , task_connect_handler ) ;
2019-04-04 19:47:52 +00:00
} ,
priority : 10
} ;
2019-04-25 18:22:13 +00:00
loader . register_task ( loader . Stage . JAVASCRIPT_INITIALIZING , {
name : "jrendere initialize" ,
function : async ( ) = > {
try {
2020-08-23 08:48:15 +00:00
if ( ! setupJSRender ( ) )
2019-04-25 18:22:13 +00:00
throw "invalid load" ;
} catch ( error ) {
2019-08-30 21:06:39 +00:00
loader . critical_error ( tr ( "Failed to setup jsrender" ) ) ;
2019-04-25 18:22:13 +00:00
console . error ( tr ( "Failed to load jsrender! %o" ) , error ) ;
return ;
}
} ,
priority : 100
2019-05-20 17:28:20 +00:00
} ) ;
2019-04-25 18:22:13 +00:00
2019-05-20 17:28:20 +00:00
loader . register_task ( loader . Stage . JAVASCRIPT_INITIALIZING , {
2019-04-04 19:47:52 +00:00
name : "app starter" ,
function : async ( ) = > {
try {
await initialize ( ) ;
2020-04-01 19:47:33 +00:00
if ( __build . target == "web" ) {
2019-04-04 19:47:52 +00:00
loader . register_task ( loader . Stage . LOADED , task_certificate_callback ) ;
2019-11-06 13:27:29 +00:00
} else {
2019-04-04 19:47:52 +00:00
loader . register_task ( loader . Stage . LOADED , task_teaweb_starter ) ;
2019-11-06 13:27:29 +00:00
}
2019-04-04 19:47:52 +00:00
} catch ( ex ) {
2019-05-21 17:11:53 +00:00
if ( ex instanceof Error || typeof ( ex . stack ) !== "undefined" )
console . error ( ( tr || ( msg = > msg ) ) ( "Critical error stack trace: %o" ) , ex . stack ) ;
2019-04-04 19:47:52 +00:00
if ( ex instanceof ReferenceError || ex instanceof TypeError )
ex = ex . name + ": " + ex . message ;
2019-08-30 21:06:39 +00:00
loader . critical_error ( "Failed to boot app function:<br>" + ex ) ;
2019-04-04 19:47:52 +00:00
}
} ,
2019-05-24 20:30:58 +00:00
priority : 1000
2018-10-06 13:13:45 +00:00
} ) ;
2018-12-30 00:38:13 +00:00
2020-03-30 11:44:18 +00:00
loader . register_task ( loader . Stage . LOADED , {
name : "error task" ,
function : async ( ) = > {
if ( Settings . instance . static ( Settings . KEY_LOAD_DUMMY_ERROR , false ) ) {
loader . critical_error ( "The tea is cold!" , "Argh, this is evil! Cold tea dosn't taste good." ) ;
throw "The tea is cold!" ;
}
} ,
priority : 20
2020-04-01 13:40:45 +00:00
} ) ;