Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions sendspin/serve/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
from typing import TYPE_CHECKING, Any

import qrcode
from aiosendspin.noise import Identity, InMemoryServerPairingStore
from aiosendspin.noise import Identity
from aiosendspin.server import (
ClientAddedEvent,
ClientRemovedEvent,
Expand All @@ -27,7 +27,7 @@

from sendspin.utils import create_task

from .server import SendspinPlayerServer
from .server import PartyPairingStore, SendspinPlayerServer
from .source import AudioSource, decode_audio

if TYPE_CHECKING:
Expand Down Expand Up @@ -124,7 +124,7 @@ async def run_server(config: ServeConfig) -> int:
loop=event_loop,
identity=Identity.generate(),
server_name=config.name,
pairing_store=InMemoryServerPairingStore(),
pairing_store=PartyPairingStore(),
)

client_connected = asyncio.Event()
Expand Down
12 changes: 12 additions & 0 deletions sendspin/serve/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,21 @@
from typing import Any

from aiohttp import web
from aiosendspin.noise import InMemoryServerPairingStore, TrustedUnpairedClient
from aiosendspin.server import SendspinServer


class PartyPairingStore(InMemoryServerPairingStore):
"""Pairing store that approves every client for unpaired playback.

A party admits anyone who opens the page, so no operator approves clients.
"""

async def trusted_unpaired(self, client_id: str) -> TrustedUnpairedClient | None:
"""Return the stored approval, or a new approval for any other client."""
return await super().trusted_unpaired(client_id) or TrustedUnpairedClient(client_id)


class SendspinPlayerServer(SendspinServer):
"""SendspinServer that serves an embedded web player at /."""

Expand Down
2 changes: 1 addition & 1 deletion sendspin/serve/web/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -650,7 +650,7 @@ elements.listenToggleBtn.addEventListener("click", async () => {
});

const sdkImport = import(
"https://unpkg.com/@sendspin/sendspin-js@3.0.1/dist/index.js?module",
"https://cdn.jsdelivr.net/npm/@sendspin/sendspin-js@5.0.0/+esm",
);

// QR Code generation (using qrcode-generator loaded via script tag)
Expand Down
2 changes: 1 addition & 1 deletion sendspin/serve/web/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,6 @@ <h2>About Sendspin</h2>
</footer>
</div>

<script type="module" src="app.js?v=9"></script>
<script type="module" src="app.js?v=10"></script>
</body>
</html>
6 changes: 3 additions & 3 deletions sendspin/serve/worker.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from multiprocessing.sharedctypes import Synchronized
from contextlib import suppress

from aiosendspin.noise import Identity, InMemoryServerPairingStore
from aiosendspin.noise import Identity
from aiosendspin.server import (
ClientAddedEvent,
ClientRemovedEvent,
Expand All @@ -31,7 +31,7 @@
WorkerError,
WorkerListening,
)
from sendspin.serve.server import SendspinPlayerServer
from sendspin.serve.server import PartyPairingStore, SendspinPlayerServer
from sendspin.utils import create_task

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -105,7 +105,7 @@ async def _start_server(self) -> None:
loop=loop,
identity=Identity.generate(),
server_name=f"Sendspin Worker {self.worker_id}",
pairing_store=InMemoryServerPairingStore(),
pairing_store=PartyPairingStore(),
total_listeners=self._total_listeners,
)
self._server.add_event_listener(self._on_server_event)
Expand Down
Loading