Enable users to join rooms via SIP telephony by: - Dialing the SIP trunk number - Entering the room's PIN followed by '#' The PIN code needs to be generated before the LiveKit room is created, allowing the owner to send invites to participants in advance. With 10-digit PINs (10^10 combinations) and a large number of rooms (e.g., 1M), collisions become statistically inevitable. A retry mechanism helps reduce the chance of repeated collisions but doesn't eliminate the overall risk. With 100K generated PINs, the probability of at least one collision exceeds 39%, due to the birthday paradox. To scale safely, we’ll later propose using multiple trunks. Each trunk will handle a separate PIN namespace, and the combination of trunk_id and PIN will ensure uniqueness. Room assignment will be evenly distributed across trunks to balance load and minimize collisions. Following XP principles, we’ll ship the simplest working version of this feature. The goal is to deliver value quickly without over-engineering. We’re not solving scaling challenges we don’t currently face. Our production load is around 10,000 rooms — well within safe limits for the initial implementation. Discussion points: - The `while` loop should be reviewed. Should we add rate limiting for failed attempts? - A systematic existence check before `INSERT` is more costly for a rare event and doesn't prevent race conditions, whereas retrying on integrity errors is more efficient overall. - Should we add logging or monitoring to track and analyze collisions? I tried to balance performance and simplicity while ensuring the robustness of the PIN generation process.
60 lines
1.8 KiB
Plaintext
60 lines
1.8 KiB
Plaintext
# Django
|
|
DJANGO_ALLOWED_HOSTS=*
|
|
DJANGO_SECRET_KEY=ThisIsAnExampleKeyForDevPurposeOnly
|
|
DJANGO_SETTINGS_MODULE=meet.settings
|
|
DJANGO_SUPERUSER_PASSWORD=admin
|
|
|
|
# Python
|
|
PYTHONPATH=/app
|
|
|
|
# Meet settings
|
|
|
|
# Mail
|
|
DJANGO_EMAIL_HOST="mailcatcher"
|
|
DJANGO_EMAIL_PORT=1025
|
|
DJANGO_EMAIL_BRAND_NAME=La Suite Numérique
|
|
DJANGO_EMAIL_SUPPORT_EMAIL=test@yopmail.com
|
|
DJANGO_EMAIL_LOGO_IMG=http://localhost:3000/assets/logo-suite-numerique.png
|
|
DJANGO_EMAIL_DOMAIN=localhost:3000
|
|
DJANGO_EMAIL_APP_BASE_URL=http://localhost:3000
|
|
|
|
# Backend url
|
|
MEET_BASE_URL="http://localhost:8072"
|
|
|
|
# Media
|
|
STORAGES_STATICFILES_BACKEND=django.contrib.staticfiles.storage.StaticFilesStorage
|
|
AWS_S3_ENDPOINT_URL=http://minio:9000
|
|
AWS_S3_ACCESS_KEY_ID=meet
|
|
AWS_S3_SECRET_ACCESS_KEY=password
|
|
|
|
# OIDC
|
|
OIDC_OP_JWKS_ENDPOINT=http://nginx:8083/realms/meet/protocol/openid-connect/certs
|
|
OIDC_OP_AUTHORIZATION_ENDPOINT=http://localhost:8083/realms/meet/protocol/openid-connect/auth
|
|
OIDC_OP_TOKEN_ENDPOINT=http://nginx:8083/realms/meet/protocol/openid-connect/token
|
|
OIDC_OP_USER_ENDPOINT=http://nginx:8083/realms/meet/protocol/openid-connect/userinfo
|
|
|
|
OIDC_RP_CLIENT_ID=meet
|
|
OIDC_RP_CLIENT_SECRET=ThisIsAnExampleKeyForDevPurposeOnly
|
|
OIDC_RP_SIGN_ALGO=RS256
|
|
OIDC_RP_SCOPES="openid email"
|
|
|
|
LOGIN_REDIRECT_URL=http://localhost:3000
|
|
LOGIN_REDIRECT_URL_FAILURE=http://localhost:3000
|
|
LOGOUT_REDIRECT_URL=http://localhost:3000
|
|
|
|
OIDC_REDIRECT_ALLOWED_HOSTS=["http://localhost:8083", "http://localhost:3000"]
|
|
OIDC_AUTH_REQUEST_EXTRA_PARAMS={"acr_values": "eidas1"}
|
|
|
|
# Livekit Token settings
|
|
LIVEKIT_API_SECRET=secret
|
|
LIVEKIT_API_KEY=devkey
|
|
LIVEKIT_API_URL=http://127.0.0.1.nip.io:7880
|
|
LIVEKIT_VERIFY_SSL=False
|
|
ALLOW_UNREGISTERED_ROOMS=False
|
|
|
|
# Recording
|
|
SCREEN_RECORDING_BASE_URL=http://localhost:3000/recordings
|
|
|
|
# Telephony
|
|
ROOM_TELEPHONY_ENABLED=True
|