main.ts 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import {config as appConfig, state} from "./state";
  2. import {Command, HttpSession, is_http_backend, Session, WebSocketSession} from "./session";
  3. import {InputHandler} from "./handlers/input"
  4. import {OutputHandler} from "./handlers/output"
  5. import {DisplayAreaButtonOnClick} from "./models/output"
  6. import {CloseHandler, CommandDispatcher} from "./handlers/base"
  7. import {PopupHandler} from "./handlers/popup";
  8. // 获取后端API地址
  9. function get_backend_addr() {
  10. const url = new URLSearchParams(window.location.search);
  11. let uri = url.get('pywebio_api') || './io';
  12. return new URL(uri, window.location.href).href;
  13. }
  14. // 初始化Handler和Session
  15. function set_up_session(webio_session: Session, output_container_elem: JQuery, input_container_elem: JQuery) {
  16. state.CurrentSession = webio_session;
  17. webio_session.on_session_close(function () {
  18. $('#favicon32').attr('href', 'data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAByElEQVRYR82XLUzDUBDH/9emYoouYHAYMGCAYJAYEhxiW2EOSOYwkKBQKBIwuIUPN2g7gSPBIDF8GWbA4DAjG2qitEfesi6lbGxlXd5q393/fr333t07QpdfPp8f0nV9CcACEU0DGAOgN9yrAN6Y+QnATbVavcrlcp/dSFMnI9M0J1RV3WHmFQCJTvaN9RoRXbiuu28YxstfPm0BbNtOMPMeEW0C0LoMHDZzmPmIiHbT6XStlUZLgEKhMK5p2iWAyX8GDruVHMdZzmazr+GFXwCmac4oinINYCSm4L5M2fO8RcMwHoO6PwAaf37bh+BNCMdx5oOZaAKIPQdwF2Pa2yWwBGDOPxNNAMuyDohoK+a0t5Rj5sNMJrMtFusA4qopivLcw2mPyu14njclrmgdoFgsnjLzWlSVXuyJ6CyVSq2TqHDJZPI9QpHpJW7Qt1apVEbJsqwVIjqPSzWKDjOvCoBjItqI4hiXLTOfkG3b9wBm4xKNqPMgAMoAhiM6xmX+IQC+AKhxKUbUcQcCQPoWyD2E0q+h9EIkvRRLb0YD0Y4FhNQHiQCQ/iQTEFIfpX4Nl/os9yGkDiY+hNTRLNhSpQ2n4b7er/H8G7N6BRSbHvW5AAAAAElFTkSuQmCC');
  19. $('#favicon16').attr('href', 'data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA0ElEQVQ4T62TPQrCQBCF30tA8BZW9mJtY+MNEtKr2HkWK0Xtw+4NbGysxVorbyEKyZMNRiSgmJ/tZufNNzO7M0ThxHHc8zxvSnIIoPNyXyXt0zRdR1F0+gxhblhr25IWJMcA3vcFviRtSc6DILg5XyZ0wQB2AAbFir7YBwAjB8kAxpg1ycmfwZlM0iYMwyldz77vH3+U/Y2rJEn6NMYsSc7KZM+1kla01p4BdKsAAFwc4A6gVRHwaARQr4Xaj1j7G2sPUiOjnEMqL9PnDJRd5ycpJXsd2f2NIAAAAABJRU5ErkJggg==');
  20. });
  21. let output_ctrl = new OutputHandler(webio_session, output_container_elem);
  22. let input_ctrl = new InputHandler(webio_session, input_container_elem);
  23. let popup_ctrl = new PopupHandler(webio_session);
  24. let close_ctrl = new CloseHandler(webio_session);
  25. let dispatcher = new CommandDispatcher(output_ctrl, input_ctrl, popup_ctrl, close_ctrl);
  26. webio_session.on_server_message((msg: Command) => {
  27. let ok = dispatcher.dispatch_message(msg);
  28. if (!ok)
  29. console.error('Unknown command:%s', msg.command);
  30. });
  31. }
  32. function startWebIOClient(output_container_elem: JQuery, input_container_elem: JQuery, config: { [name: string]: any }) {
  33. for (let key in config) {
  34. // @ts-ignore
  35. appConfig[key] = config[key];
  36. }
  37. const backend_addr = get_backend_addr();
  38. is_http_backend(backend_addr).then(function (http_backend) {
  39. let session;
  40. if (http_backend)
  41. session = new HttpSession(backend_addr, appConfig.httpPullInterval);
  42. else
  43. session = new WebSocketSession(backend_addr);
  44. set_up_session(session, output_container_elem, input_container_elem);
  45. session.start_session(appConfig.debug);
  46. });
  47. }
  48. // @ts-ignore
  49. window.WebIO = {
  50. 'startWebIOClient': startWebIOClient,
  51. 'DisplayAreaButtonOnClick': DisplayAreaButtonOnClick,
  52. };