Repository navigation
feat(calls): prepare guest labels and live waiting-room controls #98
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
abc8688
7c19478
4dbdaf0
c15b944
9b8c960
5781db1
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,27 @@ | ||
| { | ||
| "sourceAccepted": false, | ||
| "published": false, | ||
| "apiVersion": "2026-09-22", | ||
| "apiSource": "0983e9263de1f0887b249faf9d85207d543989e3", | ||
| "sdkSource": "e6df859b2560c67a87f947f8c4cf13e2361cfc95", | ||
| "sdkSnippetExport": "b9454930a2a821cccde2881efeb4430a0a96e676", | ||
| "physicalPackageSha256": "34b858821df0405c215306997a3e3cfdbea1cf404db90c09422be4075018cda4", | ||
| "publishedDependencyUnchanged": true, | ||
| "operations": ["set_approval_required", "admit", "deny"], | ||
| "authority": "same held live media connection; backend checks call owner and current provider admin", | ||
| "replay": "never automatic; a matching acknowledgement is required", | ||
| "evidence": "POLYMORFA_GUEST_SDK_REQUIRED=1 native CLI calls-sockets fixture with candidate package", | ||
| "releaseGates": [ | ||
| "accepted API and SDK source", | ||
| "matching staging acceptance before nightly", | ||
| "matching production acceptance before stable", | ||
| "native paired-host waiting-room moderation acceptance", | ||
| "matching published SDK version before dependency pin", | ||
| "CLI merge and publication after the matching SDK dependency is pinned" | ||
| ], | ||
| "acceptance": { | ||
| "publishedDependency": "format, lint, typecheck, build, reference checks and full suite pass: 1175 tests, 1 candidate-only skip; old SDK refuses unsupported controls before connecting", | ||
| "candidatePackage": "typecheck, build and all 1176 tests pass with physical SDK archive, including native held-connection guest moderation; emitted browser module and production audit pass", | ||
| "dependencyPin": "published version unchanged until matching SDK publication and API environment acceptance; full candidate source compatibility is verified" | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -58,12 +58,26 @@ export function renderCallActivity(activity: CallActivity): string { | |
| `participant=${activity.participant.id}`, | ||
| `state=${activity.participant.state}`, | ||
| ) | ||
| if ((activity.participant as {guest?: boolean}).guest === true) | ||
| fields.push('guest=true') | ||
| if (typeof (activity.participant as {name?: string}).name === 'string') | ||
| fields.push( | ||
| `name=${JSON.stringify((activity.participant as {name?: string}).name)}`, | ||
| ) | ||
|
Comment on lines
+63
to
+66
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Escape C1 and bidirectional control characters in untrusted guest names. The README says rendered names are quoted so control characters cannot become terminal instructions. A hostile guest can inject terminal sequences or spoof the roster line an admin reads before an Add one shared helper and use it in all three places. Proposed fix
Also applies to: 78-78
|
||
| break | ||
| case 'participant_left': | ||
| fields.push(`participant=${activity.participantId}`) | ||
| if (activity.reason !== undefined) | ||
| fields.push(`reason=${activity.reason}`) | ||
| break | ||
| case 'waiting_room': | ||
| fields.push( | ||
| `approvalRequired=${activity.room.enabled}`, | ||
| `isAdmin=${activity.room.isAdmin}`, | ||
| `inWaitingRoom=${activity.room.inWaitingRoom}`, | ||
| `users=${JSON.stringify(activity.room.users)}`, | ||
| ) | ||
| break | ||
| case 'ended': | ||
| fields.push(`reason=${activity.reason}`, `duration=${activity.duration}s`) | ||
| break | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.