feat(backend): add SIMPLE_STREAMING WebRTC control-path streaming
This commit is contained in:
80
Backend/streaming/simple.ts
Normal file
80
Backend/streaming/simple.ts
Normal file
@@ -0,0 +1,80 @@
|
||||
type StreamSessionLike = {
|
||||
id: string;
|
||||
ownerUserId: string;
|
||||
cameraDeviceId: string;
|
||||
requesterDeviceId: string;
|
||||
status: string;
|
||||
reason: string;
|
||||
metadata: Record<string, unknown> | null;
|
||||
startedAt: Date | null;
|
||||
endedAt: Date | null;
|
||||
createdAt: Date;
|
||||
updatedAt: Date;
|
||||
};
|
||||
|
||||
type StreamEndedPayloadInput = {
|
||||
streamSessionId: string;
|
||||
cameraDeviceId: string;
|
||||
requesterDeviceId: string;
|
||||
endedAt: Date;
|
||||
reason: 'completed' | 'cancelled' | 'failed';
|
||||
};
|
||||
|
||||
export const isStreamParticipant = (session: Pick<StreamSessionLike, 'cameraDeviceId' | 'requesterDeviceId'>, deviceId: string): boolean =>
|
||||
session.cameraDeviceId === deviceId || session.requesterDeviceId === deviceId;
|
||||
|
||||
export const canRelayWebrtcSignal = (
|
||||
session: Pick<StreamSessionLike, 'cameraDeviceId' | 'requesterDeviceId'>,
|
||||
fromDeviceId: string,
|
||||
toDeviceId: string,
|
||||
): boolean => {
|
||||
if (fromDeviceId === toDeviceId) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return isStreamParticipant(session, fromDeviceId) && isStreamParticipant(session, toDeviceId);
|
||||
};
|
||||
|
||||
export const createStreamRequestedPayload = (
|
||||
session: Pick<StreamSessionLike, 'id' | 'cameraDeviceId' | 'requesterDeviceId' | 'status' | 'reason'>,
|
||||
) => ({
|
||||
streamSessionId: session.id,
|
||||
cameraDeviceId: session.cameraDeviceId,
|
||||
requesterDeviceId: session.requesterDeviceId,
|
||||
status: session.status,
|
||||
reason: session.reason,
|
||||
});
|
||||
|
||||
export const createStreamStartedPayload = (
|
||||
session: Pick<StreamSessionLike, 'id' | 'cameraDeviceId' | 'requesterDeviceId' | 'status' | 'startedAt'>,
|
||||
) => ({
|
||||
streamSessionId: session.id,
|
||||
cameraDeviceId: session.cameraDeviceId,
|
||||
requesterDeviceId: session.requesterDeviceId,
|
||||
status: session.status,
|
||||
startedAt: session.startedAt,
|
||||
transport: 'webrtc',
|
||||
});
|
||||
|
||||
export const createStreamEndedPayload = (input: StreamEndedPayloadInput) => ({
|
||||
streamSessionId: input.streamSessionId,
|
||||
cameraDeviceId: input.cameraDeviceId,
|
||||
requesterDeviceId: input.requesterDeviceId,
|
||||
status: 'ended',
|
||||
endedAt: input.endedAt,
|
||||
reason: input.reason,
|
||||
});
|
||||
|
||||
export const toSimpleStreamSessionResponse = (session: StreamSessionLike) => ({
|
||||
id: session.id,
|
||||
ownerUserId: session.ownerUserId,
|
||||
cameraDeviceId: session.cameraDeviceId,
|
||||
requesterDeviceId: session.requesterDeviceId,
|
||||
status: session.status,
|
||||
reason: session.reason,
|
||||
metadata: session.metadata,
|
||||
startedAt: session.startedAt,
|
||||
endedAt: session.endedAt,
|
||||
createdAt: session.createdAt,
|
||||
updatedAt: session.updatedAt,
|
||||
});
|
||||
Reference in New Issue
Block a user