funcnodes-react-flow 0.2.0__py3-none-any.whl → 0.2.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. funcnodes_react_flow/run.py +9 -151
  2. funcnodes_react_flow/{asset-manifest.json → static/asset-manifest.json} +1 -1
  3. funcnodes_react_flow/{css → static/css}/style.css +1 -1
  4. funcnodes_react_flow/static/index.html +1 -0
  5. funcnodes_react_flow/{js → static/js}/830.js +1 -1
  6. funcnodes_react_flow/static/js/main.js +2 -0
  7. funcnodes_react_flow/{js → static/js}/main.js.LICENSE.txt +308 -0
  8. {funcnodes_react_flow-0.2.0.dist-info → funcnodes_react_flow-0.2.2.dist-info}/METADATA +2 -2
  9. funcnodes_react_flow-0.2.2.dist-info/RECORD +26 -0
  10. funcnodes_react_flow/index.html +0 -1
  11. funcnodes_react_flow/js/main.js +0 -2
  12. funcnodes_react_flow-0.2.0.dist-info/RECORD +0 -26
  13. /funcnodes_react_flow/{android-chrome-192x192.png → static/android-chrome-192x192.png} +0 -0
  14. /funcnodes_react_flow/{android-chrome-512x512.png → static/android-chrome-512x512.png} +0 -0
  15. /funcnodes_react_flow/{apple-touch-icon.png → static/apple-touch-icon.png} +0 -0
  16. /funcnodes_react_flow/{favicon-16x16.png → static/favicon-16x16.png} +0 -0
  17. /funcnodes_react_flow/{favicon-32x32.png → static/favicon-32x32.png} +0 -0
  18. /funcnodes_react_flow/{favicon.ico → static/favicon.ico} +0 -0
  19. /funcnodes_react_flow/{js → static/js}/830.js.LICENSE.txt +0 -0
  20. /funcnodes_react_flow/{logo.png → static/logo.png} +0 -0
  21. /funcnodes_react_flow/{logo192.png → static/logo192.png} +0 -0
  22. /funcnodes_react_flow/{logo512.png → static/logo512.png} +0 -0
  23. /funcnodes_react_flow/{manifest.json → static/manifest.json} +0 -0
  24. /funcnodes_react_flow/{robots.txt → static/robots.txt} +0 -0
  25. {funcnodes_react_flow-0.2.0.dist-info → funcnodes_react_flow-0.2.2.dist-info}/LICENSE +0 -0
  26. {funcnodes_react_flow-0.2.0.dist-info → funcnodes_react_flow-0.2.2.dist-info}/WHEEL +0 -0
  27. {funcnodes_react_flow-0.2.0.dist-info → funcnodes_react_flow-0.2.2.dist-info}/entry_points.txt +0 -0
@@ -1,157 +1,15 @@
1
- from typing import Optional
2
- import http.server
3
- import socketserver
4
- import webbrowser
5
1
  import os
6
- import time
7
- import threading
8
- import asyncio
9
- import funcnodes as fn
10
- import websockets
2
+ from funcnodes.runner import BaseServer
11
3
 
12
- PORT = 8029
13
4
 
5
+ class FuncnodesreactflowServer(BaseServer):
6
+ STATIC_PATH = os.path.join(os.path.dirname(__file__), "static")
7
+ STATIC_URL = "/static"
14
8
 
15
- class CustomHTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
16
- def do_GET(self):
17
- if self.path == "/worker_manager":
18
- self.get_worker_manager()
19
- else:
20
- # Call the superclass method to handle standard requests
21
- super().do_GET()
9
+ async def index(self, request):
10
+ request.match_info["filename"] = "index.html"
11
+ return await self.serve_static_file(request)
22
12
 
23
- def do_POST(self):
24
- if self.path == "/custom-post":
25
- self.handle_custom_post()
26
- else:
27
- # Send a 405 Method Not Allowed response for unsupported endpoints
28
- self.send_error(405, "Method Not Allowed")
29
13
 
