meerschaum 2.4.0.dev1__py3-none-any.whl → 2.4.0rc2__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 (66) hide show
  1. meerschaum/_internal/arguments/_parse_arguments.py +2 -5
  2. meerschaum/_internal/docs/index.py +3 -2
  3. meerschaum/_internal/entry.py +13 -7
  4. meerschaum/_internal/shell/Shell.py +38 -44
  5. meerschaum/_internal/term/TermPageHandler.py +2 -3
  6. meerschaum/_internal/term/__init__.py +13 -11
  7. meerschaum/actions/api.py +10 -7
  8. meerschaum/actions/bootstrap.py +2 -1
  9. meerschaum/actions/delete.py +4 -1
  10. meerschaum/actions/register.py +1 -3
  11. meerschaum/actions/stack.py +24 -19
  12. meerschaum/actions/start.py +25 -26
  13. meerschaum/actions/sync.py +53 -52
  14. meerschaum/api/__init__.py +48 -14
  15. meerschaum/api/_events.py +15 -10
  16. meerschaum/api/_oauth2.py +2 -2
  17. meerschaum/api/_websockets.py +5 -4
  18. meerschaum/api/dash/__init__.py +1 -11
  19. meerschaum/api/dash/callbacks/dashboard.py +47 -55
  20. meerschaum/api/dash/callbacks/jobs.py +15 -16
  21. meerschaum/api/dash/callbacks/login.py +16 -10
  22. meerschaum/api/dash/callbacks/pipes.py +3 -4
  23. meerschaum/api/dash/callbacks/plugins.py +1 -1
  24. meerschaum/api/dash/callbacks/register.py +15 -11
  25. meerschaum/api/dash/components.py +54 -59
  26. meerschaum/api/dash/jobs.py +5 -9
  27. meerschaum/api/dash/pages/pipes.py +4 -1
  28. meerschaum/api/dash/pipes.py +13 -17
  29. meerschaum/api/dash/plugins.py +6 -4
  30. meerschaum/api/dash/sessions.py +176 -0
  31. meerschaum/api/dash/users.py +2 -53
  32. meerschaum/api/dash/webterm.py +12 -17
  33. meerschaum/api/resources/static/js/terminado.js +1 -1
  34. meerschaum/api/routes/_actions.py +4 -20
  35. meerschaum/api/routes/_jobs.py +8 -7
  36. meerschaum/api/routes/_webterm.py +5 -6
  37. meerschaum/config/_default.py +6 -1
  38. meerschaum/config/_version.py +1 -1
  39. meerschaum/config/stack/__init__.py +9 -7
  40. meerschaum/config/static/__init__.py +4 -0
  41. meerschaum/connectors/__init__.py +15 -9
  42. meerschaum/connectors/api/{APIConnector.py → _APIConnector.py} +3 -1
  43. meerschaum/connectors/api/__init__.py +2 -1
  44. meerschaum/connectors/parse.py +18 -16
  45. meerschaum/connectors/sql/__init__.py +3 -1
  46. meerschaum/connectors/sql/_pipes.py +39 -39
  47. meerschaum/connectors/valkey/{ValkeyConnector.py → _ValkeyConnector.py} +5 -5
  48. meerschaum/connectors/valkey/__init__.py +3 -1
  49. meerschaum/connectors/valkey/_pipes.py +13 -8
  50. meerschaum/core/Pipe/_data.py +155 -100
  51. meerschaum/jobs/_Job.py +1 -6
  52. meerschaum/jobs/__init__.py +7 -2
  53. meerschaum/utils/dataframe.py +4 -1
  54. meerschaum/utils/formatting/_shell.py +5 -6
  55. meerschaum/utils/packages/__init__.py +14 -9
  56. {meerschaum-2.4.0.dev1.dist-info → meerschaum-2.4.0rc2.dist-info}/METADATA +1 -1
  57. {meerschaum-2.4.0.dev1.dist-info → meerschaum-2.4.0rc2.dist-info}/RECORD +65 -65
  58. {meerschaum-2.4.0.dev1.dist-info → meerschaum-2.4.0rc2.dist-info}/WHEEL +1 -1
  59. meerschaum/api/dash/actions.py +0 -255
  60. /meerschaum/connectors/{Connector.py → _Connector.py} +0 -0
  61. /meerschaum/connectors/sql/{SQLConnector.py → _SQLConnector.py} +0 -0
  62. {meerschaum-2.4.0.dev1.dist-info → meerschaum-2.4.0rc2.dist-info}/LICENSE +0 -0
  63. {meerschaum-2.4.0.dev1.dist-info → meerschaum-2.4.0rc2.dist-info}/NOTICE +0 -0
  64. {meerschaum-2.4.0.dev1.dist-info → meerschaum-2.4.0rc2.dist-info}/entry_points.txt +0 -0
  65. {meerschaum-2.4.0.dev1.dist-info → meerschaum-2.4.0rc2.dist-info}/top_level.txt +0 -0
  66. {meerschaum-2.4.0.dev1.dist-info → meerschaum-2.4.0rc2.dist-info}/zip-safe +0 -0
