@rendley/sdk 1.14.2 → 1.14.4

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,4 +1,4 @@
1
- import { DemuxerPacket, FFFSMountOptions, FFFSPath, FFFSType, FFMessageFrameData, FFMessageLoadConfig, FFMessageRenderSettings, FileData, FSNode, IsFirst, LogEventCallback, OK, ProgressEventCallback, FFMessageMuxerData, FFMessageInitMuxerData, FFMessageAuthentificateData, FFMessageFetchTSChunksData, FFMessageTranscodeData, FFMessageFrame, FFMessageChunkedMuxData } from "./types";
1
+ import { AudioDemuxerPacket, DemuxerPacket, FFFSMountOptions, FFFSPath, FFFSType, FFMessageFrameData, FFMessageLoadConfig, FFMessageRenderSettings, FileData, FSNode, IsFirst, LogEventCallback, OK, ProgressEventCallback, FFMessageMuxerData, FFMessageInitMuxerData, FFMessageAuthentificateData, FFMessageFetchTSChunksData, FFMessageTranscodeData, FFMessageFrame, FFMessageChunkedMuxData } from "./types";
2
2
  import { MediaInfo } from '../../modules/ffmpeg/types/FFmpeg.types';
3
3
  import { HashAlgorithmEnum } from '../../types/hash.types';
