@norskvideo/moq-msf 0.1.5 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/catalog.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type * as Moq from "@norskvideo/moq-net";
2
- import * as z from "@zod/mini";
2
+ import * as z from "zod/mini";
3
3
  /** Zod schema for a track's wire packaging. Accepts known values or any future string. */
4
4
  export declare const PackagingSchema: z.ZodMiniUnion<readonly [z.ZodMiniEnum<{
5
5
  cmaf: "cmaf";
package/catalog.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,UAAU,CAAC;AACrC,OAAO,KAAK,CAAC,MAAM,WAAW,CAAC;AAE/B,0FAA0F;AAC1F,eAAO,MAAM,eAAe;;;;;;6BAG1B,CAAC;AAEH,4EAA4E;AAC5E,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,gFAAgF;AAChF,eAAO,MAAM,UAAU;;;;;;;6BAGrB,CAAC;AAEH,8FAA8F;AAC9F,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAiC9C,oEAAoE;AACpE,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAuB,CAAC;AAEhD,kFAAkF;AAClF,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEhD,uFAAuF;AACvF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAExB,CAAC;AAEH,2DAA2D;AAC3D,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAEpD,0EAA0E;AAC1E,eAAO,MAAM,OAAO,aAAa,CAAC;AA0BlC,sEAAsE;AACtE,wBAAgB,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAwBnD;AAED,yFAAyF;AACzF,wBAAgB,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CA2B/C;AAED,4FAA4F;AAC5F,wBAAsB,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAIrF"}
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,UAAU,CAAC;AACrC,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAE9B,0FAA0F;AAC1F,eAAO,MAAM,eAAe;;;;;;6BAG1B,CAAC;AAEH,4EAA4E;AAC5E,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,gFAAgF;AAChF,eAAO,MAAM,UAAU;;;;;;;6BAGrB,CAAC;AAEH,8FAA8F;AAC9F,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAiC9C,oEAAoE;AACpE,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAuB,CAAC;AAEhD,kFAAkF;AAClF,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEhD,uFAAuF;AACvF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAExB,CAAC;AAEH,2DAA2D;AAC3D,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAEpD,0EAA0E;AAC1E,eAAO,MAAM,OAAO,aAAa,CAAC;AA0BlC,sEAAsE;AACtE,wBAAgB,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAwBnD;AAED,yFAAyF;AACzF,wBAAgB,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CA2B/C;AAED,4FAA4F;AAC5F,wBAAsB,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAIrF"}
package/catalog.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /* @ts-self-types="./catalog.d.ts" */
2
- import * as z from "@zod/mini";
2
+ import * as z from "zod/mini";
3
3
  /** Zod schema for a track's wire packaging. Accepts known values or any future string. */
4
4
  export const PackagingSchema = z.union([
5
5
  z.enum(["loc", "cmaf", "legacy", "mediatimeline", "eventtimeline"]),
package/catalog.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as Moq from \"@moq/net\";\nimport * as z from \"@zod/mini\";\n\n/** Zod schema for a track's wire packaging. Accepts known values or any future string. */\nexport const PackagingSchema = z.union([\n\tz.enum([\"loc\", \"cmaf\", \"legacy\", \"mediatimeline\", \"eventtimeline\"]),\n\tz.string(),\n]);\n\n/** How a track's frames are packaged on the wire (e.g. \"loc\" or \"cmaf\"). */\nexport type Packaging = z.infer<typeof PackagingSchema>;\n\n/** Zod schema for a track's role. Accepts known values or any future string. */\nexport const RoleSchema = z.union([\n\tz.enum([\"video\", \"audio\", \"audiodescription\", \"caption\", \"subtitle\", \"signlanguage\"]),\n\tz.string(),\n]);\n\n/** The semantic role a track plays in the presentation (e.g. \"video\", \"audio\", \"caption\"). */\nexport type Role = z.infer<typeof RoleSchema>;\n\n// Shared track fields. This is the version-agnostic shape callers see: init data\n// is exposed inline via `initData`, regardless of how it was carried on the wire.\nconst trackShape = {\n\tname: z.string(),\n\tpackaging: PackagingSchema,\n\t// draft-00 marks isLive required but omits it on mediatimeline/eventtimeline\n\t// tracks, so accept its absence rather than reject the whole catalog.\n\tisLive: z.optional(z.boolean()),\n\trole: z.optional(RoleSchema),\n\tcodec: z.optional(z.string()),\n\twidth: z.optional(z.number()),\n\theight: z.optional(z.number()),\n\tframerate: z.optional(z.number()),\n\tsamplerate: z.optional(z.number()),\n\tchannelConfig: z.optional(z.string()),\n\tbitrate: z.optional(z.number()),\n\t// Non-standard: whether the publisher recommends temporarily avoiding this track.\n\tstalled: z.optional(z.boolean()),\n\t/** Resolved base64 initialization data (draft-01's initRef indirection is resolved away). */\n\tinitData: z.optional(z.string()),\n\trenderGroup: z.optional(z.number()),\n\taltGroup: z.optional(z.number()),\n\tmaxGrpSapStartingType: z.optional(z.number()),\n\tmaxObjSapStartingType: z.optional(z.number()),\n\n\t// Non-standard: maximum delay (ms) between consecutive frames on this track.\n\t// The player's buffer must be at least this large to avoid underruns.\n\t// Mirrors the `jitter` field in the hang catalog.\n\tjitter: z.optional(z.number()),\n};\n\n/** Zod schema describing a single track entry in an MSF catalog. */\nexport const TrackSchema = z.object(trackShape);\n\n/** A single track in an MSF catalog, including its codec and media properties. */\nexport type Track = z.infer<typeof TrackSchema>;\n\n/** Zod schema for the top-level MSF catalog: a version-agnostic snapshot of tracks. */\nexport const CatalogSchema = z.object({\n\ttracks: z.array(TrackSchema),\n});\n\n/** The MSF catalog: a snapshot of the available tracks. */\nexport type Catalog = z.infer<typeof CatalogSchema>;\n\n/** The newest MSF draft version string this package emits on the wire. */\nexport const VERSION = \"draft-01\";\n\n// --- Wire representation (internal) -----------------------------------------\n//\n// The wire format hides two things from callers: the catalog `version` (number\n// in draft-00, \"draft-XX\" string in draft-01) and init data, which draft-01\n// moved out of the track into a root `initDataList` referenced by `initRef`.\n\nconst InitDataSchema = z.object({\n\tid: z.string(),\n\ttype: z.string(),\n\tdata: z.string(),\n});\n\nconst WireTrackSchema = z.object({\n\t...trackShape,\n\tinitRef: z.optional(z.string()),\n});\n\nconst WireCatalogSchema = z.object({\n\t// draft-00 used the number 1; draft-01 uses a \"draft-XX\" string. Accept both.\n\tversion: z.union([z.literal(1), z.string()]),\n\ttracks: z.optional(z.array(WireTrackSchema)),\n\tinitDataList: z.optional(z.array(InitDataSchema)),\n});\n\n/** Serialize a catalog to its JSON wire representation (draft-01). */\nexport function encode(catalog: Catalog): Uint8Array {\n\t// Hoist inline init payloads into a shared, deduplicated initDataList and\n\t// reference each from its track via initRef (the draft-01 wire shape).\n\tconst initDataList: z.infer<typeof InitDataSchema>[] = [];\n\tconst ids = new Map<string, string>();\n\n\tconst tracks = catalog.tracks.map((track) => {\n\t\tconst { initData, ...rest } = track;\n\t\tconst wireTrack = { ...rest, isLive: rest.isLive ?? false };\n\t\tif (initData === undefined) return wireTrack;\n\n\t\tlet id = ids.get(initData);\n\t\tif (id === undefined) {\n\t\t\tid = `init${initDataList.length}`;\n\t\t\tinitDataList.push({ id, type: \"inline\", data: initData });\n\t\t\tids.set(initData, id);\n\t\t}\n\t\treturn { ...wireTrack, initRef: id };\n\t});\n\n\tconst wire: Record<string, unknown> = { version: VERSION, tracks };\n\tif (initDataList.length > 0) wire.initDataList = initDataList;\n\n\treturn new TextEncoder().encode(JSON.stringify(wire));\n}\n\n/** Parse and validate a catalog from its JSON wire representation. Throws if invalid. */\nexport function decode(raw: Uint8Array): Catalog {\n\tconst str = new TextDecoder().decode(raw);\n\ttry {\n\t\tconst wire = WireCatalogSchema.parse(JSON.parse(str));\n\n\t\t// id -> inline payload, built once so resolution is linear in the number\n\t\t// of tracks rather than tracks x entries.\n\t\tconst inline = new Map((wire.initDataList ?? []).filter((e) => e.type === \"inline\").map((e) => [e.id, e.data]));\n\n\t\tconst tracks = (wire.tracks ?? []).map(({ initRef, ...track }) => {\n\t\t\ttrack.isLive ??= false;\n\n\t\t\t// Resolve draft-01 initRef into inline initData so callers never see\n\t\t\t// the indirection. Inline initData (draft-00) is left untouched.\n\t\t\tif (track.initData === undefined && initRef !== undefined) {\n\t\t\t\t// Only inline entries are resolved here. A non-inline (e.g. `url`) initRef\n\t\t\t\t// legitimately stays undefined; the consumer fetches that init out-of-band.\n\t\t\t\ttrack.initData = inline.get(initRef);\n\t\t\t}\n\t\t\treturn track;\n\t\t});\n\n\t\treturn { tracks };\n\t} catch (error) {\n\t\tconsole.warn(\"invalid MSF catalog\", str);\n\t\tthrow error;\n\t}\n}\n\n/** Read and decode the next catalog frame from a track, or undefined if the track ended. */\nexport async function fetch(track: Moq.Track.Subscriber): Promise<Catalog | undefined> {\n\tconst frame = await track.readFrame();\n\tif (!frame) return undefined;\n\treturn decode(frame.payload);\n}\n"]}
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAE9B,0FAA0F;AAC1F,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC;IACtC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC;IACnE,CAAC,CAAC,MAAM,EAAE;CACV,CAAC,CAAC;AAKH,gFAAgF;AAChF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC;IACjC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;IACrF,CAAC,CAAC,MAAM,EAAE;CACV,CAAC,CAAC;AAKH,iFAAiF;AACjF,kFAAkF;AAClF,MAAM,UAAU,GAAG;IAClB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,SAAS,EAAE,eAAe;IAC1B,6EAA6E;IAC7E,sEAAsE;IACtE,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAC/B,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;IAC5B,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC7B,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC7B,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC9B,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACjC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACrC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC/B,kFAAkF;IAClF,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAChC,6FAA6F;IAC7F,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAChC,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACnC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAChC,qBAAqB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC7C,qBAAqB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAE7C,6EAA6E;IAC7E,sEAAsE;IACtE,kDAAkD;IAClD,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CAC9B,CAAC;AAEF,oEAAoE;AACpE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAKhD,uFAAuF;AACvF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC;CAC5B,CAAC,CAAC;AAKH,0EAA0E;AAC1E,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,CAAC;AAElC,+EAA+E;AAC/E,EAAE;AACF,+EAA+E;AAC/E,4EAA4E;AAC5E,6EAA6E;AAE7E,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;CAChB,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,GAAG,UAAU;IACb,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CAC/B,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,8EAA8E;IAC9E,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAC5C,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;CACjD,CAAC,CAAC;AAEH,sEAAsE;AACtE,MAAM,UAAU,MAAM,CAAC,OAAgB;IACtC,0EAA0E;IAC1E,uEAAuE;IACvE,MAAM,YAAY,GAAqC,EAAE,CAAC;IAC1D,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEtC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC3C,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;QACpC,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC;QAC5D,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAE7C,IAAI,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3B,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;YACtB,EAAE,GAAG,OAAO,YAAY,CAAC,MAAM,EAAE,CAAC;YAClC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC1D,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAA4B,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACnE,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC;QAAE,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IAE9D,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,MAAM,CAAC,GAAe;IACrC,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAEtD,yEAAyE;QACzE,0CAA0C;QAC1C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEhH,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE;YAChE,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC;YAEvB,qEAAqE;YACrE,iEAAiE;YACjE,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC3D,2EAA2E;gBAC3E,4EAA4E;gBAC5E,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;YACD,OAAO,KAAK,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,OAAO,EAAE,MAAM,EAAE,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;QACzC,MAAM,KAAK,CAAC;IACb,CAAC;AACF,CAAC;AAED,4FAA4F;AAC5F,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,KAA2B;IACtD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC;IACtC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC","sourcesContent":["import type * as Moq from \"@moq/net\";\nimport * as z from \"zod/mini\";\n\n/** Zod schema for a track's wire packaging. Accepts known values or any future string. */\nexport const PackagingSchema = z.union([\n\tz.enum([\"loc\", \"cmaf\", \"legacy\", \"mediatimeline\", \"eventtimeline\"]),\n\tz.string(),\n]);\n\n/** How a track's frames are packaged on the wire (e.g. \"loc\" or \"cmaf\"). */\nexport type Packaging = z.infer<typeof PackagingSchema>;\n\n/** Zod schema for a track's role. Accepts known values or any future string. */\nexport const RoleSchema = z.union([\n\tz.enum([\"video\", \"audio\", \"audiodescription\", \"caption\", \"subtitle\", \"signlanguage\"]),\n\tz.string(),\n]);\n\n/** The semantic role a track plays in the presentation (e.g. \"video\", \"audio\", \"caption\"). */\nexport type Role = z.infer<typeof RoleSchema>;\n\n// Shared track fields. This is the version-agnostic shape callers see: init data\n// is exposed inline via `initData`, regardless of how it was carried on the wire.\nconst trackShape = {\n\tname: z.string(),\n\tpackaging: PackagingSchema,\n\t// draft-00 marks isLive required but omits it on mediatimeline/eventtimeline\n\t// tracks, so accept its absence rather than reject the whole catalog.\n\tisLive: z.optional(z.boolean()),\n\trole: z.optional(RoleSchema),\n\tcodec: z.optional(z.string()),\n\twidth: z.optional(z.number()),\n\theight: z.optional(z.number()),\n\tframerate: z.optional(z.number()),\n\tsamplerate: z.optional(z.number()),\n\tchannelConfig: z.optional(z.string()),\n\tbitrate: z.optional(z.number()),\n\t// Non-standard: whether the publisher recommends temporarily avoiding this track.\n\tstalled: z.optional(z.boolean()),\n\t/** Resolved base64 initialization data (draft-01's initRef indirection is resolved away). */\n\tinitData: z.optional(z.string()),\n\trenderGroup: z.optional(z.number()),\n\taltGroup: z.optional(z.number()),\n\tmaxGrpSapStartingType: z.optional(z.number()),\n\tmaxObjSapStartingType: z.optional(z.number()),\n\n\t// Non-standard: maximum delay (ms) between consecutive frames on this track.\n\t// The player's buffer must be at least this large to avoid underruns.\n\t// Mirrors the `jitter` field in the hang catalog.\n\tjitter: z.optional(z.number()),\n};\n\n/** Zod schema describing a single track entry in an MSF catalog. */\nexport const TrackSchema = z.object(trackShape);\n\n/** A single track in an MSF catalog, including its codec and media properties. */\nexport type Track = z.infer<typeof TrackSchema>;\n\n/** Zod schema for the top-level MSF catalog: a version-agnostic snapshot of tracks. */\nexport const CatalogSchema = z.object({\n\ttracks: z.array(TrackSchema),\n});\n\n/** The MSF catalog: a snapshot of the available tracks. */\nexport type Catalog = z.infer<typeof CatalogSchema>;\n\n/** The newest MSF draft version string this package emits on the wire. */\nexport const VERSION = \"draft-01\";\n\n// --- Wire representation (internal) -----------------------------------------\n//\n// The wire format hides two things from callers: the catalog `version` (number\n// in draft-00, \"draft-XX\" string in draft-01) and init data, which draft-01\n// moved out of the track into a root `initDataList` referenced by `initRef`.\n\nconst InitDataSchema = z.object({\n\tid: z.string(),\n\ttype: z.string(),\n\tdata: z.string(),\n});\n\nconst WireTrackSchema = z.object({\n\t...trackShape,\n\tinitRef: z.optional(z.string()),\n});\n\nconst WireCatalogSchema = z.object({\n\t// draft-00 used the number 1; draft-01 uses a \"draft-XX\" string. Accept both.\n\tversion: z.union([z.literal(1), z.string()]),\n\ttracks: z.optional(z.array(WireTrackSchema)),\n\tinitDataList: z.optional(z.array(InitDataSchema)),\n});\n\n/** Serialize a catalog to its JSON wire representation (draft-01). */\nexport function encode(catalog: Catalog): Uint8Array {\n\t// Hoist inline init payloads into a shared, deduplicated initDataList and\n\t// reference each from its track via initRef (the draft-01 wire shape).\n\tconst initDataList: z.infer<typeof InitDataSchema>[] = [];\n\tconst ids = new Map<string, string>();\n\n\tconst tracks = catalog.tracks.map((track) => {\n\t\tconst { initData, ...rest } = track;\n\t\tconst wireTrack = { ...rest, isLive: rest.isLive ?? false };\n\t\tif (initData === undefined) return wireTrack;\n\n\t\tlet id = ids.get(initData);\n\t\tif (id === undefined) {\n\t\t\tid = `init${initDataList.length}`;\n\t\t\tinitDataList.push({ id, type: \"inline\", data: initData });\n\t\t\tids.set(initData, id);\n\t\t}\n\t\treturn { ...wireTrack, initRef: id };\n\t});\n\n\tconst wire: Record<string, unknown> = { version: VERSION, tracks };\n\tif (initDataList.length > 0) wire.initDataList = initDataList;\n\n\treturn new TextEncoder().encode(JSON.stringify(wire));\n}\n\n/** Parse and validate a catalog from its JSON wire representation. Throws if invalid. */\nexport function decode(raw: Uint8Array): Catalog {\n\tconst str = new TextDecoder().decode(raw);\n\ttry {\n\t\tconst wire = WireCatalogSchema.parse(JSON.parse(str));\n\n\t\t// id -> inline payload, built once so resolution is linear in the number\n\t\t// of tracks rather than tracks x entries.\n\t\tconst inline = new Map((wire.initDataList ?? []).filter((e) => e.type === \"inline\").map((e) => [e.id, e.data]));\n\n\t\tconst tracks = (wire.tracks ?? []).map(({ initRef, ...track }) => {\n\t\t\ttrack.isLive ??= false;\n\n\t\t\t// Resolve draft-01 initRef into inline initData so callers never see\n\t\t\t// the indirection. Inline initData (draft-00) is left untouched.\n\t\t\tif (track.initData === undefined && initRef !== undefined) {\n\t\t\t\t// Only inline entries are resolved here. A non-inline (e.g. `url`) initRef\n\t\t\t\t// legitimately stays undefined; the consumer fetches that init out-of-band.\n\t\t\t\ttrack.initData = inline.get(initRef);\n\t\t\t}\n\t\t\treturn track;\n\t\t});\n\n\t\treturn { tracks };\n\t} catch (error) {\n\t\tconsole.warn(\"invalid MSF catalog\", str);\n\t\tthrow error;\n\t}\n}\n\n/** Read and decode the next catalog frame from a track, or undefined if the track ended. */\nexport async function fetch(track: Moq.Track.Subscriber): Promise<Catalog | undefined> {\n\tconst frame = await track.readFrame();\n\tif (!frame) return undefined;\n\treturn decode(frame.payload);\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@norskvideo/moq-msf",
3
3
  "type": "module",
4
- "version": "0.1.5",
4
+ "version": "0.1.7",
5
5
  "description": "MSF (MOQT Streaming Format) catalog types for MoQ",
6
6
  "license": "(MIT OR Apache-2.0)",
7
7
  "repository": "github:moq-dev/moq",
@@ -13,8 +13,7 @@
13
13
  },
14
14
  "sideEffects": false,
15
15
  "dependencies": {
16
- "@zod/mini": "^4.5.4",
17
- "zod": "^4.5.4",
18
- "@norskvideo/moq-net": "^0.1.5"
16
+ "zod": "^4.4.3",
17
+ "@norskvideo/moq-net": "^0.1.7"
19
18
  }
20
19
  }