@@ -304,24 +304,20 @@ def _start_jobs(
304
304
 
305
305
 
306
306
  def _start_gui(
307
- action: Optional[List[str]] = None,
308
- mrsm_instance: Optional[str] = None,
309
- port: Optional[int] = None,
310
- debug: bool = False,
311
- **kw
312
- ) -> SuccessTuple:
307
+ action: Optional[List[str]] = None,
308
+ mrsm_instance: Optional[str] = None,
309
+ port: Optional[int] = None,
310
+ debug: bool = False,
311
+ **kw
312
+ ) -> SuccessTuple:
313
313
  """
314
314
  Start the Meerschaum GUI application.
315
315
  """
316
- from meerschaum.utils.daemon import Daemon
317
- from meerschaum.utils.process import run_process
318
316
  from meerschaum.utils.venv import venv_exec
319
- from meerschaum.utils.packages import (
320
- run_python_package, attempt_import, venv_contains_package, pip_install
321
- )
317
+ from meerschaum.utils.packages import attempt_import
322
318
  from meerschaum.utils.warnings import warn
323
319
  from meerschaum.utils.debug import dprint
324
- from meerschaum.utils.networking import find_open_ports, is_port_in_use
320
+ from meerschaum.utils.networking import find_open_ports
325
321
  from meerschaum.connectors.parse import parse_instance_keys
326
322
  from meerschaum._internal.term.tools import is_webterm_running
327
323
  import platform
@@ -395,13 +391,14 @@ def _start_gui(
395
391
 
396
392
 
397
393
  def _start_webterm(
398
- port: Optional[int] = None,
399
- host: Optional[str] = None,
400
- force: bool = False,
401
- nopretty: bool = False,
402
- sysargs: Optional[List[str]] = None,
403
- **kw
404
- ) -> SuccessTuple:
394
+ port: Optional[int] = None,
395
+ host: Optional[str] = None,
396
+ mrsm_instance: Optional[str] = None,
397
+ force: bool = False,
398
+ nopretty: bool = False,
399
+ sysargs: Optional[List[str]] = None,
400
+ **kw
401
+ ) -> SuccessTuple:
405
402
  """
406
403
  Start the Meerschaum Web Terminal.
407
404
 
@@ -409,15 +406,17 @@ def _start_webterm(
409
406
  - `-p`, `--port`
410
407
  The port to which the webterm binds.
411
408
  Defaults to 8765, and `--force` will choose the next available port.
412
-
409
+
413
410
  - `--host`
414
411
  The host interface to which the webterm binds.
415
412
  Defaults to '127.0.0.1'.
413
+
414
+ - `-i`, '--instance'
415
+ The default instance to use for the Webterm shell.
416
416
  """
417
- from meerschaum._internal.term import get_webterm_app_and_manager, tornado, tornado_ioloop
417
+ from meerschaum._internal.term import get_webterm_app_and_manager, tornado_ioloop
418
418
  from meerschaum._internal.term.tools import is_webterm_running
