|
3 | 3 | import copy |
4 | 4 | import os |
5 | 5 | import secrets |
| 6 | +from inspect import signature |
6 | 7 | from pathlib import Path |
7 | 8 | from typing import Any, Callable, Optional, cast |
8 | 9 |
|
@@ -101,19 +102,25 @@ def server(input: Inputs, output: Outputs, session: Session): |
101 | 102 | def __init__( |
102 | 103 | self, |
103 | 104 | ui: Tag | TagList | Callable[[Request], Tag | TagList] | Path, |
104 | | - server: Optional[Callable[[Inputs, Outputs, Session], None]], |
| 105 | + server: Callable[[Inputs], None] |
| 106 | + | Callable[[Inputs, Outputs, Session], None] |
| 107 | + | None, |
105 | 108 | *, |
106 | 109 | static_assets: Optional["str" | "os.PathLike[str]" | dict[str, Path]] = None, |
107 | 110 | debug: bool = False, |
108 | 111 | ) -> None: |
109 | 112 | if server is None: |
110 | | - |
111 | | - def _server(inputs: Inputs, outputs: Outputs, session: Session): |
112 | | - pass |
113 | | - |
114 | | - server = _server |
115 | | - |
116 | | - self.server = server |
| 113 | + self.server = noop_server_fn |
| 114 | + elif len(signature(server).parameters) == 1: |
| 115 | + self.server = wrap_server_fn_with_output_session( |
| 116 | + cast(Callable[[Inputs], None], server) |
| 117 | + ) |
| 118 | + elif len(signature(server).parameters) == 3: |
| 119 | + self.server = cast(Callable[[Inputs, Outputs, Session], None], server) |
| 120 | + else: |
| 121 | + raise ValueError( |
| 122 | + "`server` must have 1 (Inputs) or 3 parameters (Inputs, Outputs, Session)" |
| 123 | + ) |
117 | 124 |
|
118 | 125 | self._debug: bool = debug |
119 | 126 |
|
@@ -446,3 +453,17 @@ def file_response_handler(req: Request) -> FileResponse: |
446 | 453 | file_response_handler, |
447 | 454 | name="shiny-app-static-assets-" + mount_point, |
448 | 455 | ) |
| 456 | + |
| 457 | + |
| 458 | +def noop_server_fn(input: Inputs, output: Outputs, session: Session) -> None: |
| 459 | + pass |
| 460 | + |
| 461 | + |
| 462 | +def wrap_server_fn_with_output_session( |
| 463 | + server: Callable[[Inputs], None] |
| 464 | +) -> Callable[[Inputs, Outputs, Session], None]: |
| 465 | + def _server(input: Inputs, output: Outputs, session: Session): |
| 466 | + # Only has 1 parameter, ignore output, session |
| 467 | + server(input) |
| 468 | + |
| 469 | + return _server |
0 commit comments