|
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