98 lines
3.0 KiB
TypeScript
98 lines
3.0 KiB
TypeScript
import { describe, expect, test } from 'bun:test';
|
|
|
|
import {
|
|
canRelayWebrtcSignal,
|
|
createStreamEndedPayload,
|
|
createStreamRequestedPayload,
|
|
createStreamStartedPayload,
|
|
toSimpleStreamSessionResponse,
|
|
} from '../streaming/simple';
|
|
|
|
const buildSession = () => ({
|
|
id: 'stream-1',
|
|
ownerUserId: 'user-1',
|
|
cameraDeviceId: 'camera-1',
|
|
requesterDeviceId: 'client-1',
|
|
status: 'streaming',
|
|
reason: 'on_demand',
|
|
metadata: { quality: 'standard' },
|
|
startedAt: new Date('2026-04-06T10:00:00.000Z'),
|
|
endedAt: null,
|
|
createdAt: new Date('2026-04-06T09:59:00.000Z'),
|
|
updatedAt: new Date('2026-04-06T10:00:00.000Z'),
|
|
});
|
|
|
|
describe('simple streaming helpers', () => {
|
|
test('only relays WebRTC signals between stream participants', () => {
|
|
const session = buildSession();
|
|
|
|
expect(canRelayWebrtcSignal(session, 'camera-1', 'client-1')).toBe(true);
|
|
expect(canRelayWebrtcSignal(session, 'client-1', 'camera-1')).toBe(true);
|
|
expect(canRelayWebrtcSignal(session, 'camera-1', 'camera-1')).toBe(false);
|
|
expect(canRelayWebrtcSignal(session, 'camera-1', 'intruder-1')).toBe(false);
|
|
});
|
|
|
|
test('builds deterministic requested and started payloads', () => {
|
|
const session = buildSession();
|
|
|
|
expect(createStreamRequestedPayload(session)).toEqual({
|
|
streamSessionId: 'stream-1',
|
|
cameraDeviceId: 'camera-1',
|
|
requesterDeviceId: 'client-1',
|
|
status: 'streaming',
|
|
reason: 'on_demand',
|
|
});
|
|
|
|
expect(createStreamStartedPayload(session)).toEqual({
|
|
streamSessionId: 'stream-1',
|
|
cameraDeviceId: 'camera-1',
|
|
requesterDeviceId: 'client-1',
|
|
status: 'streaming',
|
|
startedAt: session.startedAt,
|
|
transport: 'webrtc',
|
|
});
|
|
});
|
|
|
|
test('normalizes ended payload and strips provider fields from API response', () => {
|
|
const session = {
|
|
...buildSession(),
|
|
mediaProvider: 'mock',
|
|
mediaSessionId: 'mock_stream-1',
|
|
streamKey: 'stream-key',
|
|
publishEndpoint: 'https://example.test/publish',
|
|
subscribeEndpoint: 'https://example.test/subscribe',
|
|
};
|
|
|
|
expect(
|
|
createStreamEndedPayload({
|
|
streamSessionId: session.id,
|
|
cameraDeviceId: session.cameraDeviceId,
|
|
requesterDeviceId: session.requesterDeviceId,
|
|
endedAt: new Date('2026-04-06T10:05:00.000Z'),
|
|
reason: 'completed',
|
|
}),
|
|
).toEqual({
|
|
streamSessionId: 'stream-1',
|
|
cameraDeviceId: 'camera-1',
|
|
requesterDeviceId: 'client-1',
|
|
status: 'ended',
|
|
endedAt: new Date('2026-04-06T10:05:00.000Z'),
|
|
reason: 'completed',
|
|
});
|
|
|
|
expect(toSimpleStreamSessionResponse(session)).toEqual({
|
|
id: 'stream-1',
|
|
ownerUserId: 'user-1',
|
|
cameraDeviceId: 'camera-1',
|
|
requesterDeviceId: 'client-1',
|
|
status: 'streaming',
|
|
reason: 'on_demand',
|
|
metadata: { quality: 'standard' },
|
|
startedAt: new Date('2026-04-06T10:00:00.000Z'),
|
|
endedAt: null,
|
|
createdAt: new Date('2026-04-06T09:59:00.000Z'),
|
|
updatedAt: new Date('2026-04-06T10:00:00.000Z'),
|
|
});
|
|
});
|
|
});
|