4
4
  type FFMessageOptions = {
@@ -173,6 +173,10 @@ export declare class FFmpeg {
173
173
  closeDemuxer: (id: string, { signal }?: FFMessageOptions) => Promise<OK>;
174
174
  seekDemuxer: (id: string, time: number, { signal }?: FFMessageOptions) => Promise<OK>;
175
175
  getNextPacketDemuxer: (id: string, { signal }?: FFMessageOptions) => Promise<DemuxerPacket | undefined>;
176
+ initAudioDemuxer: (id: string, path: string, audioStream?: number, { signal }?: FFMessageOptions) => Promise<OK>;
177
+ closeAudioDemuxer: (id: string, { signal }?: FFMessageOptions) => Promise<OK>;
178
+ seekAudioDemuxer: (id: string, time: number, { signal }?: FFMessageOptions) => Promise<OK>;
179
+ getNextPacketAudioDemuxer: (id: string, { signal }?: FFMessageOptions) => Promise<AudioDemuxerPacket | undefined>;
176
180
  initMuxer: (initSettings: FFMessageInitMuxerData, { signal }?: FFMessageOptions) => Promise<OK>;
177
181
  addChunkMuxer: (data: FFMessageMuxerData, { signal }?: FFMessageOptions) => Promise<OK>;
178
182
  closeMuxer: ({ signal }?: FFMessageOptions) => Promise<OK>;
@@ -33,6 +33,10 @@ export declare enum FFMessageType {
33
33
  DEMUXER_SEEK = "DEMUXER_SEEK",
34
34
  DEMUXER_CLOSE = "DEMUXER_CLOSE",
35
35
  DEMUXER_GET_PACKET = "DEMUXER_GET_PACKET",
36
+ AUDIO_DEMUXER_INIT = "AUDIO_DEMUXER_INIT",
37
+ AUDIO_DEMUXER_SEEK = "AUDIO_DEMUXER_SEEK",
38
+ AUDIO_DEMUXER_CLOSE = "AUDIO_DEMUXER_CLOSE",
39
+ AUDIO_DEMUXER_GET_PACKET = "AUDIO_DEMUXER_GET_PACKET",
36
40
  MUXER_INIT = "MUXER_INIT",
37
41
  MUXER_ADD_VIDEO_CHUNK = "MUXER_ADD_VIDEO_CHUNK",
38
42
  MUXER_CLOSE = "MUXER_FINALIZE",
@@ -68,6 +68,18 @@ export interface FFMessageSeekDemuxerData {
68
68
  export interface FFMessageIdDemuxerData {
69
69
  id: string;
70
70
  }
71
+ export interface FFMessageInitAudioDemuxerData {
72
+ id: string;
73
+ path: FFFSPath;
74
+ audioStream: number;
75
+ }
76
+ export interface FFMessageSeekAudioDemuxerData {
77
+ id: string;
78
+ time: number;
79
+ }
80
+ export interface FFMessageIdAudioDemuxerData {
81
+ id: string;
82
+ }
71
83
  export interface FFMessageMuxerData {
72
84
  packet: Uint8Array;
73
85
  timestamp: bigint;
@@ -215,7 +227,7 @@ export interface FFMessageMountData {
215
227
  export interface FFMessageUnmountData {
216
228
  mountPoint: FFFSPath;
217
229
  }
218
- export type FFMessageData = FFMessageLoadConfig | FFMessageExecData | FFMessageWriteFileData | FFMessageReadFileData | FFMessageReadFilesAsBlobData | FFMessageDeleteFileData | FFMessageRenameData | FFMessageCreateDirData | FFMessageListDirData | FFMessageDeleteDirData | FFMessageMountData | FFMessageUnmountData | FFMessageGetInfoData | FFMessageGetSubtitlesData | FFMessageFrameData | FFMessageFrame | FFMessageRenderSettings | FFMessageChunkedMuxData | FFMessageInitDemuxerData | FFMessageSeekDemuxerData | FFMessageIdDemuxerData | FFMessageMuxerData | FFMessageAuthentificateData | FFMessageFetchTSChunksData | FFMessageTranscodeData | FFMessageCreateArchiveData | FFMessageOpenArchiveData | FFMessageSaveArchiveData | FFMessageCloseArchiveData | FFMessageAddDataToArchiveData | FFMessageReadFileFromArchiveData | FFMessageExtractAllFromArchiveData | FFMessageAddFileToArchiveData | FFMessageAddFilesToArchiveData | FFMessageListFilesFromArchiveData | FFMessageExtractFileFromArchiveData | FFMessagePathExistsData;
230
+ export type FFMessageData = FFMessageLoadConfig | FFMessageExecData | FFMessageWriteFileData | FFMessageReadFileData | FFMessageReadFilesAsBlobData | FFMessageDeleteFileData | FFMessageRenameData | FFMessageCreateDirData | FFMessageListDirData | FFMessageDeleteDirData | FFMessageMountData | FFMessageUnmountData | FFMessageGetInfoData | FFMessageGetSubtitlesData | FFMessageFrameData | FFMessageFrame | FFMessageRenderSettings | FFMessageChunkedMuxData | FFMessageInitDemuxerData | FFMessageSeekDemuxerData | FFMessageIdDemuxerData | FFMessageInitAudioDemuxerData | FFMessageSeekAudioDemuxerData | FFMessageIdAudioDemuxerData | FFMessageMuxerData | FFMessageAuthentificateData | FFMessageFetchTSChunksData | FFMessageTranscodeData | FFMessageCreateArchiveData | FFMessageOpenArchiveData | FFMessageSaveArchiveData | FFMessageCloseArchiveData | FFMessageAddDataToArchiveData | FFMessageReadFileFromArchiveData | FFMessageExtractAllFromArchiveData | FFMessageAddFileToArchiveData | FFMessageAddFilesToArchiveData | FFMessageListFilesFromArchiveData | FFMessageExtractFileFromArchiveData | FFMessagePathExistsData;
219
231
  export interface Message {
220
232
  type: string;
221
233
  data?: FFMessageData;
@@ -240,6 +252,11 @@ export interface DemuxerPacket {
240
252
  timestamp: bigint;
241
253
  duration: bigint;
242
254
  }
255
+ export interface AudioDemuxerPacket {
256
+ packet: Uint8Array;
257
+ timestamp: bigint;
258
+ duration: bigint;
259
+ }
243
260
  export type ExitCode = number;
244
261
  export type ErrorMessage = string;
245
262
  export type FileData = Uint8Array | string;
@@ -919,9 +919,9 @@ export declare const ClipSchema: z.ZodObject<{
919
919
  }, "strip", z.ZodTypeAny, {
920
920
  type: string;
921
921
  id: string;
922
+ duration: number;
922
923
  subtitlesOffset: number;
923
924
  startTime: number;
924
- duration: number;
925
925
  leftTrim: number;
926
926
  rightTrim: number;
927
927
  filters: {
@@ -1015,9 +1015,9 @@ export declare const ClipSchema: z.ZodObject<{
1015
1015
  }, {
1016
1016
  type: string;
1017
1017
  id: string;
1018
+ duration: number;
1018
1019
  subtitlesOffset: number;
1019
1020
  startTime: number;
1020
- duration: number;
1021
1021
  leftTrim: number;
1022
1022
  rightTrim: number;
1023
1023
  filters: {
@@ -1335,9 +1335,9 @@ export declare class Clip<T extends PIXI.Sprite = PIXI.Sprite, K extends ClipSty
1335
1335
  serialize(): {
1336
1336
  type: string;
1337
1337
  id: string;
1338
+ duration: number;
1338
1339
  subtitlesOffset: number;
1339
1340
  startTime: number;
1340
- duration: number;
1341
1341
  leftTrim: number;
1342
1342
  rightTrim: number;
1343
1343
  filters: {
@@ -91,10 +91,10 @@ export declare class AudioClip extends Clip {
91
91
  serialize(): {
92
92
  type: string;
93
93
  id: string;
94
+ duration: number;
94
95
  mediaDataId: string;
95
96
  subtitlesOffset: number;
96
97
  startTime: number;
97
- duration: number;
98
98
  leftTrim: number;
99
99
  rightTrim: number;
100
100
  filters: {
@@ -11,9 +11,9 @@ export declare class CustomClip extends Clip<PIXI.Sprite, ClipStyle> {
11
11
  serialize(): {
12
12
  type: string;
13
13
  id: string;
14
+ duration: number;
14
15
  subtitlesOffset: number;
15
16
  startTime: number;
16
- duration: number;
17
17
  leftTrim: number;
18
18
  rightTrim: number;
19
19
  filters: {
@@ -120,9 +120,9 @@ export declare class HtmlTextClip extends Clip<PIXI.Sprite, ClipStyle<PIXI.Sprit
120
120
  serialize(): {
121
121
  type: string;
122
122
  id: string;
123
+ duration: number;
123
124
  subtitlesOffset: number;
124
125
  startTime: number;
125
- duration: number;
126
126
  leftTrim: number;
127
127
  rightTrim: number;
128
128
  filters: {
@@ -135,8 +135,11 @@ export declare class LottieClip extends Clip<PIXI.Sprite, ClipStyle<PIXI.Sprite>
135
135
  private autoFit;
136
136
  private canvas;
137
137
  private context;
138
+ private lastUpdatedFrame;
139
+ private hasTimeExpression;
138
140
  constructor(options: LottieClipOptions);
139
141
  init(layerId: string): Promise<void>;
142
+ private checkForTimeExpressions;
140
143
  private applyProperties;
141
144
  getAnimationData(): any | undefined;
142
145
  replaceAnimationData(data: any): Promise<void>;
@@ -187,9 +190,9 @@ export declare class LottieClip extends Clip<PIXI.Sprite, ClipStyle<PIXI.Sprite>
187
190
  serialize(): {
188
191
  type: string;
189
192
  id: string;
193
+ duration: number;
190
194
  subtitlesOffset: number;
191
195
  startTime: number;
192
- duration: number;
193
196
  leftTrim: number;
194
197
  rightTrim: number;
195
198
  filters: {
@@ -14,9 +14,9 @@ export declare class ShapeClip extends Clip<ShapeSprite, ShapeStyle> {
14
14
  serialize(): {
15
15
  type: string;
16
16
  id: string;
17
+ duration: number;
17
18
  subtitlesOffset: number;
18
19
  startTime: number;
19
- duration: number;
20
20
  leftTrim: number;
21
21
  rightTrim: number;
22
22
  filters: {
@@ -21,9 +21,9 @@ export declare class SvgClip extends Clip<PIXI.Sprite, ClipStyle<PIXI.Sprite>> {
21
21
  serialize(): {
22
22
  type: string;
23
23
  id: string;
24
+ duration: number;
24
25
  subtitlesOffset: number;
25
26
  startTime: number;
26
- duration: number;
27
27
  leftTrim: number;
28
28
  rightTrim: number;
29
29
  filters: {
@@ -23,9 +23,9 @@ export declare class TextClip extends Clip<TextSprite, TextStyle> {
23
23
  type: string;
24
24
  text: string;
25
25
  id: string;
26
+ duration: number;
26
27
  subtitlesOffset: number;
27
28
  startTime: number;
28
- duration: number;
29
29
  leftTrim: number;
30
30
  rightTrim: number;
31
31
  filters: {
@@ -169,10 +169,10 @@ export declare class VideoClip extends Clip<PIXI.Sprite, ClipStyle<PIXI.Sprite>>
169
169
  serialize(): {
170
170
  type: string;
171
171
  id: string;
172
+ duration: number;
172
173
  mediaDataId: string;
173
174
  subtitlesOffset: number;
174
175
  startTime: number;
175
- duration: number;
176
176
  leftTrim: number;
177
177
  rightTrim: number;
178
178
  filters: {
@@ -82,13 +82,6 @@ export declare class MediaData {
82
82
  private workerFSFilePath?;
83
83
  private fetchAbortController;
84
84
  audioSplit?: string;
85
- private static audioSampleWorker;
86
- private static audioSampleWorkerInitPromise;
87
- private static audioSampleActiveRequests;
88
- private static audioSampleCleanupTimer;
89
- private static readonly AUDIO_SAMPLE_WORKER_IDLE_TIMEOUT_MS;
90
- private static acquireAudioSampleWorker;
91
- private static releaseAudioSampleWorker;
92
85
  private static lockMediaInfo;
93
86
  private waitForMediaInfoUnlock;
94
87
  static unlockMediaInfo(): void;
@@ -124,9 +117,7 @@ export declare class MediaData {
124
117
  private ensureWorkerFSRoot;
125
118
  private cleanupWorkerFSMount;
126
119
  private mountInputToWorkerFS;
127
- private deinterleaveAudioSamples;
128
- private mixToMono;
129
- private extractAudioSamples;
120
+ private doExtractAudioSamples;
130
121
  getAudioSamples(startTime: number, duration?: number): Float32Array[] | null;
131
122
  private checkPlaceholderClips;
132
123
  setCustomData(key: string, value: unknown, overwrite?: boolean): boolean;
@@ -1,5 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { HashAlgorithmEnum } from '../../types/hash.types';
3
+ import { MonoMixType } from '../../utils/audio/AudioPostProcess.types';
3
4
  export declare enum PreferredAcceleration {
4
5
  HARDWARE = "prefer-hardware",
5
6
  SOFTWARE = "prefer-software",
@@ -24,14 +25,6 @@ export declare enum AutoLayoutMode {
24
25
  PREFER_WIDTH = "prefer-width",
25
26
  PREFER_HEIGHT = "prefer-height"
26
27
  }
27
- export declare enum MonoMixType {
28
- AVERAGE = "average",
29
- ABSOLUTE_AVERAGE = "absolute-average",
30
- PEAK_MIN = "peak-min",
31
- PEAK_MAX = "peak-max",
32
- ABSOLUTE_MAX = "absolute-max",
33
- ABSOLUTE_MIN = "absolute-min"
34
- }
35
28
  export declare const SettingsSchema: z.ZodObject<{
36
29
  m3u8MaxResolution: z.ZodDefault<z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>>;
37
30
  useInternalTranscoder: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
@@ -1 +1,2 @@
1
1
  export * from "./Settings";
2
+ export { MonoMixType } from '../../utils/audio/AudioPostProcess.types';
@@ -0,0 +1,19 @@
1
+ import { AudioPostProcessSettings } from "./AudioPostProcess.types";
2
+ export type { AudioPostProcessSettings } from "./AudioPostProcess.types";
3
+ export interface DecodeAndPostProcessResult {
4
+ channels: Float32Array[];
5
+ decodedChannels: number;
6
+ decodedDuration: number;
7
+ }
8
+ /**
9
+ * Send already-decoded channel data to the worker for resample + mono mix.
10
+ * Buffers are transferred (zero-copy) both ways.
11
+ */
12
+ export declare function postProcessAudioChannels(channels: Float32Array[], settings: AudioPostProcessSettings): Promise<Float32Array[]>;
13
+ /**
14
+ * Send raw encoded audio data to the worker for decode + resample + mono mix.
15
+ * When OfflineAudioContext is available in the worker (secure context), the entire
16
+ * pipeline runs off the main thread. Otherwise, decoding falls back to the main
17
+ * thread's AudioContext, with resample + mix still handled by the worker.
18
+ */
19
+ export declare function decodeAndPostProcessInWorker(audioData: ArrayBuffer, settings: AudioPostProcessSettings): Promise<DecodeAndPostProcessResult>;
@@ -0,0 +1,53 @@
1
+ export declare enum MonoMixType {
2
+ AVERAGE = "average",
3
+ ABSOLUTE_AVERAGE = "absolute-average",
4
+ PEAK_MIN = "peak-min",
5
+ PEAK_MAX = "peak-max",
6
+ ABSOLUTE_MAX = "absolute-max",
7
+ ABSOLUTE_MIN = "absolute-min"
8
+ }
9
+ export interface AudioPostProcessSettings {
10
+ inputSampleRate: number;
11
+ outputSampleRate: number;
12
+ forceMono: boolean;
13
+ monoMixType: MonoMixType;
14
+ monoChannelsWeight: number[];
15
+ }
16
+ export declare enum AudioPostProcessMsgType {
17
+ PROCESS = "process",
18
+ DECODE_AND_PROCESS = "decode_and_process",
19
+ RESULT = "result",
20
+ DECODE_UNSUPPORTED = "decode_unsupported",
21
+ ERROR = "error"
22
+ }
23
+ export interface AudioPostProcessRequest {
24
+ id: number;
25
+ type: AudioPostProcessMsgType.PROCESS;
26
+ channels: Float32Array[];
27
+ settings: AudioPostProcessSettings;
28
+ }
29
+ export interface AudioDecodeAndProcessRequest {
30
+ id: number;
31
+ type: AudioPostProcessMsgType.DECODE_AND_PROCESS;
32
+ audioData: ArrayBuffer;
33
+ settings: AudioPostProcessSettings;
34
+ }
35
+ export interface AudioPostProcessResultResponse {
36
+ id: number;
37
+ type: AudioPostProcessMsgType.RESULT;
38
+ channels: Float32Array[];
39
+ decodedChannels: number;
40
+ decodedDuration: number;
41
+ }
42
+ export interface AudioPostProcessDecodeUnsupportedResponse {
43
+ id: number;
44
+ type: AudioPostProcessMsgType.DECODE_UNSUPPORTED;
45
+ audioData: ArrayBuffer;
46
+ settings: AudioPostProcessSettings;
47
+ }
48
+ export interface AudioPostProcessErrorResponse {
49
+ id: number;
50
+ type: AudioPostProcessMsgType.ERROR;
51
+ error: string;
52
+ }
53
+ export type AudioPostProcessResponse = AudioPostProcessResultResponse | AudioPostProcessDecodeUnsupportedResponse | AudioPostProcessErrorResponse;
@@ -0,0 +1,2 @@
1
+ /// <reference no-default-lib="true"/>
2
+ export {};
@@ -0,0 +1,19 @@
1
+ import { MediaInfoStream } from '../../modules/ffmpeg/types/FFmpeg.types';
2
+ export interface AudioSampleExtractionParams {
3
+ mediaId: string;
4
+ mediaSource: Blob | File;
5
+ filename: string;
6
+ fileSize: number;
7
+ audioStream: MediaInfoStream | undefined;
8
+ storePath: string | undefined;
9
+ }
10
+ /**
11
+ * Main entry point for audio sample extraction.
12
+ *
13
+ * Strategy:
14
+ * 1. File < 1GB → decodeAudioData directly on the media source (no FFmpeg)
15
+ * 2. File >= 1GB, decoded samples fit in memory → FFmpeg demux audio stream, then decodeAudioData
16
+ * 3. Decoded samples would overflow or compressed audio too large → FFmpeg chunked extraction,
17
+ * decode + post-process per chunk, then join downsampled results
18
+ */
19
+ export declare function extractAudioSamples(params: AudioSampleExtractionParams): Promise<Float32Array[] | null>;
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Cubic bezier interpolator for keyframe animation.
3
+ *
4
+ * The curve is defined by four points:
5
+ * P0 = (0, 0), P1 = handleOut, P2 = handleIn, P3 = (1, 1)
6
+ *
7
+ * Given a normalized time [0-1], returns a normalized value [0-1].
8
+ *
9
+ * @param time - Normalized time in [0, 1]
10
+ * @param handleOut - Outgoing control point [time, value], both in [0, 1]
11
+ * @param handleIn - Incoming control point [time, value], both in [0, 1]
12
+ * @returns Normalized interpolated value
13
+ */
14
+ export declare function bezierInterpolate(time: number, handleOut: [number, number], handleIn: [number, number]): number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rendley/sdk",
3
- "version": "1.14.2",
3
+ "version": "1.14.4",
4
4
  "license": "LICENSE",
5
5
  "author": "Onix Technologies",
6
6
  "homepage": "https://rendleysdk.com",
@@ -33,6 +33,7 @@
33
33
  "build:watch": "tsc && vite build --watch --mode development",
34
34
  "build:production": "tsc && vite build --mode production && npm run obfuscate",
35
35
  "obfuscate": "node ./plugins/obfuscate.js",
36
+ "minify": "node ./plugins/minify.js",
36
37
  "test": "jest",
37
38
  "lint": "eslint --ext .ts,.tsx src --fix",
38
39
  "format": "prettier --write 'src/**/*.{ts,tsx}'",
@@ -59,12 +60,14 @@
59
60
  "patch-package": "8.0.0",
60
61
  "postinstall-postinstall": "2.1.0",
61
62
  "prettier": "3.1.1",
63
+ "terser": "^5.46.1",
62
64
  "ts-jest": "29.1.1",
63
65
  "typedoc": "0.28.12",
64
66
  "typedoc-plugin-markdown": "4.8.1",
65
67
  "typescript": "^5.9.2",
66
68
  "vite": "^5.4.9",
67
- "vite-plugin-dts": "3.7.2"
69
+ "vite-plugin-dts": "3.7.2",
70
+ "vite-plugin-javascript-obfuscator": "^3.1.0"
68
71
  },
69
72
  "dependencies": {
70
73
  "@pixi/gif": "2.1.1",