@@ -19,6 +19,7 @@ import { getAgentScopedMediaLocalRoots } from "../media/local-roots.js";
1919import { resolveMediaReferenceLocalPath } from "../media/media-reference.js" ;
2020import { detectMime } from "../media/mime.js" ;
2121import { AVATAR_MAX_BYTES } from "../shared/avatar-policy.js" ;
22+ import { asDateTimestampMs , resolveTimestampMsToIsoString } from "../shared/number-coercion.js" ;
2223import { resolveUserPath } from "../utils.js" ;
2324import { resolveRuntimeServiceVersion } from "../version.js" ;
2425import { DEFAULT_ASSISTANT_IDENTITY , resolveAssistantIdentity } from "./assistant-identity.js" ;
@@ -408,7 +409,14 @@ function signAssistantMediaTicketPayload(encodedPayload: string): string {
408409}
409410
410411function createAssistantMediaTicket ( source : string , nowMs = Date . now ( ) ) {
411- const exp = nowMs + CONTROL_UI_ASSISTANT_MEDIA_TICKET_TTL_MS ;
412+ const now = asDateTimestampMs ( nowMs ) ;
413+ if ( now === undefined ) {
414+ return { } ;
415+ }
416+ const exp = asDateTimestampMs ( now + CONTROL_UI_ASSISTANT_MEDIA_TICKET_TTL_MS ) ;
417+ if ( exp === undefined ) {
418+ return { } ;
419+ }
412420 const payload : AssistantMediaTicketPayload = {
413421 scope : CONTROL_UI_ASSISTANT_MEDIA_TICKET_SCOPE ,
414422 source,
@@ -418,11 +426,15 @@ function createAssistantMediaTicket(source: string, nowMs = Date.now()) {
418426 const sig = signAssistantMediaTicketPayload ( encodedPayload ) ;
419427 return {
420428 mediaTicket : `v1.${ encodedPayload } .${ sig } ` ,
421- mediaTicketExpiresAt : new Date ( exp ) . toISOString ( ) ,
429+ mediaTicketExpiresAt : resolveTimestampMsToIsoString ( exp ) ,
422430 } ;
423431}
424432
425433function verifyAssistantMediaTicket ( ticket : string | null , source : string , nowMs = Date . now ( ) ) {
434+ const now = asDateTimestampMs ( nowMs ) ;
435+ if ( now === undefined ) {
436+ return false ;
437+ }
426438 const parts = ticket ?. split ( "." ) ;
427439 if ( ! parts || parts . length !== 3 || parts [ 0 ] !== "v1" ) {
428440 return false ;
@@ -446,7 +458,7 @@ function verifyAssistantMediaTicket(ticket: string | null, source: string, nowMs
446458 payload . source === source &&
447459 typeof payload . exp === "number" &&
448460 Number . isFinite ( payload . exp ) &&
449- payload . exp >= nowMs
461+ payload . exp >= now
450462 ) ;
451463 } catch {
452464 return false ;
0 commit comments