30
- def get_worker_manager(self):
31
- # Implement custom GET handling logic here
32
- if self.server.start_worker_manager:
33
- asyncio.run(
34
- fn.worker.worker_manager.assert_worker_manager_running(
35
- host=self.server.worker_manager_host,
36
- port=self.server.worker_manager_port,
37
- ssl=self.server.worker_manager_ssl,
38
- )
39
- )
40
- self.send_response(200)
41
- self.send_header("Content-type", "text/json")
42
- self.end_headers()
43
- self.wfile.write(
44
- (
45
- f"ws{'s' if self.server.worker_manager_ssl else ''}://"
46
- f"{self.server.worker_manager_host}:{self.server.worker_manager_port}"
47
- ).encode("utf-8")
48
- )
49
-
50
- def handle_custom_post(self):
51
- # Implement custom POST handling logic here
52
- content_length = int(self.headers["Content-Length"])
53
- post_data = self.rfile.read(content_length)
54
-
55
- self.send_response(200)
56
- self.send_header("Content-type", "text/html")
57
- self.end_headers()
58
- response = f"Received POST data: {post_data.decode('utf-8')}"
59
- self.wfile.write(response.encode("utf-8"))
60
-
61
-
62
- class GracefulHTTPServer(socketserver.TCPServer):
63
- allow_reuse_address = False
64
- timeout = 5
65
-
66
- def __init__(
67
- self,
68
- server_address,
69
- RequestHandlerClass,
70
- bind_and_activate=True,
71
- worker_manager_host: Optional[str] = None,
72
- worker_manager_port: Optional[int] = None,
73
- worker_manager_ssl: Optional[bool] = None,
74
- start_worker_manager=True,
75
- ):
76
- if worker_manager_host is None:
77
- worker_manager_host = fn.config.CONFIG["worker_manager"]["host"]
78
-
79
- if worker_manager_port is None:
80
- worker_manager_port = fn.config.CONFIG["worker_manager"]["port"]
81
-
82
- if worker_manager_ssl is None:
83
- worker_manager_ssl = fn.config.CONFIG["worker_manager"].get("ssl", False)
84
-
85
- self.start_worker_manager = start_worker_manager
86
- self.worker_manager_ssl = worker_manager_ssl
87
- self.worker_manager_host = worker_manager_host
88
- self.worker_manager_port = worker_manager_port
89
- super().__init__(server_address, RequestHandlerClass, bind_and_activate)
90
- self._is_serving = True
91
-
92
- def serve_forever(self):
93
- while self._is_serving:
94
- self.handle_request()
95
-
96
- def shutdown(self):
97
- self._is_serving = False
98
-
99
-
100
- def _open_browser(port, delay=1.0):
101
- time.sleep(delay)
102
- webbrowser.open(f"http://localhost:{port}")
103
-
104
-
105
- async def websocket_handler(websocket, path):
106
- async for message in websocket:
107
- print(f"Received WebSocket message: {message}")
108
- await websocket.send(f"Echo: {message}")
109
-
110
-
111
- def start_websocket_server(port):
112
- asyncio.set_event_loop(asyncio.new_event_loop())
113
- start_server = websockets.serve(websocket_handler, "localhost", port)
114
- asyncio.get_event_loop().run_until_complete(start_server)
115
- asyncio.get_event_loop().run_forever()
116
-
117
-
118
- def run_server(
119
- port=PORT,
120
- open_browser=True,
121
- worker_manager_host: Optional[str] = None,
122
- worker_manager_port: Optional[int] = None,
123
- worker_manager_ssl: Optional[bool] = None,
124
- start_worker_manager=True,
125
- ):
126
- if start_worker_manager:
127
- asyncio.run(
128
- fn.worker.worker_manager.assert_worker_manager_running(
129
- host=worker_manager_host,
130
- port=worker_manager_port,
131
- ssl=worker_manager_ssl,
132
- )
133
- )
134
- try:
135
- script_directory = os.path.dirname(os.path.abspath(__file__))
136
- os.chdir(script_directory)
137
- httpd = GracefulHTTPServer(
138
- ("", port),
139
- CustomHTTPRequestHandler,
140
- worker_manager_host=worker_manager_host,
141
- worker_manager_port=worker_manager_port,
142
- worker_manager_ssl=worker_manager_ssl,
143
- start_worker_manager=start_worker_manager,
144
- )
145
- print(f"Serving at port {port}")
146
- if open_browser:
147
- threading.Thread(target=_open_browser, args=(port,), daemon=True).start()
148
- httpd.serve_forever()
149
- except KeyboardInterrupt:
150
- if httpd._is_serving:
151
- print("Stopping server...")
152
- httpd.shutdown()
153
- print("Server has been stopped.")
154
- else:
155
- raise
156
- except OSError as e:
157
- print(f"Could not start server at port {port}: {e}")
14
+ def run_server(**kwargs):
15
+ return FuncnodesreactflowServer.run_server(**kwargs)
@@ -18,4 +18,4 @@
18
18
  "static/css/main.b07f411f.css",
19
19
  "static/js/main.37cf4e32.js"
20
20
  ]
21
- }
21
+ }
@@ -1,7 +1,7 @@
1
1
  body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;margin:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}
