Files
shaka-player/test/msf/msf_control_stream_unit.js
T
Álvaro Velad Galván ef361ed039 feat: Add MoQT draft-14 + WARP/MSF draft-1 experimental support (#9409)
Spec: https://datatracker.ietf.org/doc/draft-ietf-moq-transport/14/
Spec: https://datatracker.ietf.org/doc/draft-ietf-moq-warp/01/

Note: this is experimental and not included in the default builds

---------

Co-authored-by: Wojciech Tyczyński <tykus160@gmail.com>
2026-01-14 09:27:10 +01:00

270 lines
6.7 KiB
JavaScript

describe('shaka.msf.ControlStream', () => {
/** @type {!shaka.msf.ControlStream} */
let controlStream;
/** @type {!shaka.msf.Reader} */
let reader;
/** @type {!shaka.msf.Writer} */
let writer;
/** @type {!Array<!Uint8Array>} */
let writtenChunks;
const messages = [
{
kind: shaka.msf.Utils.MessageType.SUBSCRIBE,
msg: {
kind: shaka.msf.Utils.MessageType.SUBSCRIBE,
requestId: 1,
trackAlias: 1,
namespace: ['ns'],
name: 'track',
subscriberPriority: 0,
groupOrder: shaka.msf.Utils.GroupOrder.PUBLISHER,
forward: true,
filterType: shaka.msf.Utils.FilterType.NONE,
params: [],
},
},
{
kind: shaka.msf.Utils.MessageType.SUBSCRIBE_OK,
msg: {
kind: shaka.msf.Utils.MessageType.SUBSCRIBE_OK,
requestId: 1,
expires: 12345,
groupOrder: shaka.msf.Utils.GroupOrder.ASCENDING,
contentExists: false,
params: [],
},
},
{
kind: shaka.msf.Utils.MessageType.SUBSCRIBE_ERROR,
msg: {
kind: shaka.msf.Utils.MessageType.SUBSCRIBE_ERROR,
requestId: 1,
code: 404,
reason: 'Not found',
trackAlias: 1,
},
},
{
kind: shaka.msf.Utils.MessageType.PUBLISH_DONE,
msg: {
kind: shaka.msf.Utils.MessageType.PUBLISH_DONE,
requestId: 1,
code: 0,
streamCount: 5,
reason: 'Done',
},
},
{
kind: shaka.msf.Utils.MessageType.UNSUBSCRIBE,
msg: {
kind: shaka.msf.Utils.MessageType.UNSUBSCRIBE,
requestId: 1,
},
},
{
kind: shaka.msf.Utils.MessageType.PUBLISH_NAMESPACE,
msg: {
kind: shaka.msf.Utils.MessageType.PUBLISH_NAMESPACE,
requestId: 1,
namespace: ['ns'],
params: [],
},
},
{
kind: shaka.msf.Utils.MessageType.PUBLISH_NAMESPACE_OK,
msg: {
kind: shaka.msf.Utils.MessageType.PUBLISH_NAMESPACE_OK,
requestId: 1,
namespace: ['ns'],
},
},
{
kind: shaka.msf.Utils.MessageType.PUBLISH_NAMESPACE_ERROR,
msg: {
kind: shaka.msf.Utils.MessageType.PUBLISH_NAMESPACE_ERROR,
requestId: 1,
code: 500,
reason: 'Server error',
},
},
{
kind: shaka.msf.Utils.MessageType.UNPUBLISH_NAMESPACE,
msg: {
kind: shaka.msf.Utils.MessageType.UNPUBLISH_NAMESPACE,
namespace: ['ns'],
},
},
];
beforeEach(() => {
const dummyData = new Uint8Array([0x00]);
/** @type {!ReadableStream<!Uint8Array>} */
const readable = new ReadableStream({
pull: (ctrl) => {
ctrl.enqueue(dummyData);
ctrl.close();
},
});
reader = new shaka.msf.Reader(dummyData, readable);
writtenChunks = [];
/** @type {!WritableStream<!Uint8Array>} */
const writable = new WritableStream({
write: /** @param {!Uint8Array} chunk */ (chunk) => {
writtenChunks.push(chunk);
},
});
writer = new shaka.msf.Writer(writable);
controlStream = new shaka.msf.ControlStream(reader, writer);
});
for (const {kind, msg} of messages) {
it(`send() should write a ${kind} message`, async () => {
if (!isReadableStreamSupported()) {
pending('ReadableStream is not supported by the platform.');
}
if (!isWritableStreamSupported()) {
pending('WritableStream is not supported by the platform.');
}
await controlStream.send(msg);
expect(writtenChunks.length).toBe(1);
expect(writtenChunks[0].length).toBeGreaterThan(0);
});
}
});
describe('shaka.msf.ControlStreamEncoder', () => {
/** @type {!shaka.msf.ControlStreamEncoder} */
let encoder;
/** @type {!Array<!Uint8Array>} */
let writtenChunks;
/** @type {!shaka.msf.Writer} */
let writer;
const messages = [
{
kind: shaka.msf.Utils.MessageType.SUBSCRIBE,
msg: {
kind: shaka.msf.Utils.MessageType.SUBSCRIBE,
requestId: 1,
trackAlias: 1,
namespace: ['ns'],
name: 'track',
subscriberPriority: 0,
groupOrder: shaka.msf.Utils.GroupOrder.PUBLISHER,
forward: true,
filterType: shaka.msf.Utils.FilterType.NONE,
params: [],
},
},
{
kind: shaka.msf.Utils.MessageType.SUBSCRIBE_OK,
msg: {
kind: shaka.msf.Utils.MessageType.SUBSCRIBE_OK,
requestId: 1,
expires: 12345,
groupOrder: shaka.msf.Utils.GroupOrder.ASCENDING,
contentExists: false,
params: [],
},
},
{
kind: shaka.msf.Utils.MessageType.SUBSCRIBE_ERROR,
msg: {
kind: shaka.msf.Utils.MessageType.SUBSCRIBE_ERROR,
requestId: 1,
code: 404,
reason: 'Not found',
trackAlias: 1,
},
},
{
kind: shaka.msf.Utils.MessageType.PUBLISH_DONE,
msg: {
kind: shaka.msf.Utils.MessageType.PUBLISH_DONE,
requestId: 1,
code: 0,
streamCount: 5,
reason: 'Done',
},
},
{
kind: shaka.msf.Utils.MessageType.UNSUBSCRIBE,
msg: {
kind: shaka.msf.Utils.MessageType.UNSUBSCRIBE,
requestId: 1,
},
},
{
kind: shaka.msf.Utils.MessageType.PUBLISH_NAMESPACE,
msg: {
kind: shaka.msf.Utils.MessageType.PUBLISH_NAMESPACE,
requestId: 1,
namespace: ['ns'],
params: [],
},
},
{
kind: shaka.msf.Utils.MessageType.PUBLISH_NAMESPACE_OK,
msg: {
kind: shaka.msf.Utils.MessageType.PUBLISH_NAMESPACE_OK,
requestId: 1,
namespace: ['ns'],
},
},
{
kind: shaka.msf.Utils.MessageType.PUBLISH_NAMESPACE_ERROR,
msg: {
kind: shaka.msf.Utils.MessageType.PUBLISH_NAMESPACE_ERROR,
requestId: 1,
code: 500,
reason: 'Server error',
},
},
{
kind: shaka.msf.Utils.MessageType.UNPUBLISH_NAMESPACE,
msg: {
kind: shaka.msf.Utils.MessageType.UNPUBLISH_NAMESPACE,
namespace: ['ns'],
},
},
];
beforeEach(() => {
writtenChunks = [];
/** @type {!WritableStream<!Uint8Array>} */
const writable = new WritableStream({
write: /** @param {!Uint8Array} chunk */ (chunk) => {
writtenChunks.push(chunk);
},
});
writer = new shaka.msf.Writer(writable);
encoder = new shaka.msf.ControlStreamEncoder(writer);
});
for (const {kind, msg} of messages) {
it(`message() should encode a ${kind} message`, async () => {
if (!isWritableStreamSupported()) {
pending('WritableStream is not supported by the platform.');
}
await encoder.message(msg);
expect(writtenChunks.length).toBe(1);
expect(writtenChunks[0].length).toBeGreaterThan(0);
});
}
});