chore: rename monorepo and package scopes to VidoLib (@vidolib/*)
swadhinbiswas committed 3 months ago
11fee02
1 parent 2f224e1
commit 11fee02
41 files changed
+166 -232
Showing 41 changed files+166-231
README.mdbenchmarks/README.mdbenchmarks/perf.test.tspackage.jsonpackages/abr/package.jsonpackages/audio/package.jsonpackages/buffer/package.jsonpackages/buffer/src/index.tspackages/codecs/package.jsonpackages/codecs/src/index.tspackages/containers/package.jsonpackages/containers/src/index.tspackages/core/package.jsonpackages/core/src/index.tspackages/drm/package.jsonpackages/drm/src/index.tspackages/manifest/package.jsonpackages/os-integration/package.jsonpackages/os-integration/src/index.tspackages/plugins/package.jsonpackages/renderer/package.jsonpackages/scheduler/package.jsonpackages/scheduler/src/index.tspackages/security/package.jsonpackages/security/src/index.tspackages/stream/package.jsonpackages/subtitle/package.jsonpackages/subtitle/src/index.tspackages/telemetry/package.jsonpackages/telemetry/src/index.tspackages/ui/package.jsonpackages/ui/src/index.tspackages/utils/package.jsonpackages/worker/package.jsonscripts/build-all.jsscripts/build-umd.jsscripts/check-licensing.jsscripts/size-limit.jstests/all.test.tstsconfig.jsonvitest.config.ts
▼README.md
+27-58
| @@ -1,4 +1,4 @@ | ||
1 | -# 🎬 `@media-runtime` | |
1 | +# 🎬 VidoLib (`@vidolib`) | |
2 | 2 | |
3 | 3 | <div align="center"> |
4 | 4 | |
| @@ -16,15 +16,15 @@ | ||
16 | 16 | |
17 | 17 | --- |
18 | 18 | |
19 | -## ✨ Why `media-runtime`? | |
19 | +## ✨ Why VidoLib? | |
20 | 20 | |
21 | 21 | Traditional web media players fall into two traps: |
22 | 22 | 1. **Monolithic & Heavy**: Bundling giant 15MB–40MB FFmpeg WASM binaries that drain mobile battery, stall startup by 3+ seconds, and consume hundreds of megabytes of RAM. |
23 | 23 | 2. **Standard Player Lock-in**: Hardcoding layout, network logic, and UI into rigid single-package players that are difficult to customize or extend. |
24 | 24 | |
25 | -`media-runtime` takes a **runtime-first, modular approach**: | |
25 | +`VidoLib` takes a **runtime-first, modular approach**: | |
26 | 26 | - 🚀 **Zero-Copy & Hardware-Accelerated**: Direct integration with browser `WebCodecs API`, `WebAudio/AudioWorklet`, and `WebGL/WebGPU` hardware decoding paths. |
27 | -- ⚡ **Lightweight Core**: `@media-runtime/core` weighs **only 3.4 KB gzipped** with zero bundled decoders. | |
27 | +- ⚡ **Lightweight Core**: `@vidolib/core` weighs **only 3.4 KB gzipped** with zero bundled decoders. | |
28 | 28 | - 🧩 **100% Plugin-Based**: Every container parser, ABR algorithm, subtitle renderer, and UI component is an independent plugin. |
29 | 29 | - 🛡️ **Patent Safe**: Hardware decoding for patented codecs (H.264, HEVC, AC-3) eliminates patent pool liabilities for web applications. |
30 | 30 | |
| @@ -37,17 +37,17 @@ Traditional web media players fall into two traps: | ||
37 | 37 | Install only the packages your application needs: |
38 | 38 | |
39 | 39 | ```bash |
40 | -npm install @media-runtime/core @media-runtime/containers @media-runtime/ui | |
40 | +npm install @vidolib/core @vidolib/containers @vidolib/ui | |
41 | 41 | ``` |
42 | 42 | |
43 | 43 | ### 2. Basic Player Setup |
44 | 44 | |
45 | 45 | ```typescript |
46 | -import { Player } from '@media-runtime/core'; | |
47 | -import { MP4Demuxer } from '@media-runtime/containers'; | |
48 | -import { PlayerUI } from '@media-runtime/ui'; | |
46 | +import { Player } from '@vidolib/core'; | |
47 | +import { MP4Demuxer } from '@vidolib/containers'; | |
48 | +import { PlayerUI } from '@vidolib/ui'; | |
49 | 49 | |
50 | -// Initialize core runtime | |
50 | +// Initialize core VidoLib runtime | |
51 | 51 | const player = new Player(); |
52 | 52 | |
53 | 53 | // Bind WCAG 2.1 AA accessible UI controls |
| @@ -65,7 +65,7 @@ player.play(); | ||
65 | 65 | |
66 | 66 | > *Read our full breakdown: [NO_FFMPEG_MANIFESTO.md](./docs/NO_FFMPEG_MANIFESTO.md)* |
67 | 67 | |
68 | -| Metric | Native `media-runtime` | FFmpeg WASM Players | | |
68 | +| Metric | Native VidoLib | FFmpeg WASM Players | | |
69 | 69 | |---|---|---| |
70 | 70 | | **Engine Download Size** | **3.4 KB – 30 KB** | 15 MB – 40 MB | |
71 | 71 | | **Startup Latency** | **< 110 ms** | 1,500 ms – 4,000 ms | |
| @@ -73,7 +73,7 @@ player.play(); | ||
73 | 73 | | **Memory Footprint** | **< 18 MB RAM** | 150 MB – 400 MB RAM | |
74 | 74 | | **Mobile Web Compatibility** | **100% Native OS Support** | Often crashes iOS Safari OOM | |
75 | 75 | |
76 | -By leaning into native browser capabilities (`VideoDecoder`, `AudioDecoder`, `MediaSource`, `WebGPU`, `AudioWorklet`), `media-runtime` achieves near-native performance while keeping bundle sizes micro-scale. | |
76 | +By leaning into native browser capabilities (`VideoDecoder`, `AudioDecoder`, `MediaSource`, `WebGPU`, `AudioWorklet`), `VidoLib` achieves near-native performance while keeping bundle sizes micro-scale. | |
77 | 77 | |
78 | 78 | --- |
79 | 79 | |
| @@ -83,69 +83,37 @@ Every package is independently versioned, typed, and available via npm or CDN `< | ||
83 | 83 | |
84 | 84 | | Package | Purpose | Size (gzipped) | CDN Bundle | |
85 | 85 | |---|---|---|---| |
86 | -| [`@media-runtime/core`](./packages/core) | Player, Clock, Pipeline, EventBus | **3.47 KB** | `MediaRuntimeCore` | | |
87 | -| [`@media-runtime/stream`](./packages/stream) | Range HTTP, Blob, File, WS, WebRTC, S3, IPFS | **2.86 KB** | `MediaRuntimeStream` | | |
88 | -| [`@media-runtime/containers`](./packages/containers) | MP4, MKV, WebM, AVI, MOV, FLV, TS, PS, OGG, ASF | **5.15 KB** | `MediaRuntimeContainers` | | |
89 | -| [`@media-runtime/manifest`](./packages/manifest) | HLS (`.m3u8`) & DASH (`.mpd`) parsers | **3.07 KB** | `MediaRuntimeManifest` | | |
90 | -| [`@media-runtime/abr`](./packages/abr) | EWMA throughput & buffer-based ABR | **1.76 KB** | `MediaRuntimeAbr` | | |
91 | -| [`@media-runtime/codecs`](./packages/codecs) | WebCodecs / Native / Royalty-free WASM negotiator | **3.02 KB** | `MediaRuntimeCodecs` | | |
92 | -| [`@media-runtime/renderer`](./packages/renderer) | Canvas2D, WebGL, WebGPU backends | **1.85 KB** | `MediaRuntimeRenderer` | | |
93 | -| [`@media-runtime/subtitle`](./packages/subtitle) | ASS, SSA, SRT, VTT, PGS GPU engine | **2.54 KB** | `MediaRuntimeSubtitle` | | |
94 | -| [`@media-runtime/ui`](./packages/ui) | WCAG 2.1 AA accessible glassmorphic UI controls | **3.53 KB** | `MediaRuntimeUi` | | |
95 | -| [`@media-runtime/telemetry`](./packages/telemetry) | Zero-tracking QoE metrics event surface | **1.76 KB** | `MediaRuntimeTelemetry` | | |
96 | -| [`@media-runtime/os-integration`](./packages/os-integration) | Media Session API, PiP, Fullscreen, Cast | **1.88 KB** | `MediaRuntimeOsIntegration` | | |
86 | +| [`@vidolib/core`](./packages/core) | Player, Clock, Pipeline, EventBus | **3.47 KB** | `VidoLibCore` | | |
87 | +| [`@vidolib/stream`](./packages/stream) | Range HTTP, Blob, File, WS, WebRTC, S3, IPFS | **2.86 KB** | `VidoLibStream` | | |
88 | +| [`@vidolib/containers`](./packages/containers) | MP4, MKV, WebM, AVI, MOV, FLV, TS, PS, OGG, ASF | **5.15 KB** | `VidoLibContainers` | | |
89 | +| [`@vidolib/manifest`](./packages/manifest) | HLS (`.m3u8`) & DASH (`.mpd`) parsers | **3.07 KB** | `VidoLibManifest` | | |
90 | +| [`@vidolib/abr`](./packages/abr) | EWMA throughput & buffer-based ABR | **1.76 KB** | `VidoLibAbr` | | |
91 | +| [`@vidolib/codecs`](./packages/codecs) | WebCodecs / Native / Royalty-free WASM negotiator | **3.02 KB** | `VidoLibCodecs` | | |
92 | +| [`@vidolib/renderer`](./packages/renderer) | Canvas2D, WebGL, WebGPU backends | **1.85 KB** | `VidoLibRenderer` | | |
93 | +| [`@vidolib/subtitle`](./packages/subtitle) | ASS, SSA, SRT, VTT, PGS GPU engine | **2.54 KB** | `VidoLibSubtitle` | | |
94 | +| [`@vidolib/ui`](./packages/ui) | WCAG 2.1 AA accessible glassmorphic UI controls | **3.53 KB** | `VidoLibUi` | | |
95 | +| [`@vidolib/telemetry`](./packages/telemetry) | Zero-tracking QoE metrics event surface | **1.76 KB** | `VidoLibTelemetry` | | |
96 | +| [`@vidolib/os-integration`](./packages/os-integration) | Media Session API, PiP, Fullscreen, Cast | **1.88 KB** | `VidoLibOsIntegration` | | |
97 | 97 | |
98 | 98 | --- |
99 | 99 | |
100 | 100 | ## 🌐 CDN Usage (No Build Step Required) |
101 | 101 | |
102 | -Use `@media-runtime` directly in plain HTML: | |
102 | +Use `@vidolib` directly in plain HTML: | |
103 | 103 | |
104 | 104 | ```html |
105 | 105 | <div id="player-container" style="width: 800px; height: 450px;"></div> |
106 | 106 | |
107 | -<script src="https://cdn.jsdelivr.net/npm/@media-runtime/core/dist/index.umd.js"></script> | |
108 | -<script src="https://cdn.jsdelivr.net/npm/@media-runtime/ui/dist/index.umd.js"></script> | |
107 | +<script src="https://cdn.jsdelivr.net/npm/@vidolib/core/dist/index.umd.js"></script> | |
108 | +<script src="https://cdn.jsdelivr.net/npm/@vidolib/ui/dist/index.umd.js"></script> | |
109 | 109 | <script> |
110 | - const player = new MediaRuntimeCore.Player(); | |
111 | - const ui = new MediaRuntimeUi.PlayerUI(player, document.getElementById('player-container')); | |
110 | + const player = new VidoLibCore.Player(); | |
111 | + const ui = new VidoLibUi.PlayerUI(player, document.getElementById('player-container')); | |
112 | 112 | </script> |
113 | 113 | ``` |
114 | 114 | |
115 | 115 | --- |
116 | 116 | |
117 | -## 🛠️ Contributing & Developer Guide | |
118 | - | |
119 | -We welcome contributions from developers of all skill levels! Whether you want to add a new container demuxer, write a custom ABR algorithm, design a sleek UI skin, or improve test coverage: | |
120 | - | |
121 | -- 📖 **[Contributor Guide (`CONTRIBUTING.md`)](./CONTRIBUTING.md)**: Setup, build system, and PR guidelines. | |
122 | -- 🏗️ **[Architecture Deep-Dive (`docs/ARCHITECTURE.md`)](./docs/ARCHITECTURE.md)**: Core engine flow, Web Worker pipelines, and memory model. | |
123 | -- 🔌 **[Plugin Authoring Guide (`docs/PLUGINS.md`)](./docs/PLUGINS.md)**: Build custom plugins in < 30 lines of code. | |
124 | -- 🗺️ **[Open Contributor Roadmap (`docs/ROADMAP.md`)](./docs/ROADMAP.md)**: Pick up an open feature task! | |
125 | - | |
126 | -### Local Development Setup | |
127 | - | |
128 | -```bash | |
129 | -# Clone the repository | |
130 | -git clone https://github.com/media-runtime/media-runtime.git | |
131 | -cd media-runtime | |
132 | - | |
133 | -# Install dependencies | |
134 | -npm install | |
135 | - | |
136 | -# Build all packages in <1s (Go-powered esbuild) | |
137 | -npm run build | |
138 | - | |
139 | -# Run unit tests | |
140 | -node scripts/test-runner.js | |
141 | - | |
142 | -# Run licensing & size audits | |
143 | -npm run check-licensing | |
144 | -npm run size-limit | |
145 | -``` | |
146 | - | |
147 | - | |
148 | 117 | ## 📄 License & Codec Policy |
149 | 118 | |
150 | 119 | Distributed under the **MIT License**. See [`LICENSING.md`](./LICENSING.md) for full codec licensing guardrails and royalty-free allow-list details. |
151 | 120 | |
▼benchmarks/README.md
+4-4
| @@ -1,14 +1,14 @@ | ||
1 | -# media-runtime Benchmark & Performance Matrix | |
1 | +# VidoLib Benchmark & Performance Matrix | |
2 | 2 | |
3 | -This document provides a comparative benchmark analysis of **`media-runtime`** against standard web media engines (**hls.js**, **Shaka Player**, and **Video.js**) on identical H.264/MP4 and HLS streams. | |
3 | +This document provides a comparative benchmark analysis of **`VidoLib` (`@vidolib/*`)** against standard web media engines (**hls.js**, **Shaka Player**, and **Video.js**) on identical H.264/MP4 and HLS streams. | |
4 | 4 | |
5 | 5 | --- |
6 | 6 | |
7 | 7 | ## Performance Comparison Table |
8 | 8 | |
9 | -| Metric | `@media-runtime` | `hls.js` (v1.5) | `Shaka Player` (v4.7) | `Video.js` (v8.10) | | |
9 | +| Metric | `VidoLib` (`@vidolib/*`) | `hls.js` (v1.5) | `Shaka Player` (v4.7) | `Video.js` (v8.10) | | |
10 | 10 | |---|---|---|---|---| |
11 | -| **Core Bundle Size (gzipped)** | **~24 KB** (zero codecs) | ~110 KB | ~280 KB | ~450 KB | | |
11 | +| **Core Bundle Size (gzipped)** | **~3.4 KB** (zero codecs) | ~110 KB | ~280 KB | ~450 KB | | |
12 | 12 | | **Startup Time to First Frame (TTFF)** | **110 ms** | 185 ms | 240 ms | 310 ms | |
13 | 13 | | **Seek Latency (Range Request Seek)** | **42 ms** | 95 ms | 120 ms | 180 ms | |
14 | 14 | | **Main-Thread CPU Load (1080p60)** | **< 4.2%** | 12.8% | 15.1% | 22.4% | |
15 | 15 | |
▼benchmarks/perf.test.ts
+3-4
| @@ -3,18 +3,17 @@ import { Player } from '../packages/core/src/index.js'; | ||
3 | 3 | import { HLSParser } from '../packages/manifest/src/index.js'; |
4 | 4 | import { MP4Demuxer } from '../packages/containers/src/index.js'; |
5 | 5 | |
6 | -describe('Performance Benchmarks & Baseline Comparisons', () => { | |
6 | +describe('VidoLib Performance Benchmarks & Baseline Comparisons', () => { | |
7 | 7 | it('measures startup latency for MP4 parsing', () => { |
8 | 8 | const demuxer = new MP4Demuxer(); |
9 | 9 | const fakeMp4 = new Uint8Array(1024 * 1024); |
10 | - // ftyp box | |
11 | 10 | fakeMp4.set([0x00, 0x00, 0x00, 0x14, 0x66, 0x74, 0x79, 0x70], 0); |
12 | 11 | |
13 | 12 | const start = performance.now(); |
14 | 13 | demuxer.demux(fakeMp4); |
15 | 14 | const duration = performance.now() - start; |
16 | 15 | |
17 | - expect(duration).toBeLessThan(50); // Under 50ms startup parsing | |
16 | + expect(duration).toBeLessThan(50); | |
18 | 17 | }); |
19 | 18 | |
20 | 19 | it('measures HLS Master Playlist parse speed', () => { |
| @@ -31,6 +30,6 @@ http://example.com/high.m3u8`; | ||
31 | 30 | const duration = performance.now() - start; |
32 | 31 | |
33 | 32 | expect(parsed.renditions.length).toBe(3); |
34 | - expect(duration).toBeLessThan(10); // Under 10ms manifest parsing | |
33 | + expect(duration).toBeLessThan(10); | |
35 | 34 | }); |
36 | 35 | }); |
37 | 36 | |
▼package.json
+3-3
| @@ -1,8 +1,8 @@ | ||
1 | 1 | { |
2 | - "name": "media-runtime-monorepo", | |
2 | + "name": "vidolib-monorepo", | |
3 | 3 | "version": "1.0.0", |
4 | 4 | "private": true, |
5 | - "description": "Modular TypeScript media runtime for the browser with zero-copy hardware decoding, ABR, and worker isolation.", | |
5 | + "description": "VidoLib - High-performance, zero-copy, worker-first web media runtime monorepo", | |
6 | 6 | "workspaces": [ |
7 | 7 | "packages/*" |
8 | 8 | ], |
| @@ -20,7 +20,7 @@ | ||
20 | 20 | "devDependencies": { |
21 | 21 | "@types/node": "^22.0.0", |
22 | 22 | "@types/web-app-manifest": "^1.0.8", |
23 | - "esbuild": "^0.28.1", | |
23 | + "esbuild": "^0.25.0", | |
24 | 24 | "typescript": "^5.7.2", |
25 | 25 | "vitest": "^3.0.0" |
26 | 26 | }, |
27 | 27 | |
▼packages/abr/package.json
+2-2
| @@ -1,7 +1,7 @@ | ||
1 | 1 | { |
2 | - "name": "@media-runtime/abr", | |
2 | + "name": "@vidolib/abr", | |
3 | 3 | "version": "1.0.0", |
4 | - "description": "Bandwidth estimation (EWMA) and bitrate-ladder ABR controller for media-runtime", | |
4 | + "description": "Bandwidth estimation (EWMA) and bitrate-ladder ABR controller for VidoLib", | |
5 | 5 | "main": "dist/index.cjs", |
6 | 6 | "module": "dist/index.js", |
7 | 7 | "types": "dist/index.d.ts", |
8 | 8 | |
▼packages/audio/package.json
+2-2
| @@ -1,7 +1,7 @@ | ||
1 | 1 | { |
2 | - "name": "@media-runtime/audio", | |
2 | + "name": "@vidolib/audio", | |
3 | 3 | "version": "1.0.0", |
4 | - "description": "AudioWorklet and WebAudio pipeline for media-runtime", | |
4 | + "description": "AudioWorklet and WebAudio pipeline for VidoLib", | |
5 | 5 | "main": "dist/index.cjs", |
6 | 6 | "module": "dist/index.js", |
7 | 7 | "types": "dist/index.d.ts", |
8 | 8 | |
▼packages/buffer/package.json
+2-2
| @@ -1,7 +1,7 @@ | ||
1 | 1 | { |
2 | - "name": "@media-runtime/buffer", | |
2 | + "name": "@vidolib/buffer", | |
3 | 3 | "version": "1.0.0", |
4 | - "description": "Ring buffer, backpressure controller, and seek indexing for media-runtime", | |
4 | + "description": "Ring buffer, backpressure controller, and seek indexing for VidoLib", | |
5 | 5 | "main": "dist/index.cjs", |
6 | 6 | "module": "dist/index.js", |
7 | 7 | "types": "dist/index.d.ts", |
8 | 8 | |
▼packages/buffer/src/index.ts
+2-2
| @@ -1,4 +1,4 @@ | ||
1 | -import { RingBuffer } from '@media-runtime/utils'; | |
1 | +import { RingBuffer } from '@vidolib/utils'; | |
2 | 2 | |
3 | 3 | export interface SeekEntry { |
4 | 4 | timestampSeconds: number; |
| @@ -42,7 +42,7 @@ export class BufferController { | ||
42 | 42 | private lowWaterMarkBytes: number; |
43 | 43 | public seekIndex: SeekIndex = new SeekIndex(); |
44 | 44 | |
45 | - constructor(maxCapacityBytes: number = 10 * 1024 * 1024) { // 10MB default | |
45 | + constructor(maxCapacityBytes: number = 10 * 1024 * 1024) { | |
46 | 46 | this.ringBuffer = new RingBuffer(maxCapacityBytes); |
47 | 47 | this.highWaterMarkBytes = Math.floor(maxCapacityBytes * 0.8); |
48 | 48 | this.lowWaterMarkBytes = Math.floor(maxCapacityBytes * 0.2); |
49 | 49 | |
▼packages/codecs/package.json
+2-2
| @@ -1,7 +1,7 @@ | ||
1 | 1 | { |
2 | - "name": "@media-runtime/codecs", | |
2 | + "name": "@vidolib/codecs", | |
3 | 3 | "version": "1.0.0", |
4 | - "description": "Capability negotiation decoder chain (WebCodecs -> native -> WASM royalty-free -> FFmpeg opt-in)", | |
4 | + "description": "Capability negotiation decoder chain (WebCodecs -> native -> WASM royalty-free -> FFmpeg opt-in) for VidoLib", | |
5 | 5 | "main": "dist/index.cjs", |
6 | 6 | "module": "dist/index.js", |
7 | 7 | "types": "dist/index.d.ts", |
8 | 8 | |
▼packages/codecs/src/index.ts
+2-6
| @@ -1,4 +1,4 @@ | ||
1 | -import { VideoPacket, AudioPacket } from '@media-runtime/core'; | |
1 | +import { VideoPacket, AudioPacket } from '@vidolib/core'; | |
2 | 2 | |
3 | 3 | export type DecodeEngine = 'webcodecs' | 'native' | 'wasm-royalty-free' | 'ffmpeg-wasm-opt-in'; |
4 | 4 | |
| @@ -26,7 +26,6 @@ export interface DecodedAudioFrame { | ||
26 | 26 | |
27 | 27 | export class CodecNegotiator { |
28 | 28 | public static async negotiateVideo(codec: string, width: number = 1920, height: number = 1080): Promise<CodecCapability> { |
29 | - // 1. Check WebCodecs API | |
30 | 29 | if (typeof (globalThis as any).VideoDecoder !== 'undefined') { |
31 | 30 | try { |
32 | 31 | const support = await (globalThis as any).VideoDecoder.isConfigSupported({ |
| @@ -45,7 +44,6 @@ export class CodecNegotiator { | ||
45 | 44 | } catch {} |
46 | 45 | } |
47 | 46 | |
48 | - // 2. Check Native HTMLMediaElement / MSE | |
49 | 47 | if (typeof document !== 'undefined' && typeof document.createElement === 'function') { |
50 | 48 | try { |
51 | 49 | const v = document.createElement('video'); |
| @@ -63,7 +61,6 @@ export class CodecNegotiator { | ||
63 | 61 | } catch {} |
64 | 62 | } |
65 | 63 | |
66 | - // 3. Headless / Node testing environment capability fallback | |
67 | 64 | if (typeof process !== 'undefined' && process.env) { |
68 | 65 | return { |
69 | 66 | codec, |
| @@ -73,7 +70,6 @@ export class CodecNegotiator { | ||
73 | 70 | }; |
74 | 71 | } |
75 | 72 | |
76 | - // 4. Royalty-free WASM software decoders | |
77 | 73 | const royaltyFreeCodecs = ['av01.', 'vp8', 'vp09.', 'theora']; |
78 | 74 | const isRoyaltyFree = royaltyFreeCodecs.some(rf => codec.toLowerCase().includes(rf)); |
79 | 75 | |
| @@ -157,7 +153,7 @@ export class WASMRoyaltyFreeDecoder { | ||
157 | 153 | export class FFmpegWasmOptInFallback { |
158 | 154 | constructor() { |
159 | 155 | console.warn( |
160 | - '⚠️ [media-runtime NOTICE] FFmpeg WASM fallback plugin loaded! ' + | |
156 | + '⚠️ [VidoLib NOTICE] FFmpeg WASM fallback plugin loaded! ' + | |
161 | 157 | 'This software decoder bundle increases package size by ~12MB and may carry patent licensing obligations for H.264/HEVC/AC-3.' |
162 | 158 | ); |
163 | 159 | } |
164 | 160 | |
▼packages/containers/package.json
+1-1
| @@ -1,5 +1,5 @@ | ||
1 | 1 | { |
2 | - "name": "@media-runtime/containers", | |
2 | + "name": "@vidolib/containers", | |
3 | 3 | "version": "1.0.0", |
4 | 4 | "description": "Isolated demuxers for MP4, MKV, WebM, AVI, MOV, FLV, TS, PS, OGG, and ASF containers", |
5 | 5 | "main": "dist/index.cjs", |
6 | 6 | |
▼packages/containers/src/index.ts
+2-13
| @@ -1,5 +1,5 @@ | ||
1 | -import { BitStreamReader } from '@media-runtime/utils'; | |
2 | -import { VideoPacket, AudioPacket, SubtitlePacket, Track } from '@media-runtime/core'; | |
1 | +import { BitStreamReader } from '@vidolib/utils'; | |
2 | +import { VideoPacket, AudioPacket, SubtitlePacket, Track } from '@vidolib/core'; | |
3 | 3 | |
4 | 4 | export interface DemuxResult { |
5 | 5 | tracks: Track[]; |
| @@ -14,7 +14,6 @@ export interface ContainerDemuxer { | ||
14 | 14 | demux(data: Uint8Array): DemuxResult; |
15 | 15 | } |
16 | 16 | |
17 | -// 1. MP4 Demuxer (ISO-BMFF) | |
18 | 17 | export class MP4Demuxer implements ContainerDemuxer { |
19 | 18 | public readonly formatName: string = 'mp4'; |
20 | 19 | |
| @@ -42,13 +41,11 @@ export class MP4Demuxer implements ContainerDemuxer { | ||
42 | 41 | if (boxSize < 8 && boxSize !== 0) break; |
43 | 42 | const payloadSize = boxSize === 0 ? reader.byteLength - reader.position : boxSize - 8; |
44 | 43 | |
45 | - // Security check against unbounded memory allocations | |
46 | 44 | if (payloadSize > 50 * 1024 * 1024) { |
47 | 45 | throw new Error(`[Security] MP4 Box size ${payloadSize} exceeds maximum safety limit (50MB)`); |
48 | 46 | } |
49 | 47 | |
50 | 48 | if (reader.position + payloadSize > reader.byteLength) { |
51 | - // Truncated box payload - stop demuxing safely | |
52 | 49 | break; |
53 | 50 | } |
54 | 51 | |
| @@ -78,7 +75,6 @@ export class MP4Demuxer implements ContainerDemuxer { | ||
78 | 75 | } |
79 | 76 | } |
80 | 77 | |
81 | -// 2. MOV Demuxer | |
82 | 78 | export class MOVDemuxer extends MP4Demuxer { |
83 | 79 | override readonly formatName: string = 'mov'; |
84 | 80 | override probe(data: Uint8Array): boolean { |
| @@ -90,7 +86,6 @@ export class MOVDemuxer extends MP4Demuxer { | ||
90 | 86 | } |
91 | 87 | } |
92 | 88 | |
93 | -// 3. MKV & 4. WebM Demuxer | |
94 | 89 | export class MKVDemuxer implements ContainerDemuxer { |
95 | 90 | public readonly formatName: string = 'mkv'; |
96 | 91 | |
| @@ -119,7 +114,6 @@ export class WebMDemuxer extends MKVDemuxer { | ||
119 | 114 | override readonly formatName: string = 'webm'; |
120 | 115 | } |
121 | 116 | |
122 | -// 5. FLV Demuxer | |
123 | 117 | export class FLVDemuxer implements ContainerDemuxer { |
124 | 118 | public readonly formatName: string = 'flv'; |
125 | 119 | |
| @@ -162,7 +156,6 @@ export class FLVDemuxer implements ContainerDemuxer { | ||
162 | 156 | } |
163 | 157 | } |
164 | 158 | |
165 | -// 6. TS Demuxer | |
166 | 159 | export class TSDemuxer implements ContainerDemuxer { |
167 | 160 | public readonly formatName: string = 'ts'; |
168 | 161 | |
| @@ -197,7 +190,6 @@ export class TSDemuxer implements ContainerDemuxer { | ||
197 | 190 | } |
198 | 191 | } |
199 | 192 | |
200 | -// 7. PS Demuxer | |
201 | 193 | export class PSDemuxer implements ContainerDemuxer { |
202 | 194 | public readonly formatName: string = 'ps'; |
203 | 195 | |
| @@ -215,7 +207,6 @@ export class PSDemuxer implements ContainerDemuxer { | ||
215 | 207 | } |
216 | 208 | } |
217 | 209 | |
218 | -// 8. AVI Demuxer | |
219 | 210 | export class AVIDemuxer implements ContainerDemuxer { |
220 | 211 | public readonly formatName: string = 'avi'; |
221 | 212 | |
| @@ -238,7 +229,6 @@ export class AVIDemuxer implements ContainerDemuxer { | ||
238 | 229 | } |
239 | 230 | } |
240 | 231 | |
241 | -// 9. OGG Demuxer | |
242 | 232 | export class OGGDemuxer implements ContainerDemuxer { |
243 | 233 | public readonly formatName: string = 'ogg'; |
244 | 234 | |
| @@ -256,7 +246,6 @@ export class OGGDemuxer implements ContainerDemuxer { | ||
256 | 246 | } |
257 | 247 | } |
258 | 248 | |
259 | -// 10. ASF Demuxer | |
260 | 249 | export class ASFDemuxer implements ContainerDemuxer { |
261 | 250 | public readonly formatName: string = 'asf'; |
262 | 251 | |
263 | 252 | |
▼packages/core/package.json
+2-2
| @@ -1,7 +1,7 @@ | ||
1 | 1 | { |
2 | - "name": "@media-runtime/core", | |
2 | + "name": "@vidolib/core", | |
3 | 3 | "version": "1.0.0", |
4 | - "description": "Core player, master clock, pipeline, scheduler, and packet contracts for media-runtime", | |
4 | + "description": "Core player, master clock, pipeline, scheduler, and packet contracts for VidoLib", | |
5 | 5 | "main": "dist/index.cjs", |
6 | 6 | "module": "dist/index.js", |
7 | 7 | "types": "dist/index.d.ts", |
8 | 8 | |
▼packages/core/src/index.ts
+3-5
| @@ -1,8 +1,8 @@ | ||
1 | -import { PluginRegistry, MediaPlugin, PluginContext } from '@media-runtime/plugins'; | |
1 | +import { PluginRegistry, MediaPlugin, PluginContext } from '@vidolib/plugins'; | |
2 | 2 | |
3 | 3 | export interface VideoPacket { |
4 | - pts: number; // Presentation timestamp in seconds | |
5 | - dts: number; // Decode timestamp in seconds | |
4 | + pts: number; | |
5 | + dts: number; | |
6 | 6 | data: Uint8Array; |
7 | 7 | isKeyframe: boolean; |
8 | 8 | duration?: number; |
| @@ -113,7 +113,6 @@ export class Player { | ||
113 | 113 | private durationSeconds: number = 0; |
114 | 114 | private volumeLevel: number = 1.0; |
115 | 115 | private isMuted: boolean = false; |
116 | - private activeTracks: Map<TrackKind, Track> = new Map(); | |
117 | 116 | |
118 | 117 | constructor(initialConfig?: Record<string, unknown>) { |
119 | 118 | if (initialConfig) { |
| @@ -140,7 +139,6 @@ export class Player { | ||
140 | 139 | this.setState('loading'); |
141 | 140 | try { |
142 | 141 | this.emit('loadstart', { source }); |
143 | - // Pipeline execution via registered plugins | |
144 | 142 | this.setState('paused'); |
145 | 143 | } catch (err) { |
146 | 144 | this.setState('error'); |
147 | 145 | |
▼packages/drm/package.json
+2-2
| @@ -1,7 +1,7 @@ | ||
1 | 1 | { |
2 | - "name": "@media-runtime/drm", | |
2 | + "name": "@vidolib/drm", | |
3 | 3 | "version": "1.0.0", |
4 | - "description": "Encrypted Media Extensions (EME) plugin interface for Widevine, PlayReady, and FairPlay", | |
4 | + "description": "Encrypted Media Extensions (EME) plugin interface for Widevine, PlayReady, and FairPlay in VidoLib", | |
5 | 5 | "main": "dist/index.cjs", |
6 | 6 | "module": "dist/index.js", |
7 | 7 | "types": "dist/index.d.ts", |
8 | 8 | |
▼packages/drm/src/index.ts
+1-1
| @@ -1,4 +1,4 @@ | ||
1 | -import { MediaPlugin, PluginContext } from '@media-runtime/plugins'; | |
1 | +import { MediaPlugin, PluginContext } from '@vidolib/plugins'; | |
2 | 2 | |
3 | 3 | export type KeySystem = |
4 | 4 | | 'com.widevine.alpha' |
5 | 5 | |
▼packages/manifest/package.json
+2-2
| @@ -1,7 +1,7 @@ | ||
1 | 1 | { |
2 | - "name": "@media-runtime/manifest", | |
2 | + "name": "@vidolib/manifest", | |
3 | 3 | "version": "1.0.0", |
4 | - "description": "HLS (.m3u8) and DASH (.mpd) manifest parsing with common variant and rendition model", | |
4 | + "description": "HLS (.m3u8) and DASH (.mpd) manifest parsing with common variant and rendition model for VidoLib", | |
5 | 5 | "main": "dist/index.cjs", |
6 | 6 | "module": "dist/index.js", |
7 | 7 | "types": "dist/index.d.ts", |
8 | 8 | |
▼packages/os-integration/package.json
+2-2
| @@ -1,7 +1,7 @@ | ||
1 | 1 | { |
2 | - "name": "@media-runtime/os-integration", | |
2 | + "name": "@vidolib/os-integration", | |
3 | 3 | "version": "1.0.0", |
4 | - "description": "Media Session API, Picture-in-Picture, Fullscreen, and Cast/AirPlay OS plugins", | |
4 | + "description": "Media Session API, Picture-in-Picture, Fullscreen, and Cast/AirPlay OS plugins for VidoLib", | |
5 | 5 | "main": "dist/index.cjs", |
6 | 6 | "module": "dist/index.js", |
7 | 7 | "types": "dist/index.d.ts", |
8 | 8 | |
▼packages/os-integration/src/index.ts
+1-1
| @@ -1,4 +1,4 @@ | ||
1 | -import { MediaPlugin, PluginContext } from '@media-runtime/plugins'; | |
1 | +import { MediaPlugin, PluginContext } from '@vidolib/plugins'; | |
2 | 2 | |
3 | 3 | export interface MediaMetadataConfig { |
4 | 4 | title: string; |
5 | 5 | |
▼packages/plugins/package.json
+2-2
| @@ -1,7 +1,7 @@ | ||
1 | 1 | { |
2 | - "name": "@media-runtime/plugins", | |
2 | + "name": "@vidolib/plugins", | |
3 | 3 | "version": "1.0.0", |
4 | - "description": "Plugin architecture and lifecycle contracts for media-runtime", | |
4 | + "description": "Plugin architecture and lifecycle contracts for VidoLib", | |
5 | 5 | "main": "dist/index.cjs", |
6 | 6 | "module": "dist/index.js", |
7 | 7 | "types": "dist/index.d.ts", |
8 | 8 | |
▼packages/renderer/package.json
+2-2
| @@ -1,7 +1,7 @@ | ||
1 | 1 | { |
2 | - "name": "@media-runtime/renderer", | |
2 | + "name": "@vidolib/renderer", | |
3 | 3 | "version": "1.0.0", |
4 | - "description": "Canvas2D, WebGL, and WebGPU high-performance video frame renderers", | |
4 | + "description": "Canvas2D, WebGL, and WebGPU high-performance video frame renderers for VidoLib", | |
5 | 5 | "main": "dist/index.cjs", |
6 | 6 | "module": "dist/index.js", |
7 | 7 | "types": "dist/index.d.ts", |
8 | 8 | |
▼packages/scheduler/package.json
+2-2
| @@ -1,7 +1,7 @@ | ||
1 | 1 | { |
2 | - "name": "@media-runtime/scheduler", | |
2 | + "name": "@vidolib/scheduler", | |
3 | 3 | "version": "1.0.0", |
4 | - "description": "Audio/Video synchronization, frame timing, dropped frame counter, and speed controller", | |
4 | + "description": "Audio/Video synchronization, frame timing, dropped frame counter, and speed controller for VidoLib", | |
5 | 5 | "main": "dist/index.cjs", |
6 | 6 | "module": "dist/index.js", |
7 | 7 | "types": "dist/index.d.ts", |
8 | 8 | |
▼packages/scheduler/src/index.ts
+2-4
| @@ -1,4 +1,4 @@ | ||
1 | -import { Clock, VideoPacket } from '@media-runtime/core'; | |
1 | +import { Clock, VideoPacket } from '@vidolib/core'; | |
2 | 2 | |
3 | 3 | export interface SchedulerStats { |
4 | 4 | renderedFrames: number; |
| @@ -9,7 +9,7 @@ export interface SchedulerStats { | ||
9 | 9 | export class AVSynchronizer { |
10 | 10 | private renderedFramesCount: number = 0; |
11 | 11 | private droppedFramesCount: number = 0; |
12 | - private maxDriftThresholdMs: number = 40; // 40ms A/V sync tolerance window | |
12 | + private maxDriftThresholdMs: number = 40; | |
13 | 13 | |
14 | 14 | constructor(private clock: Clock) {} |
15 | 15 | |
| @@ -18,11 +18,9 @@ export class AVSynchronizer { | ||
18 | 18 | const diffMs = (videoPts - audioPts) * 1000; |
19 | 19 | |
20 | 20 | if (diffMs < -this.maxDriftThresholdMs) { |
21 | - // Video is too far behind audio -> drop frame to catch up | |
22 | 21 | this.droppedFramesCount++; |
23 | 22 | return 'drop'; |
24 | 23 | } else if (diffMs > this.maxDriftThresholdMs) { |
25 | - // Video is ahead of audio -> wait for audio clock to advance | |
26 | 24 | return 'wait'; |
27 | 25 | } |
28 | 26 | |
29 | 27 | |
▼packages/security/package.json
+2-2
| @@ -1,7 +1,7 @@ | ||
1 | 1 | { |
2 | - "name": "@media-runtime/security", | |
2 | + "name": "@vidolib/security", | |
3 | 3 | "version": "1.0.0", |
4 | - "description": "Container parser fuzzing targets, byte mutation engine, and CSP sandbox helpers", | |
4 | + "description": "Container parser fuzzing targets, byte mutation engine, and CSP sandbox helpers for VidoLib", | |
5 | 5 | "main": "dist/index.cjs", |
6 | 6 | "module": "dist/index.js", |
7 | 7 | "types": "dist/index.d.ts", |
8 | 8 | |
▼packages/security/src/index.ts
+3-3
| @@ -1,4 +1,4 @@ | ||
1 | -import { ContainerDemuxer } from '@media-runtime/containers'; | |
1 | +import { ContainerDemuxer } from '@vidolib/containers'; | |
2 | 2 | |
3 | 3 | export interface FuzzResult { |
4 | 4 | iterations: number; |
| @@ -47,7 +47,7 @@ export class FuzzTarget { | ||
47 | 47 | msg.includes('End of Stream') || |
48 | 48 | msg.includes('out of bounds') |
49 | 49 | ) { |
50 | - // Expected input validation catch | |
50 | + // Expected catch | |
51 | 51 | } else { |
52 | 52 | crashes++; |
53 | 53 | errors.push({ iteration: i, message: msg }); |
| @@ -60,7 +60,7 @@ export class FuzzTarget { | ||
60 | 60 | } |
61 | 61 | |
62 | 62 | export const CSP_RECOMMENDED_DIRECTIVES = ` |
63 | -# media-runtime Recommended Content Security Policy (CSP) | |
63 | +# VidoLib Recommended Content Security Policy (CSP) | |
64 | 64 | default-src 'self'; |
65 | 65 | script-src 'self' 'wasm-unsafe-eval' blob:; |
66 | 66 | worker-src 'self' blob:; |
67 | 67 | |
▼packages/stream/package.json
+1-1
| @@ -1,5 +1,5 @@ | ||
1 | 1 | { |
2 | - "name": "@media-runtime/stream", | |
2 | + "name": "@vidolib/stream", | |
3 | 3 | "version": "1.0.0", |
4 | 4 | "description": "Source adapters normalizing HTTP, Blob, File, WebSocket, WebRTC, S3, and IPFS to ReadableStream<Uint8Array>", |
5 | 5 | "main": "dist/index.cjs", |
6 | 6 | |
▼packages/subtitle/package.json
+2-2
| @@ -1,7 +1,7 @@ | ||
1 | 1 | { |
2 | - "name": "@media-runtime/subtitle", | |
2 | + "name": "@vidolib/subtitle", | |
3 | 3 | "version": "1.0.0", |
4 | - "description": "GPU/Canvas subtitle engine supporting ASS, SSA, SRT, VTT, and PGS formats", | |
4 | + "description": "GPU/Canvas subtitle engine supporting ASS, SSA, SRT, VTT, and PGS formats for VidoLib", | |
5 | 5 | "main": "dist/index.cjs", |
6 | 6 | "module": "dist/index.js", |
7 | 7 | "types": "dist/index.d.ts", |
8 | 8 | |
▼packages/subtitle/src/index.ts
+3-3
| @@ -1,4 +1,4 @@ | ||
1 | -import { SubtitlePacket } from '@media-runtime/core'; | |
1 | +import { SubtitlePacket } from '@vidolib/core'; | |
2 | 2 | |
3 | 3 | export class SRTParser { |
4 | 4 | public static parse(srtText: string): SubtitlePacket[] { |
| @@ -50,8 +50,8 @@ export class ASSParser { | ||
50 | 50 | packets.push({ |
51 | 51 | startTime: this.parseTimestamp(start), |
52 | 52 | endTime: this.parseTimestamp(end), |
53 | - text: rawText.replace(/\{[^}]+\}/g, ''), // Plain text | |
54 | - styledMarkup: rawText // Preserve ASS styling tags {\k50}, {\pos(x,y)}, etc. | |
53 | + text: rawText.replace(/\{[^}]+\}/g, ''), | |
54 | + styledMarkup: rawText | |
55 | 55 | }); |
56 | 56 | } |
57 | 57 | } |
58 | 58 | |
▼packages/telemetry/package.json
+2-2
| @@ -1,7 +1,7 @@ | ||
1 | 1 | { |
2 | - "name": "@media-runtime/telemetry", | |
2 | + "name": "@vidolib/telemetry", | |
3 | 3 | "version": "1.0.0", |
4 | - "description": "Zero-tracking QoE event bus and telemetry surface for media-runtime", | |
4 | + "description": "Zero-tracking QoE event bus and telemetry surface for VidoLib", | |
5 | 5 | "main": "dist/index.cjs", |
6 | 6 | "module": "dist/index.js", |
7 | 7 | "types": "dist/index.d.ts", |
8 | 8 | |
▼packages/telemetry/src/index.ts
+2-2
| @@ -1,10 +1,10 @@ | ||
1 | -import { MediaPlugin, PluginContext } from '@media-runtime/plugins'; | |
1 | +import { MediaPlugin, PluginContext } from '@vidolib/plugins'; | |
2 | 2 | |
3 | 3 | export interface QoEMetrics { |
4 | 4 | startupTimeMs: number; |
5 | 5 | totalPlayTimeSeconds: number; |
6 | 6 | totalRebufferTimeSeconds: number; |
7 | - rebufferRatio: number; // rebufferTime / totalPlayTime | |
7 | + rebufferRatio: number; | |
8 | 8 | bitrateSwitchCount: number; |
9 | 9 | droppedFramesCount: number; |
10 | 10 | currentBitrate: number; |
11 | 11 | |
▼packages/ui/package.json
+2-2
| @@ -1,7 +1,7 @@ | ||
1 | 1 | { |
2 | - "name": "@media-runtime/ui", | |
2 | + "name": "@vidolib/ui", | |
3 | 3 | "version": "1.0.0", |
4 | - "description": "Framework-agnostic, WCAG 2.1 AA compliant UI controls for media-runtime", | |
4 | + "description": "Framework-agnostic, WCAG 2.1 AA compliant UI controls for VidoLib", | |
5 | 5 | "main": "dist/index.cjs", |
6 | 6 | "module": "dist/index.js", |
7 | 7 | "types": "dist/index.d.ts", |
8 | 8 | |
▼packages/ui/src/index.ts
+14-22
| @@ -1,4 +1,4 @@ | ||
1 | -import { Player } from '@media-runtime/core'; | |
1 | +import { Player } from '@vidolib/core'; | |
2 | 2 | |
3 | 3 | export class PlayerUI { |
4 | 4 | private container: HTMLElement; |
| @@ -19,17 +19,16 @@ export class PlayerUI { | ||
19 | 19 | } |
20 | 20 | |
21 | 21 | private initDOM(): void { |
22 | - this.container.classList.add('media-runtime-container'); | |
22 | + this.container.classList.add('vidolib-container'); | |
23 | 23 | this.container.setAttribute('role', 'region'); |
24 | - this.container.setAttribute('aria-label', 'Media Player Controls'); | |
24 | + this.container.setAttribute('aria-label', 'VidoLib Media Player Controls'); | |
25 | 25 | this.container.style.position = 'relative'; |
26 | 26 | this.container.style.overflow = 'hidden'; |
27 | 27 | this.container.style.backgroundColor = '#000'; |
28 | 28 | |
29 | - // Apply dark glassmorphic styling | |
30 | 29 | const style = document.createElement('style'); |
31 | 30 | style.textContent = ` |
32 | - .media-runtime-controls { | |
31 | + .vidolib-controls { | |
33 | 32 | position: absolute; |
34 | 33 | bottom: 0; |
35 | 34 | left: 0; |
| @@ -47,7 +46,7 @@ export class PlayerUI { | ||
47 | 46 | box-sizing: border-box; |
48 | 47 | z-index: 100; |
49 | 48 | } |
50 | - .media-runtime-btn { | |
49 | + .vidolib-btn { | |
51 | 50 | background: transparent; |
52 | 51 | border: none; |
53 | 52 | color: #F8FAFC; |
| @@ -58,11 +57,11 @@ export class PlayerUI { | ||
58 | 57 | align-items: center; |
59 | 58 | justify-content: center; |
60 | 59 | } |
61 | - .media-runtime-btn:focus-visible { | |
60 | + .vidolib-btn:focus-visible { | |
62 | 61 | outline: 2px solid #38BDF8; |
63 | 62 | outline-offset: 2px; |
64 | 63 | } |
65 | - .media-runtime-slider { | |
64 | + .vidolib-slider { | |
66 | 65 | accent-color: #38BDF8; |
67 | 66 | cursor: pointer; |
68 | 67 | flex: 1; |
| @@ -71,37 +70,32 @@ export class PlayerUI { | ||
71 | 70 | document.head.appendChild(style); |
72 | 71 | |
73 | 72 | this.controlsBar = document.createElement('div'); |
74 | - this.controlsBar.className = 'media-runtime-controls'; | |
73 | + this.controlsBar.className = 'vidolib-controls'; | |
75 | 74 | |
76 | - // Play/Pause Button | |
77 | 75 | this.playBtn = document.createElement('button'); |
78 | - this.playBtn.className = 'media-runtime-btn'; | |
76 | + this.playBtn.className = 'vidolib-btn'; | |
79 | 77 | this.playBtn.setAttribute('aria-label', 'Play'); |
80 | 78 | this.playBtn.innerHTML = '▶'; |
81 | 79 | |
82 | - // Time Slider | |
83 | 80 | this.timeSlider = document.createElement('input'); |
84 | 81 | this.timeSlider.type = 'range'; |
85 | - this.timeSlider.className = 'media-runtime-slider'; | |
82 | + this.timeSlider.className = 'vidolib-slider'; | |
86 | 83 | this.timeSlider.min = '0'; |
87 | 84 | this.timeSlider.max = '100'; |
88 | 85 | this.timeSlider.value = '0'; |
89 | 86 | this.timeSlider.setAttribute('aria-label', 'Seek timeline'); |
90 | 87 | |
91 | - // Time Display | |
92 | 88 | this.timeDisplay = document.createElement('span'); |
93 | 89 | this.timeDisplay.textContent = '00:00 / 00:00'; |
94 | 90 | |
95 | - // Volume Button | |
96 | 91 | this.volumeBtn = document.createElement('button'); |
97 | - this.volumeBtn.className = 'media-runtime-btn'; | |
92 | + this.volumeBtn.className = 'vidolib-btn'; | |
98 | 93 | this.volumeBtn.setAttribute('aria-label', 'Mute'); |
99 | 94 | this.volumeBtn.innerHTML = '🔊'; |
100 | 95 | |
101 | - // Volume Slider | |
102 | 96 | this.volumeSlider = document.createElement('input'); |
103 | 97 | this.volumeSlider.type = 'range'; |
104 | - this.volumeSlider.className = 'media-runtime-slider'; | |
98 | + this.volumeSlider.className = 'vidolib-slider'; | |
105 | 99 | this.volumeSlider.style.width = '60px'; |
106 | 100 | this.volumeSlider.min = '0'; |
107 | 101 | this.volumeSlider.max = '1'; |
| @@ -109,15 +103,13 @@ export class PlayerUI { | ||
109 | 103 | this.volumeSlider.value = '1'; |
110 | 104 | this.volumeSlider.setAttribute('aria-label', 'Volume level'); |
111 | 105 | |
112 | - // PiP Button | |
113 | 106 | this.pipBtn = document.createElement('button'); |
114 | - this.pipBtn.className = 'media-runtime-btn'; | |
107 | + this.pipBtn.className = 'vidolib-btn'; | |
115 | 108 | this.pipBtn.setAttribute('aria-label', 'Picture in Picture'); |
116 | 109 | this.pipBtn.innerHTML = '⧉'; |
117 | 110 | |
118 | - // Fullscreen Button | |
119 | 111 | this.fullscreenBtn = document.createElement('button'); |
120 | - this.fullscreenBtn.className = 'media-runtime-btn'; | |
112 | + this.fullscreenBtn.className = 'vidolib-btn'; | |
121 | 113 | this.fullscreenBtn.setAttribute('aria-label', 'Toggle Fullscreen'); |
122 | 114 | this.fullscreenBtn.innerHTML = '⛶'; |
123 | 115 | |
124 | 116 | |
▼packages/utils/package.json
+2-2
| @@ -1,7 +1,7 @@ | ||
1 | 1 | { |
2 | - "name": "@media-runtime/utils", | |
2 | + "name": "@vidolib/utils", | |
3 | 3 | "version": "1.0.0", |
4 | - "description": "Shared bitstream readers, ring buffers, and utilities for media-runtime", | |
4 | + "description": "Shared bitstream readers, ring buffers, and utilities for VidoLib", | |
5 | 5 | "main": "dist/index.cjs", |
6 | 6 | "module": "dist/index.js", |
7 | 7 | "types": "dist/index.d.ts", |
8 | 8 | |
▼packages/worker/package.json
+2-2
| @@ -1,7 +1,7 @@ | ||
1 | 1 | { |
2 | - "name": "@media-runtime/worker", | |
2 | + "name": "@vidolib/worker", | |
3 | 3 | "version": "1.0.0", |
4 | - "description": "Worker thread orchestration and Transferable object pipeline for media-runtime", | |
4 | + "description": "Worker thread orchestration and Transferable object pipeline for VidoLib", | |
5 | 5 | "main": "dist/index.cjs", |
6 | 6 | "module": "dist/index.js", |
7 | 7 | "types": "dist/index.d.ts", |
8 | 8 | |
▼scripts/build-all.js
+3-4
| @@ -12,7 +12,7 @@ const packages = fs.readdirSync(path.join(rootDir, 'packages'), { withFileTypes: | ||
12 | 12 | .filter(d => d.isDirectory()) |
13 | 13 | .map(d => d.name); |
14 | 14 | |
15 | -console.log(`⚡ Building ${packages.length} packages using Go-powered esbuild...\n`); | |
15 | +console.log(`⚡ Building ${packages.length} packages in VidoLib monorepo using Go-powered esbuild...\n`); | |
16 | 16 | const startTotal = performance.now(); |
17 | 17 | |
18 | 18 | for (const pkg of packages) { |
| @@ -26,7 +26,7 @@ for (const pkg of packages) { | ||
26 | 26 | fs.mkdirSync(distDir, { recursive: true }); |
27 | 27 | } |
28 | 28 | |
29 | - const globalName = `MediaRuntime${pkg.split('-').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join('')}`; | |
29 | + const globalName = `VidoLib${pkg.split('-').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join('')}`; | |
30 | 30 | |
31 | 31 | // 1. Build ESM (.js) |
32 | 32 | esbuild.buildSync({ |
| @@ -61,7 +61,7 @@ for (const pkg of packages) { | ||
61 | 61 | sourcemap: true |
62 | 62 | }); |
63 | 63 | |
64 | - console.log(`⚡ [esbuild] @media-runtime/${pkg.padEnd(16)} -> ESM, CJS & UMD (Global: window.${globalName})`); | |
64 | + console.log(`⚡ [esbuild] @vidolib/${pkg.padEnd(16)} -> ESM, CJS & UMD (Global: window.${globalName})`); | |
65 | 65 | } |
66 | 66 | |
67 | 67 | // 4. Generate TypeScript Type Declarations (.d.ts) via tsc --emitDeclarationOnly |
| @@ -70,7 +70,6 @@ try { | ||
70 | 70 | execSync('npx tsc --emitDeclarationOnly', { cwd: rootDir, stdio: 'inherit' }); |
71 | 71 | console.log('✅ Type Declarations (.d.ts) generated successfully.'); |
72 | 72 | } catch { |
73 | - // Copy src/index.ts fallback typings if any warning | |
74 | 73 | for (const pkg of packages) { |
75 | 74 | const srcIndex = path.join(rootDir, 'packages', pkg, 'src', 'index.ts'); |
76 | 75 | const distDts = path.join(rootDir, 'packages', pkg, 'dist', 'index.d.ts'); |
77 | 76 | |
▼scripts/build-umd.js
+3-5
| @@ -1,7 +1,6 @@ | ||
1 | 1 | import fs from 'node:fs'; |
2 | 2 | import path from 'node:path'; |
3 | 3 | import { fileURLToPath } from 'node:url'; |
4 | -import { execSync } from 'node:child_process'; | |
5 | 4 | |
6 | 5 | const __filename = fileURLToPath(import.meta.url); |
7 | 6 | const __dirname = path.dirname(__filename); |
| @@ -13,7 +12,7 @@ const packages = [ | ||
13 | 12 | 'scheduler', 'os-integration', 'telemetry', 'security', 'ui' |
14 | 13 | ]; |
15 | 14 | |
16 | -console.log('Building UMD/IIFE CDN bundles for all packages...'); | |
15 | +console.log('Building UMD/IIFE CDN bundles for VidoLib packages...'); | |
17 | 16 | |
18 | 17 | for (const pkg of packages) { |
19 | 18 | const pkgDir = path.join(rootDir, 'packages', pkg); |
| @@ -25,9 +24,8 @@ for (const pkg of packages) { | ||
25 | 24 | const indexJs = path.join(distDir, 'index.js'); |
26 | 25 | if (fs.existsSync(indexJs)) { |
27 | 26 | const code = fs.readFileSync(indexJs, 'utf8'); |
28 | - const globalName = `MediaRuntime${pkg.split('-').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join('')}`; | |
27 | + const globalName = `VidoLib${pkg.split('-').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join('')}`; | |
29 | 28 | |
30 | - // Generate UMD wrapper | |
31 | 29 | const umdContent = `(function (root, factory) { |
32 | 30 | if (typeof define === 'function' && define.amd) { |
33 | 31 | define(['exports'], factory); |
| @@ -44,7 +42,7 @@ for (const pkg of packages) { | ||
44 | 42 | |
45 | 43 | fs.writeFileSync(path.join(distDir, 'index.umd.js'), umdContent, 'utf8'); |
46 | 44 | fs.writeFileSync(path.join(distDir, 'index.umd.js.map'), `{"version":3,"sources":["index.js"],"names":[],"mappings":""}`, 'utf8'); |
47 | - console.log(` Created UMD bundle: @media-runtime/${pkg} -> dist/index.umd.js (Global: window.${globalName})`); | |
45 | + console.log(` Created UMD bundle: @vidolib/${pkg} -> dist/index.umd.js (Global: window.${globalName})`); | |
48 | 46 | } |
49 | 47 | } |
50 | 48 | |
51 | 49 | |
▼scripts/check-licensing.js
+1-3
| @@ -26,7 +26,6 @@ function scanDirectory(dirPath) { | ||
26 | 26 | } else if (entry.isFile()) { |
27 | 27 | const lowerName = entry.name.toLowerCase(); |
28 | 28 | |
29 | - // Check WASM files | |
30 | 29 | if (lowerName.endsWith('.wasm')) { |
31 | 30 | let isAllowed = false; |
32 | 31 | for (const allowed of ROYALTY_FREE_ALLOWLIST) { |
| @@ -40,7 +39,6 @@ function scanDirectory(dirPath) { | ||
40 | 39 | } |
41 | 40 | } |
42 | 41 | |
43 | - // Check JS/TS files in packages/codecs/software for prohibited patent pool software implementations | |
44 | 42 | if ((lowerName.endsWith('.ts') || lowerName.endsWith('.js')) && fullPath.includes('packages/codecs/src/software')) { |
45 | 43 | const content = fs.readFileSync(fullPath, 'utf8').toLowerCase(); |
46 | 44 | for (const prohibited of PROHIBITED_WASM_CODECS) { |
| @@ -56,7 +54,7 @@ function scanDirectory(dirPath) { | ||
56 | 54 | } |
57 | 55 | |
58 | 56 | const packagesDir = path.join(rootDir, 'packages'); |
59 | -console.log('Running media-runtime Codec Licensing Audit...'); | |
57 | +console.log('Running VidoLib Codec Licensing Audit...'); | |
60 | 58 | const errors = scanDirectory(packagesDir); |
61 | 59 | |
62 | 60 | if (errors.length > 0) { |
63 | 61 | |
▼scripts/size-limit.js
+3-4
| @@ -29,7 +29,7 @@ const BUDGETS = [ | ||
29 | 29 | { package: 'utils', maxSizeKb: 25 } |
30 | 30 | ]; |
31 | 31 | |
32 | -console.log('Running Bundle Size Budget Audit...\n'); | |
32 | +console.log('Running VidoLib Bundle Size Budget Audit...\n'); | |
33 | 33 | let failed = false; |
34 | 34 | |
35 | 35 | for (const item of BUDGETS) { |
| @@ -45,7 +45,6 @@ for (const item of BUDGETS) { | ||
45 | 45 | totalBytes += gzipped.length; |
46 | 46 | } |
47 | 47 | } else { |
48 | - // Estimate based on src if dist not yet built | |
49 | 48 | const srcPath = path.join(rootDir, 'packages', item.package, 'src'); |
50 | 49 | if (fs.existsSync(srcPath)) { |
51 | 50 | const getFiles = (dir) => { |
| @@ -65,7 +64,7 @@ for (const item of BUDGETS) { | ||
65 | 64 | for (const file of files) { |
66 | 65 | const content = fs.readFileSync(file); |
67 | 66 | const gzipped = zlib.gzipSync(content); |
68 | - totalBytes += Math.floor(gzipped.length * 0.4); // compressed JS estimate | |
67 | + totalBytes += Math.floor(gzipped.length * 0.4); | |
69 | 68 | } |
70 | 69 | } |
71 | 70 | } |
| @@ -74,7 +73,7 @@ for (const item of BUDGETS) { | ||
74 | 73 | const status = totalBytes <= item.maxSizeKb * 1024 ? '✅ PASS' : '❌ FAIL'; |
75 | 74 | if (totalBytes > item.maxSizeKb * 1024) failed = true; |
76 | 75 | |
77 | - console.log(`${status} @media-runtime/${item.package.padEnd(16)} Size: ${sizeKb.padStart(6)} KB (Max Budget: ${item.maxSizeKb} KB gzipped)`); | |
76 | + console.log(`${status} @vidolib/${item.package.padEnd(16)} Size: ${sizeKb.padStart(6)} KB (Max Budget: ${item.maxSizeKb} KB gzipped)`); | |
78 | 77 | } |
79 | 78 | |
80 | 79 | if (failed) { |
81 | 80 | |
▼tests/all.test.ts
+10-10
| @@ -16,8 +16,8 @@ import { AVSynchronizer } from '../packages/scheduler/src/index.js'; | ||
16 | 16 | import { TelemetryPlugin } from '../packages/telemetry/src/index.js'; |
17 | 17 | import { FuzzTarget } from '../packages/security/src/index.js'; |
18 | 18 | |
19 | -describe('media-runtime Comprehensive Monorepo Unit Test Suite', () => { | |
20 | - it('@media-runtime/utils: BitStreamReader & RingBuffer', () => { | |
19 | +describe('VidoLib Comprehensive Monorepo Unit Test Suite', () => { | |
20 | + it('@vidolib/utils: BitStreamReader & RingBuffer', () => { | |
21 | 21 | const data = new Uint8Array([0x12, 0x34, 0x56, 0x78]); |
22 | 22 | const reader = new BitStreamReader(data); |
23 | 23 | expect(reader.readUint16BE()).toBe(0x1234); |
| @@ -30,7 +30,7 @@ describe('media-runtime Comprehensive Monorepo Unit Test Suite', () => { | ||
30 | 30 | expect(Array.from(out)).toEqual([1, 2, 3, 4]); |
31 | 31 | }); |
32 | 32 | |
33 | - it('@media-runtime/core: Player state lifecycle and clock', () => { | |
33 | + it('@vidolib/core: Player state lifecycle and clock', () => { | |
34 | 34 | const player = new Player(); |
35 | 35 | expect(player.getState()).toBe('idle'); |
36 | 36 | player.play(); |
| @@ -41,7 +41,7 @@ describe('media-runtime Comprehensive Monorepo Unit Test Suite', () => { | ||
41 | 41 | expect(player.getCurrentTime()).toBe(15.5); |
42 | 42 | }); |
43 | 43 | |
44 | - it('@media-runtime/plugins: Plugin registration and event dispatching', async () => { | |
44 | + it('@vidolib/plugins: Plugin registration and event dispatching', async () => { | |
45 | 45 | const registry = new PluginRegistry(); |
46 | 46 | let eventReceived = false; |
47 | 47 | await registry.register({ |
| @@ -58,9 +58,9 @@ describe('media-runtime Comprehensive Monorepo Unit Test Suite', () => { | ||
58 | 58 | expect(eventReceived).toBe(true); |
59 | 59 | }); |
60 | 60 | |
61 | - it('@media-runtime/containers: Demuxer probing & demuxing', () => { | |
61 | + it('@vidolib/containers: Demuxer probing & demuxing', () => { | |
62 | 62 | const registry = new ContainerRegistry(); |
63 | - const mp4Data = new Uint8Array([0x00, 0x00, 0x00, 0x14, 0x66, 0x74, 0x79, 0x70]); // ftyp | |
63 | + const mp4Data = new Uint8Array([0x00, 0x00, 0x00, 0x14, 0x66, 0x74, 0x79, 0x70]); | |
64 | 64 | const res = registry.autoDemux(mp4Data); |
65 | 65 | expect(res.tracks.length).toBeGreaterThan(0); |
66 | 66 | |
| @@ -68,7 +68,7 @@ describe('media-runtime Comprehensive Monorepo Unit Test Suite', () => { | ||
68 | 68 | expect(flv.probe(new Uint8Array([0x46, 0x4C, 0x56]))).toBe(true); |
69 | 69 | }); |
70 | 70 | |
71 | - it('@media-runtime/manifest: HLS & DASH parsing', () => { | |
71 | + it('@vidolib/manifest: HLS & DASH parsing', () => { | |
72 | 72 | const hls = `#EXTM3U |
73 | 73 | #EXT-X-STREAM-INF:BANDWIDTH=2000000,RESOLUTION=1280x720,CODECS="avc1.4d401f" |
74 | 74 | http://example.com/stream.m3u8`; |
| @@ -77,12 +77,12 @@ http://example.com/stream.m3u8`; | ||
77 | 77 | expect(playlist.renditions[0].bandwidth).toBe(2000000); |
78 | 78 | }); |
79 | 79 | |
80 | - it('@media-runtime/codecs: Codec capability negotiation', async () => { | |
80 | + it('@vidolib/codecs: Codec capability negotiation', async () => { | |
81 | 81 | const cap = await CodecNegotiator.negotiateVideo('avc1.4d401f'); |
82 | 82 | expect(cap.supported).toBe(true); |
83 | 83 | }); |
84 | 84 | |
85 | - it('@media-runtime/subtitle: SRT and ASS subtitle parsers', () => { | |
85 | + it('@vidolib/subtitle: SRT and ASS subtitle parsers', () => { | |
86 | 86 | const srt = `1 |
87 | 87 | 00:00:01,000 --> 00:00:04,000 |
88 | 88 | Hello World`; |
| @@ -92,7 +92,7 @@ Hello World`; | ||
92 | 92 | expect(packets[0].startTime).toBe(1); |
93 | 93 | }); |
94 | 94 | |
95 | - it('@media-runtime/security: Container parser fuzz target', () => { | |
95 | + it('@vidolib/security: Container parser fuzz target', () => { | |
96 | 96 | const demuxer = new MP4Demuxer(); |
97 | 97 | const sample = new Uint8Array([0x00, 0x00, 0x00, 0x14, 0x66, 0x74, 0x79, 0x70]); |
98 | 98 | const res = FuzzTarget.run(demuxer, sample, 20); |
99 | 99 | |
▼tsconfig.json
+19-19
| @@ -6,25 +6,25 @@ | ||
6 | 6 | "lib": ["ES2022", "DOM", "DOM.Iterable", "WebWorker"], |
7 | 7 | "baseUrl": ".", |
8 | 8 | "paths": { |
9 | - "@media-runtime/utils": ["packages/utils/src/index.ts"], | |
10 | - "@media-runtime/plugins": ["packages/plugins/src/index.ts"], | |
11 | - "@media-runtime/core": ["packages/core/src/index.ts"], | |
12 | - "@media-runtime/stream": ["packages/stream/src/index.ts"], | |
13 | - "@media-runtime/buffer": ["packages/buffer/src/index.ts"], | |
14 | - "@media-runtime/manifest": ["packages/manifest/src/index.ts"], | |
15 | - "@media-runtime/abr": ["packages/abr/src/index.ts"], | |
16 | - "@media-runtime/containers": ["packages/containers/src/index.ts"], | |
17 | - "@media-runtime/codecs": ["packages/codecs/src/index.ts"], | |
18 | - "@media-runtime/drm": ["packages/drm/src/index.ts"], | |
19 | - "@media-runtime/renderer": ["packages/renderer/src/index.ts"], | |
20 | - "@media-runtime/audio": ["packages/audio/src/index.ts"], | |
21 | - "@media-runtime/subtitle": ["packages/subtitle/src/index.ts"], | |
22 | - "@media-runtime/worker": ["packages/worker/src/index.ts"], | |
23 | - "@media-runtime/scheduler": ["packages/scheduler/src/index.ts"], | |
24 | - "@media-runtime/os-integration": ["packages/os-integration/src/index.ts"], | |
25 | - "@media-runtime/telemetry": ["packages/telemetry/src/index.ts"], | |
26 | - "@media-runtime/security": ["packages/security/src/index.ts"], | |
27 | - "@media-runtime/ui": ["packages/ui/src/index.ts"] | |
9 | + "@vidolib/utils": ["packages/utils/src/index.ts"], | |
10 | + "@vidolib/plugins": ["packages/plugins/src/index.ts"], | |
11 | + "@vidolib/core": ["packages/core/src/index.ts"], | |
12 | + "@vidolib/stream": ["packages/stream/src/index.ts"], | |
13 | + "@vidolib/buffer": ["packages/buffer/src/index.ts"], | |
14 | + "@vidolib/manifest": ["packages/manifest/src/index.ts"], | |
15 | + "@vidolib/abr": ["packages/abr/src/index.ts"], | |
16 | + "@vidolib/containers": ["packages/containers/src/index.ts"], | |
17 | + "@vidolib/codecs": ["packages/codecs/src/index.ts"], | |
18 | + "@vidolib/drm": ["packages/drm/src/index.ts"], | |
19 | + "@vidolib/renderer": ["packages/renderer/src/index.ts"], | |
20 | + "@vidolib/audio": ["packages/audio/src/index.ts"], | |
21 | + "@vidolib/subtitle": ["packages/subtitle/src/index.ts"], | |
22 | + "@vidolib/worker": ["packages/worker/src/index.ts"], | |
23 | + "@vidolib/scheduler": ["packages/scheduler/src/index.ts"], | |
24 | + "@vidolib/os-integration": ["packages/os-integration/src/index.ts"], | |
25 | + "@vidolib/telemetry": ["packages/telemetry/src/index.ts"], | |
26 | + "@vidolib/security": ["packages/security/src/index.ts"], | |
27 | + "@vidolib/ui": ["packages/ui/src/index.ts"] | |
28 | 28 | }, |
29 | 29 | "declaration": true, |
30 | 30 | "declarationMap": true, |
31 | 31 | |
▼vitest.config.ts
+19-19
| @@ -4,25 +4,25 @@ import path from 'node:path'; | ||
4 | 4 | export default defineConfig({ |
5 | 5 | resolve: { |
6 | 6 | alias: { |
7 | - '@media-runtime/utils': path.resolve(__dirname, 'packages/utils/src/index.ts'), | |
8 | - '@media-runtime/plugins': path.resolve(__dirname, 'packages/plugins/src/index.ts'), | |
9 | - '@media-runtime/core': path.resolve(__dirname, 'packages/core/src/index.ts'), | |
10 | - '@media-runtime/stream': path.resolve(__dirname, 'packages/stream/src/index.ts'), | |
11 | - '@media-runtime/buffer': path.resolve(__dirname, 'packages/buffer/src/index.ts'), | |
12 | - '@media-runtime/manifest': path.resolve(__dirname, 'packages/manifest/src/index.ts'), | |
13 | - '@media-runtime/abr': path.resolve(__dirname, 'packages/abr/src/index.ts'), | |
14 | - '@media-runtime/containers': path.resolve(__dirname, 'packages/containers/src/index.ts'), | |
15 | - '@media-runtime/codecs': path.resolve(__dirname, 'packages/codecs/src/index.ts'), | |
16 | - '@media-runtime/drm': path.resolve(__dirname, 'packages/drm/src/index.ts'), | |
17 | - '@media-runtime/renderer': path.resolve(__dirname, 'packages/renderer/src/index.ts'), | |
18 | - '@media-runtime/audio': path.resolve(__dirname, 'packages/audio/src/index.ts'), | |
19 | - '@media-runtime/subtitle': path.resolve(__dirname, 'packages/subtitle/src/index.ts'), | |
20 | - '@media-runtime/worker': path.resolve(__dirname, 'packages/worker/src/index.ts'), | |
21 | - '@media-runtime/scheduler': path.resolve(__dirname, 'packages/scheduler/src/index.ts'), | |
22 | - '@media-runtime/os-integration': path.resolve(__dirname, 'packages/os-integration/src/index.ts'), | |
23 | - '@media-runtime/telemetry': path.resolve(__dirname, 'packages/telemetry/src/index.ts'), | |
24 | - '@media-runtime/security': path.resolve(__dirname, 'packages/security/src/index.ts'), | |
25 | - '@media-runtime/ui': path.resolve(__dirname, 'packages/ui/src/index.ts') | |
7 | + '@vidolib/utils': path.resolve(__dirname, 'packages/utils/src/index.ts'), | |
8 | + '@vidolib/plugins': path.resolve(__dirname, 'packages/plugins/src/index.ts'), | |
9 | + '@vidolib/core': path.resolve(__dirname, 'packages/core/src/index.ts'), | |
10 | + '@vidolib/stream': path.resolve(__dirname, 'packages/stream/src/index.ts'), | |
11 | + '@vidolib/buffer': path.resolve(__dirname, 'packages/buffer/src/index.ts'), | |
12 | + '@vidolib/manifest': path.resolve(__dirname, 'packages/manifest/src/index.ts'), | |
13 | + '@vidolib/abr': path.resolve(__dirname, 'packages/abr/src/index.ts'), | |
14 | + '@vidolib/containers': path.resolve(__dirname, 'packages/containers/src/index.ts'), | |
15 | + '@vidolib/codecs': path.resolve(__dirname, 'packages/codecs/src/index.ts'), | |
16 | + '@vidolib/drm': path.resolve(__dirname, 'packages/drm/src/index.ts'), | |
17 | + '@vidolib/renderer': path.resolve(__dirname, 'packages/renderer/src/index.ts'), | |
18 | + '@vidolib/audio': path.resolve(__dirname, 'packages/audio/src/index.ts'), | |
19 | + '@vidolib/subtitle': path.resolve(__dirname, 'packages/subtitle/src/index.ts'), | |
20 | + '@vidolib/worker': path.resolve(__dirname, 'packages/worker/src/index.ts'), | |
21 | + '@vidolib/scheduler': path.resolve(__dirname, 'packages/scheduler/src/index.ts'), | |
22 | + '@vidolib/os-integration': path.resolve(__dirname, 'packages/os-integration/src/index.ts'), | |
23 | + '@vidolib/telemetry': path.resolve(__dirname, 'packages/telemetry/src/index.ts'), | |
24 | + '@vidolib/security': path.resolve(__dirname, 'packages/security/src/index.ts'), | |
25 | + '@vidolib/ui': path.resolve(__dirname, 'packages/ui/src/index.ts') | |
26 | 26 | } |
27 | 27 | }, |
28 | 28 | test: { |
29 | 29 | |