2
2
  /*!*******************************************************************************************************************************************************************************************************************************!*\
3
3
  !*** css ../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!../node_modules/sass-loader/dist/cjs.js!./src/frontend/header/header.scss ***!
4
- \*******************************************************************************************************************************************************************************************************************************/.funcnodesreactflowheader{display:flex;flex-direction:row;height:50px;justify-content:flex-start;left:0;position:relative;top:0}.funcnodesreactflowheader .headerelement{align-items:center;display:flex;height:100%;margin:4px;position:relative;white-space:nowrap}.funcnodesreactflowheader .statusbar{background-color:var(--funcnodesbackground2);border-radius:.5rem;display:inline-block;height:1.5rem;margin:2px 4px 0;overflow:hidden;position:relative;width:250px}.funcnodesreactflowheader .statusbar-progressbar{background-color:var(--funheadercolor);display:inline-block;height:100%;left:0;position:absolute;top:0;width:0}.funcnodesreactflowheader .statusbar-message{color:var(--funheadercolor);font-size:.8rem;left:0;mix-blend-mode:difference;position:relative;top:0}
4
+ \*******************************************************************************************************************************************************************************************************************************/.basicstyleelement,.headermenucontent,.styled-select__menu,.styledbtn,.styledcheckbox,.styleddropdown,.styledinput,.styleelement{background-color:var(--funcnodesbackground1);border:1px solid var(--funheadercolor);border-radius:.75rem;color:var(--funcnodestextcolor1)}.funcnodesreactflowheader{display:flex;flex-direction:row;height:50px;justify-content:flex-start;left:0;position:relative;top:0;z-index:1000}.funcnodesreactflowheader .headerelement{align-items:center;display:flex;height:100%;margin:4px;position:relative;white-space:nowrap}.funcnodesreactflowheader .statusbar{background-color:var(--funcnodesbackground2);border-radius:.5rem;display:inline-block;height:1.5rem;margin:2px 4px 0;overflow:hidden;position:relative;width:250px}.funcnodesreactflowheader .statusbar-progressbar{background-color:var(--funheadercolor);display:inline-block;height:100%;left:0;position:absolute;top:0;width:0}.funcnodesreactflowheader .statusbar-message{color:var(--funheadercolor);font-size:.8rem;left:0;mix-blend-mode:difference;position:relative;top:0}.headermenucontent{border-radius:.25rem;max-height:90vh;overflow:auto;padding:5px}.headermenuitem{padding:0 5px}.headermenuitem[data-highlighted],.headermenuitem[data-state=checked],.headermenuitem[data-state=open]{background-color:var(--funcnodesbackground_light)}.headermenuitem[data-state=checked]{color:#fff}
5
5
  /*!************************************************************************************************************************************************************************************************************************!*\
6
6
  !*** css ../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!../node_modules/sass-loader/dist/cjs.js!./src/frontend/dialog.scss ***!
7
7
  \************************************************************************************************************************************************************************************************************************/.dialogoverlay{animation:overlayShow .15s cubic-bezier(.16,1,.3,1);background-color:rgba(0,0,0,.5);inset:0;position:fixed}.dialogconent{animation:contentShow .15s cubic-bezier(.16,1,.3,1);background-color:var(--funcnodesbackground1);border:1px solid var(--funheadercolor);border-radius:6px;box-shadow:var(--funheadercolor) 0 10px 38px -10px,var(--funheadercolor) 0 10px 20px -15px;color:var(--funcnodestextcolor1);display:flex;flex-direction:column;left:50%;max-height:85vh;max-width:85vw;padding:25px;position:fixed;top:50%;transform:translate(-50%,-50%);width:90vw}.dialogtitle{color:var(--funheadercolor);font-size:17px;font-weight:500;margin:0}.dialogdescription{font-size:15px;line-height:1.5;margin:10px 0 20px}.dialogclosebutton{align-items:center;background-color:inherit;border:none;border-radius:100%;color:var(--funheadercolor);display:inline-flex;height:25px;justify-content:center;position:absolute;right:10px;top:10px;width:25px}.dialogclosebutton:hover{background-color:var(--funheadercolor);color:var(--funcnodesbackground1)}.dialogclosebutton:active{background-color:var(--funheadercolor);color:var(--funcnodestextcolor1)}.dialogsendbutton{background-color:var(--funcnodesbackground1);border:1px solid var(--funheadercolor);border-radius:99rem;color:var(--funheadercolor);cursor:pointer;font-size:15px;margin-top:20px;padding:10px 20px}.dialogsendbutton:hover{background-color:var(--funheadercolor);color:var(--funcnodesbackground1)}.dialogsendbutton:active{background-color:var(--funheadercolor);color:var(--funcnodestextcolor1)}.dialogchildren{margin-top:20px;overflow:auto}
@@ -0,0 +1 @@
1
+ <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/static/favicon.ico"/><link rel="apple-touch-icon" href="/static/logo192.png"/><link rel="manifest" href="/static/manifest.json"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Funcnodes via react"/><title>FuncNodes</title><script defer="defer" src="static/js/830.js"></script><script defer="defer" src="static/js/main.js"></script><link href="static/css/style.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>