@uploadista/flow-videos-av-node 0.1.4-beta.1 → 0.2.0

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.
@@ -1,31 +1,31 @@
1
1
 
2
- > @uploadista/flow-videos-av-node@0.1.4-beta.1 build /home/runner/work/uploadista-sdk/uploadista-sdk/packages/flow/videos/av-node
2
+ > @uploadista/flow-videos-av-node@0.2.0 build /home/runner/work/uploadista-sdk/uploadista-sdk/packages/flow/videos/av-node
3
3
  > tsc --noEmit && tsdown
4
4
 
5
- ℹ tsdown v0.20.1 powered by rolldown v1.0.0-rc.1
5
+ ℹ tsdown v0.20.3 powered by rolldown v1.0.0-rc.3
6
6
  ℹ config file: /home/runner/work/uploadista-sdk/uploadista-sdk/packages/flow/videos/av-node/tsdown.config.ts
7
7
  ℹ entry: src/index.ts
8
8
  ℹ target: es2022
9
9
  ℹ tsconfig: tsconfig.json
10
10
  ℹ Build start
11
- ℹ [CJS] dist/index.cjs 16.47 kB │ gzip: 3.91 kB
12
- ℹ [CJS] 1 files, total: 16.47 kB
11
+ ℹ [CJS] dist/index.cjs 16.53 kB │ gzip: 3.95 kB
12
+ ℹ [CJS] 1 files, total: 16.53 kB
13
13
  [PLUGIN_TIMINGS] Warning: Your build spent significant time in plugin `tsdown:external`. See https://rolldown.rs/options/checks#plugintimings for more details.
14
14
 
15
15
  ℹ [CJS] dist/index.d.cts.map 0.71 kB │ gzip: 0.35 kB
16
16
  ℹ [CJS] dist/index.d.cts 3.37 kB │ gzip: 1.05 kB
17
17
  ℹ [CJS] 2 files, total: 4.08 kB
18
+ [PLUGIN_TIMINGS] Warning: Your build spent significant time in plugins. Here is a breakdown:
19
+ - rolldown-plugin-dts:generate (78%)
20
+ - rolldown-plugin-dts:resolver (21%)
21
+ See https://rolldown.rs/options/checks#plugintimings for more details.
22
+
23
+ ✔ Build complete in 15120ms
18
24
  ℹ [ESM] dist/index.mjs 15.79 kB │ gzip: 4.01 kB
19
25
  ℹ [ESM] dist/index.mjs.map 61.77 kB │ gzip: 9.88 kB
20
26
  ℹ [ESM] dist/index.d.mts.map  0.71 kB │ gzip: 0.35 kB
21
- [PLUGIN_TIMINGS] Warning: Your build spent significant time in plugins. Here is a breakdown:
22
27
  ℹ [ESM] dist/index.d.mts  3.37 kB │ gzip: 1.05 kB
23
28
  ℹ [ESM] 4 files, total: 81.64 kB
24
- - rolldown-plugin-dts:generate (77%)
25
- - rolldown-plugin-dts:resolver (20%)
26
- See https://rolldown.rs/options/checks#plugintimings for more details.
27
-
28
29
  [PLUGIN_TIMINGS] Warning: Your build spent significant time in plugin `rolldown-plugin-dts:generate`. See https://rolldown.rs/options/checks#plugintimings for more details.
29
30
 
