main.ts 5.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import {config as appConfig, state} from "./state";
  2. import {Command, HttpSession, is_http_backend, Session, WebSocketSession, pushData} from "./session";
  3. import {InputHandler} from "./handlers/input"
  4. import {OutputHandler} from "./handlers/output"
  5. import {CommandDispatcher, SessionCtrlHandler} from "./handlers/base"
  6. import {PopupHandler} from "./handlers/popup";
  7. import {openApp} from "./utils";
  8. import {ScriptHandler} from "./handlers/script";
  9. import {DownloadHandler} from "./handlers/download";
  10. import {ToastHandler} from "./handlers/toast";
  11. import {EnvSettingHandler} from "./handlers/env";
  12. import {PinHandler} from "./handlers/pin";
  13. import {customMessage} from "./i18n"
  14. // 获取后端API的绝对地址
  15. function backend_absaddr(addr: string) {
  16. return new URL(addr, window.location.href).href;
  17. }
  18. // 初始化Handler和Session
  19. function set_up_session(webio_session: Session, output_container_elem: JQuery, input_container_elem: JQuery) {
  20. state.CurrentSession = webio_session;
  21. $('#pywebio-loading').show();
  22. webio_session.on_session_create(function () {
  23. $('#pywebio-loading').hide();
  24. $('#favicon32').attr('href', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAwklEQVQ4T63TvU5CQRCG4WcwMfEuqOgNtQ2Nd4CxV2LHtVhJ0N7AHdjQUBtrrLwLA4ks2Rx+/Qucw3Y78807M7sz4ft5dq6mI7RQX7o/JCNzfdfetkNifRk6k9wLN9jYdxMkyZPQ1faZXYUwB/OCix8V/W4Y4zJDCsBAX7jdM7iQJY+udELu+cTrP2X/xU2+NMPAg3B3UPaVOOmFoQkapQC8Z8AUpyUBs6MAKrZQ+RErf2PlQTrKKK8gpZdpewgOXOcFTTxEjYwMoIkAAAAASUVORK5CYII=');
  25. $('#favicon16').attr('href', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABmUlEQVRYR82XK0wDQRCGv21TUUUJGBwGDBggGCSGBIcAWnBAgsNAgkKhSMDgCA8HtEXgSDBIDC9DDRgcpoSiKo52yea49DiutMttsz27M/98N7s7OyNo9tujgxSTwDiCIaAXSH27l4AXJA/AFSUuWOajGWnR0ChLP3HWkWSAZEN716CM4JQKW6R5+sunPkCeJJJNBCtAosnAQTMHyS6CDWYoh2mEAxzTR4JzYOCfgYNuBRymmOc5uPAbIMswMS6BbkPBPZkiVSZIc+/X/Qng/vl1C4LXIBzG/JmoAag9hxuDaa+XwAIw6p2JGkCObQSrhtMeLifZYZY1tegCqKsW4zHCadfldqgyqK6oC3DGIZIFXZVI9oIjplkUqArXyatGkYkU1+dc5p0eQY4MghNTqlo6kjkFsI9gScvRlLHkQJDnFhgxpampc6cAikCXpqMp8zcF8AnETSlq6lTaAsD6Flg+hNavofVCZL0UW3+M2uI5VhBWGxIFYL0lUxBWm1KviFttyz0Iq4OJB2F1NPO/qdaG0+DD3qLx/AuMVJFhmC8dSgAAAABJRU5ErkJggg==');
  26. });
  27. webio_session.on_session_close(function () {
  28. $('#favicon32').attr('href', 'data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAByElEQVRYR82XLUzDUBDH/9emYoouYHAYMGCAYJAYEhxiW2EOSOYwkKBQKBIwuIUPN2g7gSPBIDF8GWbA4DAjG2qitEfesi6lbGxlXd5q393/fr333t07QpdfPp8f0nV9CcACEU0DGAOgN9yrAN6Y+QnATbVavcrlcp/dSFMnI9M0J1RV3WHmFQCJTvaN9RoRXbiuu28YxstfPm0BbNtOMPMeEW0C0LoMHDZzmPmIiHbT6XStlUZLgEKhMK5p2iWAyX8GDruVHMdZzmazr+GFXwCmac4oinINYCSm4L5M2fO8RcMwHoO6PwAaf37bh+BNCMdx5oOZaAKIPQdwF2Pa2yWwBGDOPxNNAMuyDohoK+a0t5Rj5sNMJrMtFusA4qopivLcw2mPyu14njclrmgdoFgsnjLzWlSVXuyJ6CyVSq2TqHDJZPI9QpHpJW7Qt1apVEbJsqwVIjqPSzWKDjOvCoBjItqI4hiXLTOfkG3b9wBm4xKNqPMgAMoAhiM6xmX+IQC+AKhxKUbUcQcCQPoWyD2E0q+h9EIkvRRLb0YD0Y4FhNQHiQCQ/iQTEFIfpX4Nl/os9yGkDiY+hNTRLNhSpQ2n4b7er/H8G7N6BRSbHvW5AAAAAElFTkSuQmCC');
  29. $('#favicon16').attr('href', 'data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA0ElEQVQ4T62TPQrCQBCF30tA8BZW9mJtY+MNEtKr2HkWK0Xtw+4NbGysxVorbyEKyZMNRiSgmJ/tZufNNzO7M0ThxHHc8zxvSnIIoPNyXyXt0zRdR1F0+gxhblhr25IWJMcA3vcFviRtSc6DILg5XyZ0wQB2AAbFir7YBwAjB8kAxpg1ycmfwZlM0iYMwyldz77vH3+U/Y2rJEn6NMYsSc7KZM+1kla01p4BdKsAAFwc4A6gVRHwaARQr4Xaj1j7G2sPUiOjnEMqL9PnDJRd5ycpJXsd2f2NIAAAAABJRU5ErkJggg==');
  30. });
  31. let output_ctrl = new OutputHandler(webio_session, output_container_elem);
  32. let input_ctrl = new InputHandler(webio_session, input_container_elem);
  33. let popup_ctrl = new PopupHandler(webio_session);
  34. let session_ctrl = new SessionCtrlHandler(webio_session);
  35. let script_ctrl = new ScriptHandler(webio_session);
  36. let pin_ctrl = new PinHandler(webio_session);
  37. let download_ctrl = new DownloadHandler();
  38. let toast_ctrl = new ToastHandler();
  39. let env_ctrl = new EnvSettingHandler();
  40. let dispatcher = new CommandDispatcher(output_ctrl, input_ctrl, popup_ctrl, session_ctrl,
  41. script_ctrl, download_ctrl, toast_ctrl, env_ctrl, pin_ctrl);
  42. webio_session.on_server_message((msg: Command) => {
  43. try {
  44. let ok = dispatcher.dispatch_message(msg);
  45. if (!ok) console.error('Unknown command:%s', msg.command);
  46. } catch (e) {
  47. console.error('Error(%s) in dispatch command: %s', e, msg.command);
  48. }
  49. });
  50. }
  51. function startWebIOClient(options: {
  52. output_container_elem: JQuery,
  53. input_container_elem: JQuery,
  54. backend_address: string,
  55. app_name: string,
  56. protocol: string, // 'http', 'ws', 'auto'
  57. runtime_config: { [name: string]: any }
  58. }) {
  59. for (let key in options.runtime_config) {
  60. // @ts-ignore
  61. appConfig[key] = options.runtime_config[key];
  62. }
  63. const backend_addr = backend_absaddr(options.backend_address);
  64. let start_session = (is_http: boolean) => {
  65. let session;
  66. if (is_http)
  67. session = new HttpSession(backend_addr, options.app_name, appConfig.httpPullInterval);
  68. else
  69. session = new WebSocketSession(backend_addr, options.app_name);
  70. set_up_session(session, options.output_container_elem, options.input_container_elem);
  71. session.start_session(appConfig.debug);
  72. };
  73. if (options.protocol == 'auto')
  74. is_http_backend(backend_addr).then(start_session);
  75. else
  76. start_session(options.protocol == 'http')
  77. }
  78. // @ts-ignore
  79. window.WebIO = {
  80. '_state': state,
  81. 'startWebIOClient': startWebIOClient,
  82. 'openApp': openApp,
  83. 'message_tpl': customMessage,
  84. 'pushData': pushData,
  85. };