419
- from meerschaum.utils.networking import find_open_ports, is_port_in_use
420
- from meerschaum.utils.packages import attempt_import
419
+ from meerschaum.utils.networking import find_open_ports
421
420
  from meerschaum.utils.warnings import info
422
421
 
423
422
  if host is None:
@@ -426,7 +425,7 @@ def _start_webterm(
426
425
  port = 8765
427
426
  if sysargs is None:
428
427
  sysargs = ['start', 'webterm']
429
- tornado_app, term_manager = get_webterm_app_and_manager()
428
+ tornado_app, term_manager = get_webterm_app_and_manager(instance_keys=mrsm_instance)
430
429
 
431
430
  if is_webterm_running(host, port):
432
431
  if force:
@@ -517,12 +516,12 @@ def _start_connectors(
517
516
 
518
517
  success = len(fails) == 0
519
518
  msg = (
520
- f"Successfully started connector" + ('s' if len(successes) != 1 else '')
519
+ "Successfully started connector" + ('s' if len(successes) != 1 else '')
521
520
  + ' ' + items_str(successes) + '.'
522
521
  ) if success else f"Failed to start {len(fails)} connectors."
523
522
  if len(fails) > 0:
524
523
  msg += (
525
- f"\n Failed to start connector" + ('s' if len(fails) != 1 else '')
524
+ "\n Failed to start connector" + ('s' if len(fails) != 1 else '')
526
525
  + ' ' + items_str(fails) + '.'
527
526
  )
528
527
 
@@ -9,10 +9,12 @@ NOTE: `sync` required a SQL connection and is not intended for client use
9
9
  """
10
10
 
11
11
  from __future__ import annotations
12
- from datetime import timedelta, datetime, timezone
12
+ from datetime import timedelta
13
+
13
14
  import meerschaum as mrsm
14
15
  from meerschaum.utils.typing import SuccessTuple, Any, List, Optional, Tuple, Union
15
16
 
17
+
16
18
  def sync(
17
19
  action: Optional[List[str]] = None,
18
20
  **kw: Any
@@ -38,47 +40,45 @@ def sync(
38
40
 
39
41
 
40
42
  def _pipes_lap(
41
- workers: Optional[int] = None,
42
- debug: Optional[bool] = None,
43
- unblock: bool = False,
44
- force: bool = False,
45
- min_seconds: int = 1,
46
- verify: bool = False,
47
- deduplicate: bool = False,
48
- bounded: Optional[bool] = None,
49
- chunk_interval: Union[timedelta, int, None] = None,
50
- mrsm_instance: Optional[str] = None,
51
- timeout_seconds: Optional[int] = None,
52
- nopretty: bool = False,
53
- _progress: Optional['rich.progress.Progress'] = None,
54
- **kw: Any
55
- ) -> Tuple[List[mrsm.Pipe], List[mrsm.Pipe]]:
43
+ workers: Optional[int] = None,
44
+ debug: Optional[bool] = None,
45
+ unblock: bool = False,
46
+ force: bool = False,
47
+ min_seconds: int = 1,
48
+ verify: bool = False,
49
+ deduplicate: bool = False,
50
+ bounded: Optional[bool] = None,
51
+ chunk_interval: Union[timedelta, int, None] = None,
52
+ mrsm_instance: Optional[str] = None,
53
+ timeout_seconds: Optional[int] = None,
54
+ nopretty: bool = False,
55
+ _progress: Optional['rich.progress.Progress'] = None,
56
+ **kw: Any
57
+ ) -> Tuple[List[mrsm.Pipe], List[mrsm.Pipe]]:
56
58
  """
57
59
  Do a lap of syncing pipes.
58
60
  """
61
+ import queue
62
+ import multiprocessing
63
+ import time
64
+ import copy
65
+ import json
66
+ import sys
67
+
59
68
  from meerschaum import get_pipes
60
69
  from meerschaum.utils.debug import dprint, _checkpoint
61
- from meerschaum.utils.packages import attempt_import, import_rich
62
- from meerschaum.utils.formatting import print_tuple, ANSI, UNICODE, get_console
70
+ from meerschaum.utils.packages import attempt_import
71
+ from meerschaum.utils.formatting import print_tuple
63
72
  from meerschaum.utils.warnings import warn
64
- from meerschaum.utils.threading import Lock, RLock, Thread, Event
65
- from meerschaum.utils.misc import print_options, get_cols_lines
66
- from meerschaum.utils.pool import get_pool_executor, get_pool
73
+ from meerschaum.utils.threading import Lock, Thread, Event
67
74
  from meerschaum.connectors.parse import parse_instance_keys
68
- from meerschaum import Plugin
69
- import queue
70
- import multiprocessing
71
- import contextlib
72
- import time, os, copy
73
75
  from meerschaum.utils.packages import venv_exec
74
76
  from meerschaum.utils.process import poll_process
75
- import json
76
- import sys
77
77
  dill = attempt_import('dill')
78
78
 
79
79
  rich_table, rich_text, rich_box = attempt_import(
80
80
  'rich.table', 'rich.text', 'rich.box',
81
- lazy = False,
81
+ lazy=False,
82
82
  )
83
83
  all_kw = copy.deepcopy(kw)
84
84
  all_kw.update({
@@ -126,7 +126,7 @@ def _pipes_lap(
126
126
  + "may lead to concurrency issues.\n You can change the pool size with "
127
127
  + "`edit config system` under the keys connectors:sql:create_engine:pool_size,\n "
128
128
  + "and a size of 0 will not limit the number of connections.",
129
- stack = False,
129
+ stack=False,
130
130
  )
131
131
 
132
132
 
@@ -155,8 +155,8 @@ def _pipes_lap(
155
155
  ) + msg + '\n'
156
156
  print_tuple(
157
157
  (success, msg),
158
- calm = True,
159
- _progress = _progress,
158
+ calm=True,
159
+ _progress=_progress,
160
160
  )
161
161
  _checkpoint(_progress=_progress, _task=_task)
162
162
  if _progress is not None:
@@ -274,25 +274,26 @@ def _sync_pipes(
274
274
  - `--debug`
275
275
  - Print verbose messages.
276
276
  """
277
- from meerschaum.utils.debug import dprint
277
+ import time
278
+ import os
279
+ import contextlib
280
+
278
281
  from meerschaum.utils.warnings import warn, info
279
- from meerschaum.utils.formatting import UNICODE
280
- from meerschaum.utils.formatting._shell import progress, live
281
- from meerschaum.utils.formatting._shell import clear_screen, flush_with_newlines
282
+ from meerschaum.utils.formatting._shell import progress
283
+ from meerschaum.utils.formatting._shell import clear_screen
282
284
  from meerschaum.utils.formatting import print_pipes_results
283
- import contextlib
284
- import time
285
- import sys
286
- import json
287
- import asyncio
285
+ from meerschaum.config.static import STATIC_CONFIG
286
+
287
+ noninteractive_val = os.environ.get(STATIC_CONFIG['environment']['noninteractive'], None)
288
+ is_noninterative = noninteractive_val in ('1', 'true', 'True', 'yes')
289
+
288
290
  run = True
289
291
  msg = ""
290
292
  interrupt_warning_msg = "Syncing was interrupted due to a keyboard interrupt."
291
293
  cooldown = 2 * (min_seconds + 1)
292
- underline = '\u2015' if UNICODE else '-'
293
294
  success_pipes, failure_pipes = [], []
294
295
  while run:
295
- _progress = progress() if shell else None
296
+ _progress = progress() if shell and not is_noninterative else None
296
297
  cm = _progress if _progress is not None else contextlib.nullcontext()
297
298
 
298
299
  lap_begin = time.perf_counter()
@@ -301,15 +302,15 @@ def _sync_pipes(
301
302
  results_dict = {}
302
303
  with cm:
303
304
  results_dict = _pipes_lap(
304
- min_seconds = min_seconds,
305
- _progress = _progress,
306
- verify = verify,
307
- deduplicate = deduplicate,
308
- bounded = bounded,
309
- chunk_interval = chunk_interval,
310
- unblock = unblock,
311
- debug = debug,
312
- nopretty = nopretty,
305
+ min_seconds=min_seconds,
306
+ _progress=_progress,
307
+ verify=verify,
308
+ deduplicate=deduplicate,
309
+ bounded=bounded,
310
+ chunk_interval=chunk_interval,
311
+ unblock=unblock,
312
+ debug=debug,
313
+ nopretty=nopretty,
313
314
  **kw
314
315
  )
315
316
  success_pipes = [
@@ -6,7 +6,7 @@
6
6
  Meerschaum API backend. Start an API instance with `start api`.
7
7
  """
8
8
  from __future__ import annotations
9
- import pathlib, os
9
+ import os
10
10
  from meerschaum.utils.typing import Dict, Any, Optional
11
11
 
12
12
  from meerschaum import __version__ as version
@@ -21,7 +21,7 @@ from meerschaum.utils.packages import attempt_import
21
21
  from meerschaum.utils import get_pipes as _get_pipes
22
22
  from meerschaum.config._paths import API_UVICORN_CONFIG_PATH, API_UVICORN_RESOURCES_PATH
23
23
  from meerschaum.plugins import _api_plugins
24
- from meerschaum.utils.warnings import warn
24
+ from meerschaum.utils.warnings import warn, dprint
25
25
  from meerschaum.utils.threading import RLock
26
26
 
27
27
  _locks = {'pipes': RLock(), 'connector': RLock(), 'uvicorn_config': RLock()}
@@ -44,8 +44,8 @@ uv = attempt_import('uv', lazy=False, check_update=CHECK_UPDATE)
44
44
  'starlette.responses',
45
45
  'multipart',
46
46
  'packaging.version',
47
- lazy = False,
48
- check_update = CHECK_UPDATE,
47
+ lazy=False,
48
+ check_update=CHECK_UPDATE,
49
49
  )
50
50
  (
51
51
  typing_extensions,
@@ -53,9 +53,9 @@ uv = attempt_import('uv', lazy=False, check_update=CHECK_UPDATE)
53
53
  ) = attempt_import(
54
54
  'typing_extensions',
55
55
  'uvicorn.workers',
56
- lazy = False,
57
- check_update = CHECK_UPDATE,
58
- venv = None,
56
+ lazy=False,
57
+ check_update=CHECK_UPDATE,
58
+ venv=None,
59
59
  )
60
60
  from meerschaum.api._chain import check_allow_chaining, DISALLOW_CHAINING_MESSAGE
61
61
  uvicorn_config_path = API_UVICORN_RESOURCES_PATH / SERVER_ID / 'config.json'
@@ -75,7 +75,7 @@ def get_uvicorn_config() -> Dict[str, Any]:
75
75
  with _locks['uvicorn_config']:
76
76
  if uvicorn_config is None:
77
77
  try:
78
- with open(uvicorn_config_path, 'r') as f:
78
+ with open(uvicorn_config_path, 'r', encoding='utf-8') as f:
79
79
  uvicorn_config = json.load(f)
80
80
  _uvicorn_config = uvicorn_config
81
81
  except Exception as e:
@@ -93,12 +93,12 @@ debug = get_uvicorn_config().get('debug', False)
93
93
  no_dash = get_uvicorn_config().get('no_dash', False)
94
94
  no_auth = get_uvicorn_config().get('no_auth', False)
95
95
  private = get_uvicorn_config().get('private', False)
96
+ production = get_uvicorn_config().get('production', False)
96
97
  _include_dash = (not no_dash)
97
98
 
98
99
  connector = None
99
100
  def get_api_connector(instance_keys: Optional[str] = None):
100
101
  """Create the instance connector."""
101
- from meerschaum.utils.debug import dprint
102
102
  global connector
103
103
  with _locks['connector']:
104
104
  if connector is None:
@@ -111,6 +111,40 @@ def get_api_connector(instance_keys: Optional[str] = None):
111
111
  dprint(f"API instance connector: {connector}")
112
112
  return connector
113
113
 
114
+ cache_connector = None
115
+ def get_cache_connector(connector_keys: Optional[str] = None):
116
+ """Return the `valkey` connector if running in production."""
117
+ global cache_connector
118
+ if cache_connector is not None:
119
+ return cache_connector
120
+
121
+ if not production:
122
+ return None
123
+
124
+ enable_valkey_cache = get_config('system', 'experimental', 'valkey_session_cache')
125
+ if not enable_valkey_cache:
126
+ return None
127
+
128
+ connector_keys = connector_keys or get_config(
129
+ 'system', 'api', 'cache', 'connector',
130
+ warn=False,
131
+ )
132
+ if connector_keys is None:
133
+ return None
134
+
135
+ if not connector_keys.startswith('valkey'):
136
+ warn(f"Invalid cache connector '{connector_keys}'.")
137
+ return None
138
+
139
+ if cache_connector is None:
140
+ from meerschaum.connectors.parse import parse_instance_keys
141
+ cache_connector = parse_instance_keys(connector_keys)
142
+
143
+ if debug:
144
+ dprint(f"Cache connector: {cache_connector}")
145
+
146
+ return cache_connector
147
+
114
148
 
115
149
  _pipes = None
116
150
  def pipes(refresh=False):
@@ -138,17 +172,17 @@ def get_pipe(connector_keys, metric_key, location_key, refresh=False):
138
172
 
139
173
  app = fastapi.FastAPI(
140
174
  title = 'Meerschaum API',
141
- description = __doc__,
142
- version = __version__,
143
- contact = {
175
+ description=__doc__,
176
+ version=__version__,
177
+ contact={
144
178
  'name': 'Bennett Meares',
145
179
  'url': 'https://meerschaum.io',
146
180
  },
147
- license_info = {
181
+ license_info={
148
182
  'name': 'Apache 2.0',
149
183
  'url': 'https://www.apache.org/licenses/LICENSE-2.0.html',
150
184
  },
151
- open_api_tags = [
185
+ open_api_tags=[
152
186
  {
153
187
  'name': 'Pipes',
154
188
  'description': 'Access pipes by indexing their keys.',
meerschaum/api/_events.py CHANGED
@@ -6,29 +6,30 @@
6
6
  Declare FastAPI events in this module (startup, shutdown, etc.).
7
7
  """
8
8
 
9
- import sys, os, time
9
+ import sys
10
+ import os
11
+ import time
10
12
  from meerschaum.api import (
11
13
  app,
12
14
  get_api_connector,
15
+ get_cache_connector,
13
16
  get_uvicorn_config,
14
17
  debug,
15
18
  no_dash,
16
- uvicorn_config_path,
17
19
  )
18
20
  from meerschaum.utils.debug import dprint
19
21
  from meerschaum.connectors.poll import retry_connect
20
22
  from meerschaum.utils.warnings import warn
21
- from meerschaum._internal.term.tools import is_webterm_running
22
23
  from meerschaum.jobs import (
23
24
  get_jobs,
24
25
  start_check_jobs_thread,
25
26
  stop_check_jobs_thread,
26
- get_executor_keys_from_context,
27
27
  )
28
28
  from meerschaum.config.static import STATIC_CONFIG
29
29
 
30
30
  TEMP_PREFIX: str = STATIC_CONFIG['api']['jobs']['temp_prefix']
31
31
 
32
+
32
33
  @app.on_event("startup")
33
34
  async def startup():
34
35
  """
@@ -41,10 +42,17 @@ async def startup():
41
42
 
42
43
  connected = retry_connect(
43
44
  get_api_connector(),
44
- workers = get_uvicorn_config().get('workers', None),
45
- debug = debug
45
+ workers=get_uvicorn_config().get('workers', None),
46
+ debug=debug
46
47
  )
47
- except Exception as e:
48
+ cache_connector = get_cache_connector()
49
+ if cache_connector is not None:
50
+ connected = retry_connect(
51
+ cache_connector,
52
+ workers=get_uvicorn_config().get('workers', None),
53
+ debug=debug,
54
+ )
55
+ except Exception:
48
56
  import traceback
49
57
  traceback.print_exc()
50
58
  connected = False
@@ -78,8 +86,5 @@ async def shutdown():
78
86
 
79
87
  ### Terminate any running jobs left over.
80
88
  if 'meerschaum.api.dash' in sys.modules:
81
- from meerschaum.api.dash.actions import running_jobs, stop_action
82
89
  from meerschaum.api.dash.webterm import stop_webterm
83
90
  stop_webterm()
84
- for session_id in running_jobs:
85
- stop_action({'session-store.data': {'session-id': session_id}})
meerschaum/api/_oauth2.py CHANGED
@@ -39,10 +39,10 @@ def generate_secret_key() -> str:
39
39
  from meerschaum.config._paths import API_SECRET_KEY_PATH
40
40
  if not API_SECRET_KEY_PATH.exists():
41
41
  secret_key = os.urandom(24).hex()
42
- with open(API_SECRET_KEY_PATH, 'w+') as f:
42
+ with open(API_SECRET_KEY_PATH, 'w+', encoding='utf-8') as f:
43
43
  f.write(secret_key)
44
44
  else:
45
- with open(API_SECRET_KEY_PATH, 'r') as f:
45
+ with open(API_SECRET_KEY_PATH, 'r', encoding='utf-8') as f:
46
46
  secret_key = f.read()
47
47
 
48
48
  return secret_key.encode('utf-8')
@@ -6,13 +6,13 @@
6
6
  Implement WebSockets for the Meerschaum API via FastAPI.
7
7
  """
8
8
 
9
- import time, uuid
10
9
  from datetime import datetime, timezone
10
+
11
11
  from meerschaum.api import (
12
- app, get_api_connector, get_uvicorn_config, debug, fastapi, endpoints
12
+ app,
13
+ fastapi,
14
+ endpoints,
13
15
  )
14
- from meerschaum.api.dash.users import is_session_authenticated
15
- from meerschaum.utils.typing import Optional
16
16
 
17
17
  _websocket_endpoint = endpoints['websocket']
18
18
 
@@ -28,6 +28,7 @@ async def websocket_endpoint(
28
28
  """
29
29
  Communicate with the Web Interface over a websocket.
30
30
  """
31
+ from meerschaum.api.dash.sessions import is_session_authenticated
31
32
  await websocket.accept()
32
33
  try:
33
34
  initial_data = await websocket.receive_json()
@@ -16,7 +16,6 @@ flask_compress = attempt_import('flask_compress', lazy=False)
16
16
  _monkey_patch_get_distribution('flask-compress', flask_compress.__version__)
17
17
  dash = attempt_import('dash', lazy=False)
18
18
 
19
-
20
19
  from meerschaum.utils.typing import List, Optional
21
20
  from meerschaum.config.static import _static_config
22
21
  from meerschaum.api import (
@@ -38,19 +37,10 @@ with warnings.catch_warnings():
38
37
  html, dcc = import_html(), import_dcc()
39
38
  from meerschaum.api.dash.components import location
40
39
 
41
- active_sessions = {}
42
- authenticated_sessions = {}
43
- unauthenticated_sessions = {}
44
- running_jobs = {}
45
- running_monitors = {}
46
- stopped_jobs = {}
47
- stopped_monitors = {}
48
-
49
40
  stylesheets = [
50
41
  '/static/css/bootstrap.min.css',
51
42
  '/static/css/dbc_dark.css',
52
43
  '/static/css/dash.css',
53
- '/static/css/bootstrap-icons/font/bootstrap-icons.min.css',
54
44
  ]
55
45
  scripts = ['/static/js/node_modules/xterm/lib/xterm.js']
56
46
  dash_app = enrich.DashProxy(
@@ -68,7 +58,7 @@ dash_app = enrich.DashProxy(
68
58
 
69
59
  dash_app.layout = html.Div([
70
60
  location,
71
- dcc.Store(id='session-store', storage_type='session', data={}),
61
+ dcc.Store(id='session-store', storage_type='local', data={}),
72
62
  html.Div([], id='page-layout-div'),
73
63
  ])
74
64