30
- ✔ Build complete in 14695ms
31
- ✔ Build complete in 14707ms
31
+ ✔ Build complete in 15131ms
package/dist/index.cjs CHANGED
@@ -1,3 +1,3 @@
1
- let e=require(`node-av/constants`),t=require(`@uploadista/core/errors`),n=require(`@uploadista/observability`),r=require(`effect`),i=require(`node-av/api`),a=require(`@uploadista/core/flow`);async function o(){try{return await import(`node-av`),{available:!0,version:`4.x`}}catch(e){return{available:!1,error:e instanceof Error?e.message:String(e)}}}const s={mp4:`video/mp4`,webm:`video/webm`,mov:`video/quicktime`,avi:`video/x-msvideo`},c={mp4:`mp4`,webm:`webm`,mov:`mov`,avi:`avi`},l={h264:e.FF_ENCODER_LIBX264,h265:e.FF_ENCODER_LIBX265,vp9:e.FF_ENCODER_LIBVPX_VP9,av1:e.FF_ENCODER_LIBAOM_AV1},u={aac:e.FF_ENCODER_AAC,mp3:e.FF_ENCODER_LIBMP3LAME,opus:e.FF_ENCODER_LIBOPUS,vorbis:e.FF_ENCODER_LIBVORBIS},d={jpeg:e.FF_ENCODER_MJPEG,mjpeg:e.FF_ENCODER_MJPEG,png:e.FF_ENCODER_PNG};function f(){let e=[],t=0n;return{callbacks:{write:n=>(e.push(n),t+=BigInt(n.length),n.length),seek:(e,n)=>{switch(n){case 0:t=e;break;case 1:t+=e;break;case 2:t=e;break}return t}},getOutput:()=>{let t=e.reduce((e,t)=>e+t.length,0),n=new Uint8Array(t),r=0;for(let t of e)n.set(t,r),r+=t.length;return n}}}function p(){let e=[],n=!1,i=null,a=0n;return{callbacks:{write:t=>{let n=new Uint8Array(t);if(e.push(n),a+=BigInt(t.length),i){let e=i;i=null,e()}return t.length},seek:(e,t)=>{switch(t){case 0:a=e;break;case 1:a+=e;break;case 2:a=e;break}return a}},stream:r.Stream.async(a=>((async()=>{for(;;){for(;e.length>0;){let t=e.shift();t&&a.single(t)}if(n&&e.length===0){a.end();return}await new Promise(t=>{i=t,(e.length>0||n)&&(i=null,t())})}})().catch(e=>{a.fail(t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Streaming output failed: ${e instanceof Error?e.message:String(e)}`,cause:e}))}),r.Effect.void)),finalize:()=>{if(n=!0,i){let e=i;i=null,e()}}}}function m(e){return r.Effect.gen(function*(){let t=[];yield*r.Stream.runForEach(e,e=>r.Effect.sync(()=>{t.push(e)}));let n=t.reduce((e,t)=>e+t.byteLength,0),i=new Uint8Array(n),a=0;for(let e of t)i.set(e,a),a+=e.byteLength;return i})}function h(e){if(!e)return!1;let t=e.toLowerCase();return t===`video/mp2t`||t===`video/mpeg-ts`||t===`video/mpegts`||t===`application/x-mpegts`}function g(){var e=typeof SuppressedError==`function`?SuppressedError:function(e,t){var n=Error();return n.name=`SuppressedError`,n.error=e,n.suppressed=t,n},t={},n=[];function r(e,t){if(t!=null){if(Object(t)!==t)throw TypeError(`using declarations can only be used with objects, functions, null, or undefined.`);if(e)var r=t[Symbol.asyncDispose||Symbol.for(`Symbol.asyncDispose`)];if(r===void 0&&(r=t[Symbol.dispose||Symbol.for(`Symbol.dispose`)],e))var i=r;if(typeof r!=`function`)throw TypeError(`Object is not disposable.`);i&&(r=function(){try{i.call(t)}catch(e){return Promise.reject(e)}}),n.push({v:t,d:r,a:e})}else e&&n.push({d:t,a:e});return t}return{e:t,u:r.bind(null,!1),a:r.bind(null,!0),d:function(){var r,i=this.e,a=0;function o(){for(;r=n.pop();)try{if(!r.a&&a===1)return a=0,n.push(r),Promise.resolve().then(o);if(r.d){var e=r.d.call(r.v);if(r.a)return a|=2,Promise.resolve(e).then(o,s)}else a|=1}catch(e){return s(e)}if(a===1)return i===t?Promise.resolve():Promise.reject(i);if(i!==t)throw i}function s(n){return i=i===t?n:new e(n,i),o()}return o()}}}function _(e){return typeof e==`object`&&!!e&&`pipe`in e&&typeof e.pipe==`function`}function v(){return{describe:e=>r.Effect.tryPromise({try:async()=>{try{var t=g();let n=Buffer.from(e),r=t.a(await i.Demuxer.open(n)),a=r.video(),o=r.audio();if(!a)throw Error(`No video stream found`);let s=a.codecpar,c=0;if(a.rFrameRate){let{num:e,den:t}=a.rFrameRate;c=t?e/t:e}let l=`unknown`;if(a.sampleAspectRatio){let{num:e,den:t}=a.sampleAspectRatio;l=`${e}:${t}`}return{duration:r.duration||0,width:s.width||0,height:s.height||0,codec:String(s.codecId)||`unknown`,format:r.formatName||`unknown`,bitrate:r.bitRate||0,frameRate:c,aspectRatio:l,hasAudio:!!o,audioCodec:o?.codecpar.codecId?String(o.codecpar.codecId):void 0,audioBitrate:o?.codecpar.bitRate?Number(o.codecpar.bitRate):void 0,size:e.byteLength}}catch(e){t.e=e}finally{await t.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_METADATA_EXTRACTION_FAILED`,{body:`Failed to extract video metadata: ${e instanceof Error?e.message:String(e)}`,cause:e})}).pipe((0,n.withOperationSpan)(`video`,`describe`,{"video.input_size":e.byteLength})),transcode:(e,a)=>r.Effect.tryPromise({try:async()=>{try{var t=g();let s=Buffer.from(e),{callbacks:c,getOutput:d}=f(),p=t.a(await i.Demuxer.open(s)),m=t.a(await i.Muxer.open(c,{format:a.format})),h=p.video();if(!h)throw Error(`No video stream found`);let _=t.u(await i.Decoder.create(h)),v=a.codec?l[a.codec]:l.h264,y=t.u(await i.Encoder.create(v,{...a.videoBitrate&&{bitrate:a.videoBitrate}})),b=m.addStream(y);for await(let e of _.frames(p.packets(h.index)))try{var n=g();let t=n.u(e);if(!t)continue;await y.encode(t);let r=await y.receive();for(;r;)await m.writePacket(r,b),r.free(),r=await y.receive()}catch(e){n.e=e}finally{n.d()}await y.flush();let x=await y.receive();for(;x;)await m.writePacket(x,b),x.free(),x=await y.receive();let S=p.audio();if(S)try{var r=g();let e=r.u(await i.Decoder.create(S)),t=a.audioCodec?u[a.audioCodec]:u.aac,n=r.u(await i.Encoder.create(t,{...a.audioBitrate&&{bitrate:a.audioBitrate}})),s=m.addStream(n);for await(let t of e.frames(p.packets(S.index)))try{var o=g();let e=o.u(t);if(!e)continue;await n.encode(e);let r=await n.receive();for(;r;)await m.writePacket(r,s),r.free(),r=await n.receive()}catch(e){o.e=e}finally{o.d()}await n.flush();let c=await n.receive();for(;c;)await m.writePacket(c,s),c.free(),c=await n.receive()}catch(e){r.e=e}finally{r.d()}return d()}catch(e){t.e=e}finally{await t.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Transcode failed: ${e instanceof Error?e.message:String(e)}`,cause:e})}).pipe((0,n.withOperationSpan)(`video`,`transcode`,{"video.format":a.format,"video.codec":a.codec,"video.video_bitrate":a.videoBitrate,"video.audio_codec":a.audioCodec,"video.audio_bitrate":a.audioBitrate,"video.input_size":e.byteLength})),resize:(e,a)=>r.Effect.tryPromise({try:async()=>{try{var t=g();let s=Buffer.from(e),{callbacks:c,getOutput:d}=f(),p=t.a(await i.Demuxer.open(s)),m=t.a(await i.Muxer.open(c,{format:`mp4`})),h=p.video();if(!h)throw Error(`No video stream found`);let _=t.u(await i.Decoder.create(h));if(!a.width&&!a.height)throw Error(`Either width or height must be specified`);let v=t.u(await i.Encoder.create(l.h264)),y=m.addStream(v);for await(let e of _.frames(p.packets(h.index)))try{var n=g();let t=n.u(e);if(!t)continue;await v.encode(t);let r=await v.receive();for(;r;)await m.writePacket(r,y),r.free(),r=await v.receive()}catch(e){n.e=e}finally{n.d()}await v.flush();let b=await v.receive();for(;b;)await m.writePacket(b,y),b.free(),b=await v.receive();let x=p.audio();if(x)try{var r=g();let e=r.u(await i.Decoder.create(x)),t=r.u(await i.Encoder.create(u.aac)),n=m.addStream(t);for await(let r of e.frames(p.packets(x.index)))try{var o=g();let e=o.u(r);if(!e)continue;await t.encode(e);let i=await t.receive();for(;i;)await m.writePacket(i,n),i.free(),i=await t.receive()}catch(e){o.e=e}finally{o.d()}await t.flush();let a=await t.receive();for(;a;)await m.writePacket(a,n),a.free(),a=await t.receive()}catch(e){r.e=e}finally{r.d()}return d()}catch(e){t.e=e}finally{await t.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Resize failed: ${e instanceof Error?e.message:String(e)}`,cause:e})}).pipe((0,n.withOperationSpan)(`video`,`resize`,{"video.width":a.width,"video.height":a.height,"video.input_size":e.byteLength})),trim:(e,a)=>r.Effect.tryPromise({try:async()=>{try{var t=g();let s=Buffer.from(e),{callbacks:c,getOutput:d}=f(),p=t.a(await i.Demuxer.open(s)),m=t.a(await i.Muxer.open(c,{format:`mp4`})),h=p.video();if(!h)throw Error(`No video stream found`);let _;_=a.duration===void 0?a.endTime===void 0?p.duration||1/0:a.endTime:a.startTime+a.duration;let v=t.u(await i.Decoder.create(h)),y=t.u(await i.Encoder.create(l.h264)),b=m.addStream(y);for await(let e of v.frames(p.packets(h.index)))try{var n=g();let t=n.u(e);if(!t)continue;let r=t.pts||0n,i=h.timeBase?h.timeBase.num/h.timeBase.den:1,o=Number(r)*i;if(o>=a.startTime&&o<_){await y.encode(t);let e=await y.receive();for(;e;)await m.writePacket(e,b),e.free(),e=await y.receive()}if(o>=_)break}catch(e){n.e=e}finally{n.d()}await y.flush();let x=await y.receive();for(;x;)await m.writePacket(x,b),x.free(),x=await y.receive();let S=p.audio();if(S)try{var r=g();let e=r.u(await i.Decoder.create(S)),t=r.u(await i.Encoder.create(u.aac)),n=m.addStream(t);for await(let r of e.frames(p.packets(S.index)))try{var o=g();let e=o.u(r);if(!e)continue;let i=e.pts||0n,s=S.timeBase?S.timeBase.num/S.timeBase.den:1,c=Number(i)*s;if(c>=a.startTime&&c<_){await t.encode(e);let r=await t.receive();for(;r;)await m.writePacket(r,n),r.free(),r=await t.receive()}if(c>=_)break}catch(e){o.e=e}finally{o.d()}await t.flush();let s=await t.receive();for(;s;)await m.writePacket(s,n),s.free(),s=await t.receive()}catch(e){r.e=e}finally{r.d()}return d()}catch(e){t.e=e}finally{await t.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Trim failed: ${e instanceof Error?e.message:String(e)}`,cause:e})}).pipe((0,n.withOperationSpan)(`video`,`trim`,{"video.start_time":a.startTime,"video.end_time":a.endTime,"video.duration":a.duration,"video.input_size":e.byteLength})),extractFrame:(e,a)=>r.Effect.tryPromise({try:async()=>{try{var t=g();let o=Buffer.from(e),s=a.format||`jpeg`,c=t.a(await i.Demuxer.open(o)),l=c.video();if(!l)throw Error(`No video stream found`);let u=t.u(await i.Decoder.create(l)),f=null,p=a.timestamp;for await(let e of u.frames(c.packets(l.index)))try{var n=g();let t=n.u(e);if(!t)continue;let a=t.pts||0n,o=l.timeBase?l.timeBase.num/l.timeBase.den:1;if(Number(a)*o>=p)try{var r=g();let e=d[s]||d.jpeg,n=r.u(await i.Encoder.create(e));await n.encode(t);let a=await n.receive();if(a?.data){f=new Uint8Array(a.data),a.free();break}}catch(e){r.e=e}finally{r.d()}}catch(e){n.e=e}finally{n.d()}if(!f)throw Error(`No frame found at timestamp ${p}`);return f}catch(e){t.e=e}finally{await t.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Frame extraction failed: ${e instanceof Error?e.message:String(e)}`,cause:e})}).pipe((0,n.withOperationSpan)(`video`,`extract-frame`,{"video.timestamp":a.timestamp,"video.format":a.format??`jpeg`,"video.input_size":e.byteLength})),supportsStreaming:!0,transcodeStream:(e,a,o)=>r.Effect.gen(function*(){let n=_(e)?yield*m(e):e,{callbacks:o,stream:s,finalize:c}=p(),d=r.Effect.tryPromise({try:async()=>{try{var e=g();let c=Buffer.from(n),d=e.a(await i.Demuxer.open(c)),f=e.a(await i.Muxer.open(o,{format:a.format})),p=d.video();if(!p)throw Error(`No video stream found`);let m=e.u(await i.Decoder.create(p)),h=a.codec?l[a.codec]:l.h264,_=e.u(await i.Encoder.create(h,{...a.videoBitrate&&{bitrate:a.videoBitrate}})),v=f.addStream(_);for await(let e of m.frames(d.packets(p.index)))try{var t=g();let n=t.u(e);if(!n)continue;await _.encode(n);let r=await _.receive();for(;r;)await f.writePacket(r,v),r.free(),r=await _.receive()}catch(e){t.e=e}finally{t.d()}await _.flush();let y=await _.receive();for(;y;)await f.writePacket(y,v),y.free(),y=await _.receive();let b=d.audio();if(b)try{var r=g();let e=r.u(await i.Decoder.create(b)),t=a.audioCodec?u[a.audioCodec]:u.aac,n=r.u(await i.Encoder.create(t,{...a.audioBitrate&&{bitrate:a.audioBitrate}})),o=f.addStream(n);for await(let t of e.frames(d.packets(b.index)))try{var s=g();let e=s.u(t);if(!e)continue;await n.encode(e);let r=await n.receive();for(;r;)await f.writePacket(r,o),r.free(),r=await n.receive()}catch(e){s.e=e}finally{s.d()}await n.flush();let c=await n.receive();for(;c;)await f.writePacket(c,o),c.free(),c=await n.receive()}catch(e){r.e=e}finally{r.d()}}catch(t){e.e=t}finally{await e.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Streaming transcode failed: ${e instanceof Error?e.message:String(e)}`,cause:e})});return yield*r.Effect.fork(r.Effect.tap(d,()=>r.Effect.sync(c))),s}).pipe((0,n.withOperationSpan)(`video`,`transcode-stream`,{"video.format":a.format,"video.codec":a.codec,"video.streaming_input":h(o?.inputFormat)})),resizeStream:(e,a,o)=>r.Effect.gen(function*(){let n=_(e)?yield*m(e):e,{callbacks:o,stream:s,finalize:c}=p(),d=r.Effect.tryPromise({try:async()=>{try{var e=g();let c=Buffer.from(n),d=e.a(await i.Demuxer.open(c)),f=e.a(await i.Muxer.open(o,{format:`mp4`})),p=d.video();if(!p)throw Error(`No video stream found`);if(!a.width&&!a.height)throw Error(`Either width or height must be specified`);let m=e.u(await i.Decoder.create(p)),h=e.u(await i.Encoder.create(l.h264)),_=f.addStream(h);for await(let e of m.frames(d.packets(p.index)))try{var t=g();let n=t.u(e);if(!n)continue;await h.encode(n);let r=await h.receive();for(;r;)await f.writePacket(r,_),r.free(),r=await h.receive()}catch(e){t.e=e}finally{t.d()}await h.flush();let v=await h.receive();for(;v;)await f.writePacket(v,_),v.free(),v=await h.receive();let y=d.audio();if(y)try{var r=g();let e=r.u(await i.Decoder.create(y)),t=r.u(await i.Encoder.create(u.aac)),n=f.addStream(t);for await(let r of e.frames(d.packets(y.index)))try{var s=g();let e=s.u(r);if(!e)continue;await t.encode(e);let i=await t.receive();for(;i;)await f.writePacket(i,n),i.free(),i=await t.receive()}catch(e){s.e=e}finally{s.d()}await t.flush();let a=await t.receive();for(;a;)await f.writePacket(a,n),a.free(),a=await t.receive()}catch(e){r.e=e}finally{r.d()}}catch(t){e.e=t}finally{await e.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Streaming resize failed: ${e instanceof Error?e.message:String(e)}`,cause:e})});return yield*r.Effect.fork(r.Effect.tap(d,()=>r.Effect.sync(c))),s}).pipe((0,n.withOperationSpan)(`video`,`resize-stream`,{"video.width":a.width,"video.height":a.height,"video.streaming_input":h(o?.inputFormat)})),trimStream:(e,a,o)=>r.Effect.gen(function*(){let n=_(e)?yield*m(e):e,{callbacks:o,stream:s,finalize:c}=p(),d=r.Effect.tryPromise({try:async()=>{try{var e=g();let c=Buffer.from(n),d=e.a(await i.Demuxer.open(c)),f=e.a(await i.Muxer.open(o,{format:`mp4`})),p=d.video();if(!p)throw Error(`No video stream found`);let m;m=a.duration===void 0?a.endTime===void 0?d.duration||1/0:a.endTime:a.startTime+a.duration;let h=e.u(await i.Decoder.create(p)),_=e.u(await i.Encoder.create(l.h264)),v=f.addStream(_);for await(let e of h.frames(d.packets(p.index)))try{var t=g();let n=t.u(e);if(!n)continue;let r=n.pts||0n,i=p.timeBase?p.timeBase.num/p.timeBase.den:1,o=Number(r)*i;if(o>=a.startTime&&o<m){await _.encode(n);let e=await _.receive();for(;e;)await f.writePacket(e,v),e.free(),e=await _.receive()}if(o>=m)break}catch(e){t.e=e}finally{t.d()}await _.flush();let y=await _.receive();for(;y;)await f.writePacket(y,v),y.free(),y=await _.receive();let b=d.audio();if(b)try{var r=g();let e=r.u(await i.Decoder.create(b)),t=r.u(await i.Encoder.create(u.aac)),n=f.addStream(t);for await(let r of e.frames(d.packets(b.index)))try{var s=g();let e=s.u(r);if(!e)continue;let i=e.pts||0n,o=b.timeBase?b.timeBase.num/b.timeBase.den:1,c=Number(i)*o;if(c>=a.startTime&&c<m){await t.encode(e);let r=await t.receive();for(;r;)await f.writePacket(r,n),r.free(),r=await t.receive()}if(c>=m)break}catch(e){s.e=e}finally{s.d()}await t.flush();let o=await t.receive();for(;o;)await f.writePacket(o,n),o.free(),o=await t.receive()}catch(e){r.e=e}finally{r.d()}}catch(t){e.e=t}finally{await e.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Streaming trim failed: ${e instanceof Error?e.message:String(e)}`,cause:e})});return yield*r.Effect.fork(r.Effect.tap(d,()=>r.Effect.sync(c))),s}).pipe((0,n.withOperationSpan)(`video`,`trim-stream`,{"video.start_time":a.startTime,"video.end_time":a.endTime,"video.duration":a.duration,"video.streaming_input":h(o?.inputFormat)}))}}const y=()=>r.Layer.succeed(a.VideoPlugin,v()),b=()=>r.Layer.effectDiscard(r.Effect.gen(function*(){let e=yield*r.Effect.promise(()=>o());e.available?console.log(`✓ node-av ${e.version} detected`):console.warn(`⚠️ node-av is not installed or not available.`,`
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`node-av/constants`),t=require(`@uploadista/core/errors`),n=require(`@uploadista/observability`),r=require(`effect`),i=require(`node-av/api`),a=require(`@uploadista/core/flow`);async function o(){try{return await import(`node-av`),{available:!0,version:`4.x`}}catch(e){return{available:!1,error:e instanceof Error?e.message:String(e)}}}const s={mp4:`video/mp4`,webm:`video/webm`,mov:`video/quicktime`,avi:`video/x-msvideo`},c={mp4:`mp4`,webm:`webm`,mov:`mov`,avi:`avi`},l={h264:e.FF_ENCODER_LIBX264,h265:e.FF_ENCODER_LIBX265,vp9:e.FF_ENCODER_LIBVPX_VP9,av1:e.FF_ENCODER_LIBAOM_AV1},u={aac:e.FF_ENCODER_AAC,mp3:e.FF_ENCODER_LIBMP3LAME,opus:e.FF_ENCODER_LIBOPUS,vorbis:e.FF_ENCODER_LIBVORBIS},d={jpeg:e.FF_ENCODER_MJPEG,mjpeg:e.FF_ENCODER_MJPEG,png:e.FF_ENCODER_PNG};function f(){let e=[],t=0n;return{callbacks:{write:n=>(e.push(n),t+=BigInt(n.length),n.length),seek:(e,n)=>{switch(n){case 0:t=e;break;case 1:t+=e;break;case 2:t=e;break}return t}},getOutput:()=>{let t=e.reduce((e,t)=>e+t.length,0),n=new Uint8Array(t),r=0;for(let t of e)n.set(t,r),r+=t.length;return n}}}function p(){let e=[],n=!1,i=null,a=0n;return{callbacks:{write:t=>{let n=new Uint8Array(t);if(e.push(n),a+=BigInt(t.length),i){let e=i;i=null,e()}return t.length},seek:(e,t)=>{switch(t){case 0:a=e;break;case 1:a+=e;break;case 2:a=e;break}return a}},stream:r.Stream.async(a=>((async()=>{for(;;){for(;e.length>0;){let t=e.shift();t&&a.single(t)}if(n&&e.length===0){a.end();return}await new Promise(t=>{i=t,(e.length>0||n)&&(i=null,t())})}})().catch(e=>{a.fail(t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Streaming output failed: ${e instanceof Error?e.message:String(e)}`,cause:e}))}),r.Effect.void)),finalize:()=>{if(n=!0,i){let e=i;i=null,e()}}}}function m(e){return r.Effect.gen(function*(){let t=[];yield*r.Stream.runForEach(e,e=>r.Effect.sync(()=>{t.push(e)}));let n=t.reduce((e,t)=>e+t.byteLength,0),i=new Uint8Array(n),a=0;for(let e of t)i.set(e,a),a+=e.byteLength;return i})}function h(e){if(!e)return!1;let t=e.toLowerCase();return t===`video/mp2t`||t===`video/mpeg-ts`||t===`video/mpegts`||t===`application/x-mpegts`}function g(){var e=typeof SuppressedError==`function`?SuppressedError:function(e,t){var n=Error();return n.name=`SuppressedError`,n.error=e,n.suppressed=t,n},t={},n=[];function r(e,t){if(t!=null){if(Object(t)!==t)throw TypeError(`using declarations can only be used with objects, functions, null, or undefined.`);if(e)var r=t[Symbol.asyncDispose||Symbol.for(`Symbol.asyncDispose`)];if(r===void 0&&(r=t[Symbol.dispose||Symbol.for(`Symbol.dispose`)],e))var i=r;if(typeof r!=`function`)throw TypeError(`Object is not disposable.`);i&&(r=function(){try{i.call(t)}catch(e){return Promise.reject(e)}}),n.push({v:t,d:r,a:e})}else e&&n.push({d:t,a:e});return t}return{e:t,u:r.bind(null,!1),a:r.bind(null,!0),d:function(){var r,i=this.e,a=0;function o(){for(;r=n.pop();)try{if(!r.a&&a===1)return a=0,n.push(r),Promise.resolve().then(o);if(r.d){var e=r.d.call(r.v);if(r.a)return a|=2,Promise.resolve(e).then(o,s)}else a|=1}catch(e){return s(e)}if(a===1)return i===t?Promise.resolve():Promise.reject(i);if(i!==t)throw i}function s(n){return i=i===t?n:new e(n,i),o()}return o()}}}function _(e){return typeof e==`object`&&!!e&&`pipe`in e&&typeof e.pipe==`function`}function v(){return{describe:e=>r.Effect.tryPromise({try:async()=>{try{var t=g();let n=Buffer.from(e),r=t.a(await i.Demuxer.open(n)),a=r.video(),o=r.audio();if(!a)throw Error(`No video stream found`);let s=a.codecpar,c=0;if(a.rFrameRate){let{num:e,den:t}=a.rFrameRate;c=t?e/t:e}let l=`unknown`;if(a.sampleAspectRatio){let{num:e,den:t}=a.sampleAspectRatio;l=`${e}:${t}`}return{duration:r.duration||0,width:s.width||0,height:s.height||0,codec:String(s.codecId)||`unknown`,format:r.formatName||`unknown`,bitrate:r.bitRate||0,frameRate:c,aspectRatio:l,hasAudio:!!o,audioCodec:o?.codecpar.codecId?String(o.codecpar.codecId):void 0,audioBitrate:o?.codecpar.bitRate?Number(o.codecpar.bitRate):void 0,size:e.byteLength}}catch(e){t.e=e}finally{await t.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_METADATA_EXTRACTION_FAILED`,{body:`Failed to extract video metadata: ${e instanceof Error?e.message:String(e)}`,cause:e})}).pipe((0,n.withOperationSpan)(`video`,`describe`,{"video.input_size":e.byteLength})),transcode:(e,a)=>r.Effect.tryPromise({try:async()=>{try{var t=g();let s=Buffer.from(e),{callbacks:c,getOutput:d}=f(),p=t.a(await i.Demuxer.open(s)),m=t.a(await i.Muxer.open(c,{format:a.format})),h=p.video();if(!h)throw Error(`No video stream found`);let _=t.u(await i.Decoder.create(h)),v=a.codec?l[a.codec]:l.h264,y=t.u(await i.Encoder.create(v,{...a.videoBitrate&&{bitrate:a.videoBitrate}})),b=m.addStream(y);for await(let e of _.frames(p.packets(h.index)))try{var n=g();let t=n.u(e);if(!t)continue;await y.encode(t);let r=await y.receive();for(;r;)await m.writePacket(r,b),r.free(),r=await y.receive()}catch(e){n.e=e}finally{n.d()}await y.flush();let x=await y.receive();for(;x;)await m.writePacket(x,b),x.free(),x=await y.receive();let S=p.audio();if(S)try{var r=g();let e=r.u(await i.Decoder.create(S)),t=a.audioCodec?u[a.audioCodec]:u.aac,n=r.u(await i.Encoder.create(t,{...a.audioBitrate&&{bitrate:a.audioBitrate}})),s=m.addStream(n);for await(let t of e.frames(p.packets(S.index)))try{var o=g();let e=o.u(t);if(!e)continue;await n.encode(e);let r=await n.receive();for(;r;)await m.writePacket(r,s),r.free(),r=await n.receive()}catch(e){o.e=e}finally{o.d()}await n.flush();let c=await n.receive();for(;c;)await m.writePacket(c,s),c.free(),c=await n.receive()}catch(e){r.e=e}finally{r.d()}return d()}catch(e){t.e=e}finally{await t.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Transcode failed: ${e instanceof Error?e.message:String(e)}`,cause:e})}).pipe((0,n.withOperationSpan)(`video`,`transcode`,{"video.format":a.format,"video.codec":a.codec,"video.video_bitrate":a.videoBitrate,"video.audio_codec":a.audioCodec,"video.audio_bitrate":a.audioBitrate,"video.input_size":e.byteLength})),resize:(e,a)=>r.Effect.tryPromise({try:async()=>{try{var t=g();let s=Buffer.from(e),{callbacks:c,getOutput:d}=f(),p=t.a(await i.Demuxer.open(s)),m=t.a(await i.Muxer.open(c,{format:`mp4`})),h=p.video();if(!h)throw Error(`No video stream found`);let _=t.u(await i.Decoder.create(h));if(!a.width&&!a.height)throw Error(`Either width or height must be specified`);let v=t.u(await i.Encoder.create(l.h264)),y=m.addStream(v);for await(let e of _.frames(p.packets(h.index)))try{var n=g();let t=n.u(e);if(!t)continue;await v.encode(t);let r=await v.receive();for(;r;)await m.writePacket(r,y),r.free(),r=await v.receive()}catch(e){n.e=e}finally{n.d()}await v.flush();let b=await v.receive();for(;b;)await m.writePacket(b,y),b.free(),b=await v.receive();let x=p.audio();if(x)try{var r=g();let e=r.u(await i.Decoder.create(x)),t=r.u(await i.Encoder.create(u.aac)),n=m.addStream(t);for await(let r of e.frames(p.packets(x.index)))try{var o=g();let e=o.u(r);if(!e)continue;await t.encode(e);let i=await t.receive();for(;i;)await m.writePacket(i,n),i.free(),i=await t.receive()}catch(e){o.e=e}finally{o.d()}await t.flush();let a=await t.receive();for(;a;)await m.writePacket(a,n),a.free(),a=await t.receive()}catch(e){r.e=e}finally{r.d()}return d()}catch(e){t.e=e}finally{await t.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Resize failed: ${e instanceof Error?e.message:String(e)}`,cause:e})}).pipe((0,n.withOperationSpan)(`video`,`resize`,{"video.width":a.width,"video.height":a.height,"video.input_size":e.byteLength})),trim:(e,a)=>r.Effect.tryPromise({try:async()=>{try{var t=g();let s=Buffer.from(e),{callbacks:c,getOutput:d}=f(),p=t.a(await i.Demuxer.open(s)),m=t.a(await i.Muxer.open(c,{format:`mp4`})),h=p.video();if(!h)throw Error(`No video stream found`);let _;_=a.duration===void 0?a.endTime===void 0?p.duration||1/0:a.endTime:a.startTime+a.duration;let v=t.u(await i.Decoder.create(h)),y=t.u(await i.Encoder.create(l.h264)),b=m.addStream(y);for await(let e of v.frames(p.packets(h.index)))try{var n=g();let t=n.u(e);if(!t)continue;let r=t.pts||0n,i=h.timeBase?h.timeBase.num/h.timeBase.den:1,o=Number(r)*i;if(o>=a.startTime&&o<_){await y.encode(t);let e=await y.receive();for(;e;)await m.writePacket(e,b),e.free(),e=await y.receive()}if(o>=_)break}catch(e){n.e=e}finally{n.d()}await y.flush();let x=await y.receive();for(;x;)await m.writePacket(x,b),x.free(),x=await y.receive();let S=p.audio();if(S)try{var r=g();let e=r.u(await i.Decoder.create(S)),t=r.u(await i.Encoder.create(u.aac)),n=m.addStream(t);for await(let r of e.frames(p.packets(S.index)))try{var o=g();let e=o.u(r);if(!e)continue;let i=e.pts||0n,s=S.timeBase?S.timeBase.num/S.timeBase.den:1,c=Number(i)*s;if(c>=a.startTime&&c<_){await t.encode(e);let r=await t.receive();for(;r;)await m.writePacket(r,n),r.free(),r=await t.receive()}if(c>=_)break}catch(e){o.e=e}finally{o.d()}await t.flush();let s=await t.receive();for(;s;)await m.writePacket(s,n),s.free(),s=await t.receive()}catch(e){r.e=e}finally{r.d()}return d()}catch(e){t.e=e}finally{await t.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Trim failed: ${e instanceof Error?e.message:String(e)}`,cause:e})}).pipe((0,n.withOperationSpan)(`video`,`trim`,{"video.start_time":a.startTime,"video.end_time":a.endTime,"video.duration":a.duration,"video.input_size":e.byteLength})),extractFrame:(e,a)=>r.Effect.tryPromise({try:async()=>{try{var t=g();let o=Buffer.from(e),s=a.format||`jpeg`,c=t.a(await i.Demuxer.open(o)),l=c.video();if(!l)throw Error(`No video stream found`);let u=t.u(await i.Decoder.create(l)),f=null,p=a.timestamp;for await(let e of u.frames(c.packets(l.index)))try{var n=g();let t=n.u(e);if(!t)continue;let a=t.pts||0n,o=l.timeBase?l.timeBase.num/l.timeBase.den:1;if(Number(a)*o>=p)try{var r=g();let e=d[s]||d.jpeg,n=r.u(await i.Encoder.create(e));await n.encode(t);let a=await n.receive();if(a?.data){f=new Uint8Array(a.data),a.free();break}}catch(e){r.e=e}finally{r.d()}}catch(e){n.e=e}finally{n.d()}if(!f)throw Error(`No frame found at timestamp ${p}`);return f}catch(e){t.e=e}finally{await t.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Frame extraction failed: ${e instanceof Error?e.message:String(e)}`,cause:e})}).pipe((0,n.withOperationSpan)(`video`,`extract-frame`,{"video.timestamp":a.timestamp,"video.format":a.format??`jpeg`,"video.input_size":e.byteLength})),supportsStreaming:!0,transcodeStream:(e,a,o)=>r.Effect.gen(function*(){let n=_(e)?yield*m(e):e,{callbacks:o,stream:s,finalize:c}=p(),d=r.Effect.tryPromise({try:async()=>{try{var e=g();let c=Buffer.from(n),d=e.a(await i.Demuxer.open(c)),f=e.a(await i.Muxer.open(o,{format:a.format})),p=d.video();if(!p)throw Error(`No video stream found`);let m=e.u(await i.Decoder.create(p)),h=a.codec?l[a.codec]:l.h264,_=e.u(await i.Encoder.create(h,{...a.videoBitrate&&{bitrate:a.videoBitrate}})),v=f.addStream(_);for await(let e of m.frames(d.packets(p.index)))try{var t=g();let n=t.u(e);if(!n)continue;await _.encode(n);let r=await _.receive();for(;r;)await f.writePacket(r,v),r.free(),r=await _.receive()}catch(e){t.e=e}finally{t.d()}await _.flush();let y=await _.receive();for(;y;)await f.writePacket(y,v),y.free(),y=await _.receive();let b=d.audio();if(b)try{var r=g();let e=r.u(await i.Decoder.create(b)),t=a.audioCodec?u[a.audioCodec]:u.aac,n=r.u(await i.Encoder.create(t,{...a.audioBitrate&&{bitrate:a.audioBitrate}})),o=f.addStream(n);for await(let t of e.frames(d.packets(b.index)))try{var s=g();let e=s.u(t);if(!e)continue;await n.encode(e);let r=await n.receive();for(;r;)await f.writePacket(r,o),r.free(),r=await n.receive()}catch(e){s.e=e}finally{s.d()}await n.flush();let c=await n.receive();for(;c;)await f.writePacket(c,o),c.free(),c=await n.receive()}catch(e){r.e=e}finally{r.d()}}catch(t){e.e=t}finally{await e.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Streaming transcode failed: ${e instanceof Error?e.message:String(e)}`,cause:e})});return yield*r.Effect.fork(r.Effect.tap(d,()=>r.Effect.sync(c))),s}).pipe((0,n.withOperationSpan)(`video`,`transcode-stream`,{"video.format":a.format,"video.codec":a.codec,"video.streaming_input":h(o?.inputFormat)})),resizeStream:(e,a,o)=>r.Effect.gen(function*(){let n=_(e)?yield*m(e):e,{callbacks:o,stream:s,finalize:c}=p(),d=r.Effect.tryPromise({try:async()=>{try{var e=g();let c=Buffer.from(n),d=e.a(await i.Demuxer.open(c)),f=e.a(await i.Muxer.open(o,{format:`mp4`})),p=d.video();if(!p)throw Error(`No video stream found`);if(!a.width&&!a.height)throw Error(`Either width or height must be specified`);let m=e.u(await i.Decoder.create(p)),h=e.u(await i.Encoder.create(l.h264)),_=f.addStream(h);for await(let e of m.frames(d.packets(p.index)))try{var t=g();let n=t.u(e);if(!n)continue;await h.encode(n);let r=await h.receive();for(;r;)await f.writePacket(r,_),r.free(),r=await h.receive()}catch(e){t.e=e}finally{t.d()}await h.flush();let v=await h.receive();for(;v;)await f.writePacket(v,_),v.free(),v=await h.receive();let y=d.audio();if(y)try{var r=g();let e=r.u(await i.Decoder.create(y)),t=r.u(await i.Encoder.create(u.aac)),n=f.addStream(t);for await(let r of e.frames(d.packets(y.index)))try{var s=g();let e=s.u(r);if(!e)continue;await t.encode(e);let i=await t.receive();for(;i;)await f.writePacket(i,n),i.free(),i=await t.receive()}catch(e){s.e=e}finally{s.d()}await t.flush();let a=await t.receive();for(;a;)await f.writePacket(a,n),a.free(),a=await t.receive()}catch(e){r.e=e}finally{r.d()}}catch(t){e.e=t}finally{await e.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Streaming resize failed: ${e instanceof Error?e.message:String(e)}`,cause:e})});return yield*r.Effect.fork(r.Effect.tap(d,()=>r.Effect.sync(c))),s}).pipe((0,n.withOperationSpan)(`video`,`resize-stream`,{"video.width":a.width,"video.height":a.height,"video.streaming_input":h(o?.inputFormat)})),trimStream:(e,a,o)=>r.Effect.gen(function*(){let n=_(e)?yield*m(e):e,{callbacks:o,stream:s,finalize:c}=p(),d=r.Effect.tryPromise({try:async()=>{try{var e=g();let c=Buffer.from(n),d=e.a(await i.Demuxer.open(c)),f=e.a(await i.Muxer.open(o,{format:`mp4`})),p=d.video();if(!p)throw Error(`No video stream found`);let m;m=a.duration===void 0?a.endTime===void 0?d.duration||1/0:a.endTime:a.startTime+a.duration;let h=e.u(await i.Decoder.create(p)),_=e.u(await i.Encoder.create(l.h264)),v=f.addStream(_);for await(let e of h.frames(d.packets(p.index)))try{var t=g();let n=t.u(e);if(!n)continue;let r=n.pts||0n,i=p.timeBase?p.timeBase.num/p.timeBase.den:1,o=Number(r)*i;if(o>=a.startTime&&o<m){await _.encode(n);let e=await _.receive();for(;e;)await f.writePacket(e,v),e.free(),e=await _.receive()}if(o>=m)break}catch(e){t.e=e}finally{t.d()}await _.flush();let y=await _.receive();for(;y;)await f.writePacket(y,v),y.free(),y=await _.receive();let b=d.audio();if(b)try{var r=g();let e=r.u(await i.Decoder.create(b)),t=r.u(await i.Encoder.create(u.aac)),n=f.addStream(t);for await(let r of e.frames(d.packets(b.index)))try{var s=g();let e=s.u(r);if(!e)continue;let i=e.pts||0n,o=b.timeBase?b.timeBase.num/b.timeBase.den:1,c=Number(i)*o;if(c>=a.startTime&&c<m){await t.encode(e);let r=await t.receive();for(;r;)await f.writePacket(r,n),r.free(),r=await t.receive()}if(c>=m)break}catch(e){s.e=e}finally{s.d()}await t.flush();let o=await t.receive();for(;o;)await f.writePacket(o,n),o.free(),o=await t.receive()}catch(e){r.e=e}finally{r.d()}}catch(t){e.e=t}finally{await e.d()}},catch:e=>t.UploadistaError.fromCode(`VIDEO_PROCESSING_FAILED`,{body:`Streaming trim failed: ${e instanceof Error?e.message:String(e)}`,cause:e})});return yield*r.Effect.fork(r.Effect.tap(d,()=>r.Effect.sync(c))),s}).pipe((0,n.withOperationSpan)(`video`,`trim-stream`,{"video.start_time":a.startTime,"video.end_time":a.endTime,"video.duration":a.duration,"video.streaming_input":h(o?.inputFormat)}))}}const y=()=>r.Layer.succeed(a.VideoPlugin,v()),b=()=>r.Layer.effectDiscard(r.Effect.gen(function*(){let e=yield*r.Effect.promise(()=>o());e.available?console.log(`✓ node-av ${e.version} detected`):console.warn(`⚠️ node-av is not installed or not available.`,`
2
2
  Video processing operations will fail.`,`
3
3
  Install node-av: npm install node-av`)})).pipe(r.Layer.provideMerge(y()));exports.audioCodecToAVName=u,exports.checkAVAvailable=o,exports.codecToAVName=l,exports.createVideoPlugin=v,exports.formatToExtension=c,exports.formatToMimeType=s,exports.imageFormatToEncoder=d,exports.videoPlugin=y,exports.videoPluginWithCheck=b;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@uploadista/flow-videos-av-node",
3
3
  "type": "module",
4
- "version": "0.1.4-beta.1",
4
+ "version": "0.2.0",
5
5
  "description": "FFmpeg video processing plugin for Uploadista Flow with av-node",
6
6
  "license": "MIT",
7
7
  "author": "Uploadista",
@@ -14,9 +14,9 @@
14
14
  }
15
15
  },
16
16
  "dependencies": {
17
- "node-av": "5.1.1",
18
- "@uploadista/observability": "0.1.4-beta.1",
19
- "@uploadista/core": "0.1.4-beta.1"
17
+ "node-av": "5.2.2",
18
+ "@uploadista/core": "0.2.0",
19
+ "@uploadista/observability": "0.2.0"
20
20
  },
21
21
  "peerDependencies": {
22
22
  "effect": "^3.0.0",
@@ -25,11 +25,11 @@
25
25
  "devDependencies": {
26
26
  "@effect/vitest": "0.27.0",
27
27
  "@types/node": "24.10.9",
28
- "effect": "3.19.15",
29
- "tsdown": "0.20.1",
28
+ "effect": "3.19.17",
29
+ "tsdown": "0.20.3",
30
30
  "vitest": "4.0.18",
31
31
  "zod": "4.3.6",
32
- "@uploadista/typescript-config": "0.1.4-beta.1"
32
+ "@uploadista/typescript-config": "0.2.0"
33
33
  },
34
34
  "scripts": {
35
35
  "build": "tsc --noEmit && tsdown",