Skip to content

Commit

Permalink
support for MediaStreamTrack.getConstraints
Browse files Browse the repository at this point in the history
  • Loading branch information
signed committed Dec 13, 2021
1 parent 9f602cf commit 13e8194
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 6 deletions.
22 changes: 22 additions & 0 deletions src/MediaDevicesFake.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,7 @@ describe('attach device', () => {
expect(track.readyState).toBe('live')
expect(track.kind).toBe('video')
})

test('return audioinput with matching device id', async () => {
fake.attach(anyMicrophone({ deviceId: 'not this one' }))
fake.attach(anyMicrophone({ deviceId: 'attached', label: 'match' }))
Expand All @@ -203,6 +204,27 @@ describe('attach device', () => {
expect(track.readyState).toBe('live')
expect(track.kind).toBe('audio')
})

test('provide access to the passed video constraints', async () => {
fake.attach(anyCamera())
const constraintInput = { facingMode: 'user' }
const stream = await fake.getUserMedia({ video: constraintInput })
const trackConstraints = stream.getTracks()[0].getConstraints()
expect(trackConstraints).toEqual({ facingMode: 'user' })
expect(trackConstraints).not.toBe(constraintInput)
})

test('replace true constraint with an empty object', async () => {
fake.attach(anyCamera())
const stream = await fake.getUserMedia({ video: true })
expect(stream.getTracks()[0].getConstraints()).toEqual({})
})

test('provide access to the passed audio constraints', async () => {
fake.attach(anyMicrophone())
const stream = await fake.getUserMedia({ audio: { noiseSuppression: true } })
expect(stream.getTracks()[0].getConstraints()).toEqual({ noiseSuppression: true })
})
})

describe('dispatch', () => {
Expand Down
5 changes: 4 additions & 1 deletion src/MediaDevicesFake.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@ const trackConstraintsFrom = (
throw new Error('with the current assumptions this should not happen')
}

const deepClone = (mediaTrackConstraints: MediaTrackConstraints) => JSON.parse(JSON.stringify(mediaTrackConstraints))

const tryToOpenAStreamFor = (
context: Context,
deferred: Deferred<MediaStream>,
Expand All @@ -107,9 +109,10 @@ const tryToOpenAStreamFor = (
context.notImplemented.call('should this be an over constrained error?')
}

const constraintObject = typeof mediaTrackConstraints === 'boolean' ? {} : deepClone(mediaTrackConstraints)
const mediaTrack = new MediaStreamTrackFake(
context,
initialMediaStreamTrackProperties(selectedDevice.label, trackKind),
initialMediaStreamTrackProperties(selectedDevice.label, trackKind, constraintObject),
)
openMediaTracks.track(selectedDevice, mediaTrack)
mediaTrack.onTerminated = (track) => openMediaTracks.remove(track)
Expand Down
5 changes: 4 additions & 1 deletion src/MediaStreamTrackFake.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@ describe('MediaStreamTrackFake', () => {
let track: MediaStreamTrackFake

beforeEach(() => {
track = new MediaStreamTrackFake(defaultContext(), initialMediaStreamTrackProperties('The Label', anyTrackKind()))
track = new MediaStreamTrackFake(
defaultContext(),
initialMediaStreamTrackProperties('The Label', anyTrackKind(), {}),
)
})

test('enabled by default', () => {
Expand Down
11 changes: 8 additions & 3 deletions src/MediaStreamTrackFake.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,15 @@ export interface MediaStreamTrackProperties {
enabled: MediaStreamTrack['enabled']
kind: TrackKind
label: string
constraints: MediaTrackConstraints
}

export const initialMediaStreamTrackProperties = (label: string, kind: TrackKind): MediaStreamTrackProperties => {
return { id: uuidV4(), readyState: 'live', enabled: true, kind, label }
export const initialMediaStreamTrackProperties = (
label: string,
kind: TrackKind,
constraints: MediaTrackConstraints,
): MediaStreamTrackProperties => {
return { id: uuidV4(), readyState: 'live', enabled: true, kind, label, constraints }
}

export type TrackTerminatedListener = (mediaStreamTrack: MediaStreamTrackFake) => void
Expand Down Expand Up @@ -175,7 +180,7 @@ export class MediaStreamTrackFake extends EventTarget implements MediaStreamTrac
* Constraints can also specify ideal and/or acceptable sizes or ranges of sizes.
*/
getConstraints(): MediaTrackConstraints {
this._context.notImplemented.call('MediaStreamTrackFake.getConstraints()')
return this._properties.constraints
}

/**
Expand Down
2 changes: 1 addition & 1 deletion src/MediaStreamTrackMother.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
export const anyTrackKind = (): TrackKind => 'video'

export const anyMediaStreamTrack = (overrides: Partial<MediaStreamTrackProperties> = {}) => {
const initial = initialMediaStreamTrackProperties('stand in label', anyTrackKind())
const initial = initialMediaStreamTrackProperties('stand in label', anyTrackKind(), {})
const properties = { ...initial, ...overrides }
return new MediaStreamTrackFake(defaultContext(), properties)
}

0 comments on commit 13e8194

Please sign in to comment.