@remotion/media-parser 4.0.240 → 4.0.242
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/add-avc-profile-to-track.js +2 -2
- package/dist/boxes/avc/codec-private.d.ts +1 -1
- package/dist/boxes/avc/codec-private.js +2 -2
- package/dist/boxes/avc/create-sps-pps-data.d.ts +2 -0
- package/dist/boxes/avc/create-sps-pps-data.js +28 -0
- package/dist/boxes/iso-base-media/get-keyframes.d.ts +3 -0
- package/dist/boxes/iso-base-media/get-keyframes.js +30 -0
- package/dist/boxes/iso-base-media/mdat/mdat.d.ts +3 -3
- package/dist/boxes/iso-base-media/mdat/mdat.js +9 -5
- package/dist/boxes/iso-base-media/moov/moov.d.ts +3 -3
- package/dist/boxes/iso-base-media/moov/moov.js +5 -4
- package/dist/boxes/iso-base-media/process-box.d.ts +9 -9
- package/dist/boxes/iso-base-media/process-box.js +48 -56
- package/dist/boxes/iso-base-media/stsd/mebx.d.ts +3 -3
- package/dist/boxes/iso-base-media/stsd/mebx.js +5 -4
- package/dist/boxes/iso-base-media/stsd/samples.d.ts +5 -5
- package/dist/boxes/iso-base-media/stsd/samples.js +19 -16
- package/dist/boxes/iso-base-media/stsd/stsd.d.ts +3 -3
- package/dist/boxes/iso-base-media/stsd/stsd.js +2 -2
- package/dist/boxes/iso-base-media/trak/trak.d.ts +3 -3
- package/dist/boxes/iso-base-media/trak/trak.js +7 -6
- package/dist/boxes/riff/expect-riff-box.d.ts +3 -3
- package/dist/boxes/riff/expect-riff-box.js +5 -5
- package/dist/boxes/riff/get-tracks-from-avi.js +1 -1
- package/dist/boxes/riff/parse-box.d.ts +7 -7
- package/dist/boxes/riff/parse-box.js +29 -24
- package/dist/boxes/riff/parse-list-box.d.ts +3 -3
- package/dist/boxes/riff/parse-list-box.js +2 -2
- package/dist/boxes/riff/parse-movi.d.ts +5 -5
- package/dist/boxes/riff/parse-movi.js +35 -20
- package/dist/boxes/riff/parse-riff-box.d.ts +3 -3
- package/dist/boxes/riff/parse-riff-box.js +2 -2
- package/dist/boxes/transport-stream/adts-header.d.ts +1 -1
- package/dist/boxes/transport-stream/discard-rest-of-packet.d.ts +1 -1
- package/dist/boxes/transport-stream/get-tracks.js +1 -1
- package/dist/boxes/transport-stream/handle-aac-packet.d.ts +4 -3
- package/dist/boxes/transport-stream/handle-aac-packet.js +6 -4
- package/dist/boxes/transport-stream/handle-avc-packet.d.ts +4 -3
- package/dist/boxes/transport-stream/handle-avc-packet.js +8 -6
- package/dist/boxes/transport-stream/parse-packet.d.ts +3 -3
- package/dist/boxes/transport-stream/parse-packet.js +2 -2
- package/dist/boxes/transport-stream/parse-stream-packet.d.ts +3 -3
- package/dist/boxes/transport-stream/parse-stream-packet.js +14 -7
- package/dist/boxes/transport-stream/parse-transport-stream.d.ts +5 -6
- package/dist/boxes/transport-stream/parse-transport-stream.js +10 -9
- package/dist/boxes/transport-stream/process-stream-buffers.d.ts +6 -5
- package/dist/boxes/transport-stream/process-stream-buffers.js +18 -8
- package/dist/boxes/webm/ebml.d.ts +1 -1
- package/dist/boxes/webm/get-sample-from-block.d.ts +2 -2
- package/dist/boxes/webm/get-sample-from-block.js +8 -4
- package/dist/boxes/webm/make-header.d.ts +3 -3
- package/dist/boxes/webm/parse-ebml.d.ts +4 -4
- package/dist/boxes/webm/parse-ebml.js +18 -18
- package/dist/boxes/webm/parse-webm-header.d.ts +5 -5
- package/dist/boxes/webm/parse-webm-header.js +6 -5
- package/dist/boxes/webm/segments/parse-children.d.ts +5 -5
- package/dist/boxes/webm/segments/parse-children.js +12 -13
- package/dist/boxes/webm/segments.d.ts +3 -3
- package/dist/boxes/webm/segments.js +13 -13
- package/dist/buffer-iterator.d.ts +2 -6
- package/dist/buffer-iterator.js +4 -29
- package/dist/convert-audio-or-video-sample.js +2 -0
- package/dist/create/iso-base-media/codec-specific/avc1.d.ts +1 -1
- package/dist/create/iso-base-media/codec-specific/create-codec-specific-data.d.ts +1 -1
- package/dist/create/iso-base-media/codec-specific/mp4a.d.ts +1 -1
- package/dist/create/iso-base-media/create-colr.d.ts +1 -1
- package/dist/create/iso-base-media/create-ftyp.d.ts +2 -2
- package/dist/create/iso-base-media/create-ilst.d.ts +1 -1
- package/dist/create/iso-base-media/create-mdia.d.ts +1 -1
- package/dist/create/iso-base-media/create-moov.d.ts +1 -1
- package/dist/create/iso-base-media/create-mvhd.d.ts +1 -1
- package/dist/create/iso-base-media/create-trak.d.ts +1 -1
- package/dist/create/iso-base-media/create-udta.d.ts +1 -1
- package/dist/create/iso-base-media/create-url.d.ts +1 -1
- package/dist/create/iso-base-media/ilst/create-cmt.d.ts +1 -1
- package/dist/create/iso-base-media/ilst/create-too.d.ts +1 -1
- package/dist/create/iso-base-media/mdia/create-mdhd.d.ts +1 -1
- package/dist/create/iso-base-media/mp4-header.d.ts +1 -1
- package/dist/create/iso-base-media/primitives.d.ts +13 -13
- package/dist/create/iso-base-media/serialize-track.d.ts +1 -1
- package/dist/create/iso-base-media/trak/create-tkhd.d.ts +2 -2
- package/dist/create/iso-base-media/trak/mdia/create-minf.d.ts +1 -1
- package/dist/create/iso-base-media/trak/mdia/minf/create-dinf.d.ts +1 -1
- package/dist/create/iso-base-media/trak/mdia/minf/create-smhd.d.ts +1 -1
- package/dist/create/iso-base-media/trak/mdia/minf/create-stbl.d.ts +1 -1
- package/dist/create/iso-base-media/trak/mdia/minf/create-vmhd.d.ts +1 -1
- package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-ctts.d.ts +1 -1
- package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stco.d.ts +1 -1
- package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stsc.d.ts +1 -1
- package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stss.d.ts +1 -1
- package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stsz.d.ts +1 -1
- package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stts.d.ts +1 -1
- package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-avc1.d.ts +1 -1
- package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-avcc.d.ts +1 -1
- package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-pasp.d.ts +1 -1
- package/dist/create/iso-base-media/udta/create-meta.d.ts +1 -1
- package/dist/create/iso-base-media/udta/meta/create-hdlr.d.ts +1 -1
- package/dist/create/matroska/cluster-segment.d.ts +1 -1
- package/dist/emit-available-info.d.ts +6 -4
- package/dist/emit-available-info.js +231 -79
- package/dist/errors/detect-file-type.d.ts +1 -0
- package/dist/errors/detect-file-type.js +88 -0
- package/dist/errors/file-types.d.ts +1 -0
- package/dist/errors/file-types.js +88 -0
- package/dist/errors.d.ts +68 -0
- package/dist/errors.js +71 -0
- package/dist/esm/from-fetch.mjs +1 -0
- package/dist/esm/from-node.mjs +1 -0
- package/dist/esm/from-web-file.mjs +2 -1
- package/dist/esm/index.mjs +1457 -542
- package/dist/file-types/bmp.d.ts +6 -0
- package/dist/file-types/bmp.js +23 -0
- package/dist/file-types/detect-file-type.d.ts +42 -0
- package/dist/file-types/detect-file-type.js +59 -0
- package/dist/file-types/get-jpeg-dimensions.d.ts +4 -0
- package/dist/file-types/get-jpeg-dimensions.js +32 -0
- package/dist/file-types/index.d.ts +2 -0
- package/dist/file-types/index.js +57 -0
- package/dist/file-types/jpeg.d.ts +12 -0
- package/dist/file-types/jpeg.js +44 -0
- package/dist/file-types/pdf.d.ts +4 -0
- package/dist/file-types/pdf.js +12 -0
- package/dist/file-types/png.d.ts +10 -0
- package/dist/file-types/png.js +32 -0
- package/dist/file-types/webp.d.ts +6 -0
- package/dist/file-types/webp.js +69 -0
- package/dist/file-types.d.ts +1 -0
- package/dist/file-types.js +88 -0
- package/dist/get-audio-codec.d.ts +1 -1
- package/dist/get-duration.d.ts +1 -0
- package/dist/get-duration.js +14 -1
- package/dist/get-fields-from-callbacks.d.ts +5 -0
- package/dist/get-fields-from-callbacks.js +32 -0
- package/dist/get-fps.d.ts +1 -0
- package/dist/get-fps.js +17 -12
- package/dist/get-keyframes.d.ts +5 -0
- package/dist/get-keyframes.js +20 -0
- package/dist/get-tracks.d.ts +7 -1
- package/dist/get-tracks.js +15 -10
- package/dist/has-all-info.d.ts +5 -4
- package/dist/has-all-info.js +31 -5
- package/dist/index.d.ts +2 -0
- package/dist/index.js +7 -1
- package/dist/may-skip-video-data/may-skip-video-data.d.ts +4 -0
- package/dist/may-skip-video-data/may-skip-video-data.js +14 -0
- package/dist/may-skip-video-data/need-samples-for-fields.d.ts +5 -0
- package/dist/may-skip-video-data/need-samples-for-fields.js +33 -0
- package/dist/options.d.ts +68 -53
- package/dist/parse-media.js +42 -31
- package/dist/parse-result.d.ts +2 -4
- package/dist/parse-video.d.ts +8 -5
- package/dist/parse-video.js +94 -17
- package/dist/probing/detect-file-type.d.ts +1 -0
- package/dist/probing/detect-file-type.js +88 -0
- package/dist/probing/get-jpeg-dimensions.d.ts +4 -0
- package/dist/probing/get-jpeg-dimensions.js +32 -0
- package/dist/readers/from-fetch.js +1 -0
- package/dist/readers/from-node.js +1 -0
- package/dist/readers/from-web-file.js +1 -0
- package/dist/readers/reader.d.ts +1 -0
- package/dist/register-track.d.ts +5 -5
- package/dist/register-track.js +12 -12
- package/dist/state/can-skip-tracks.js +6 -0
- package/dist/state/emitted-fields.d.ts +2 -0
- package/dist/state/emitted-fields.js +31 -0
- package/dist/state/has-tracks-section.d.ts +1 -0
- package/dist/state/keyframes.d.ts +6 -0
- package/dist/state/keyframes.js +15 -0
- package/dist/state/parser-state.d.ts +60 -29
- package/dist/state/parser-state.js +32 -150
- package/dist/state/riff.d.ts +10 -0
- package/dist/state/riff.js +32 -0
- package/dist/state/sample-callbacks.d.ts +31 -0
- package/dist/state/sample-callbacks.js +96 -0
- package/dist/state/slow-duration-fps.d.ts +8 -0
- package/dist/state/slow-duration-fps.js +36 -0
- package/dist/state/structure.d.ts +7 -0
- package/dist/state/structure.js +21 -0
- package/dist/state/tracks-and-samples.d.ts +0 -0
- package/dist/state/tracks-and-samples.js +1 -0
- package/dist/state/webm.d.ts +11 -0
- package/dist/state/webm.js +67 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/webcodec-sample-types.d.ts +2 -0
- package/package.json +3 -3
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import type { AvcPPs, AvcProfileInfo } from '../boxes/avc/parse-avc';
|
|
2
|
-
import type { OnTrackEntrySegment } from '../boxes/webm/segments';
|
|
3
|
-
import type { TrackInfo } from '../boxes/webm/segments/track-entry';
|
|
4
2
|
import type { BufferIterator } from '../buffer-iterator';
|
|
5
3
|
import type { Options, ParseMediaFields } from '../options';
|
|
6
|
-
import type {
|
|
4
|
+
import type { OnAudioTrack, OnVideoTrack } from '../webcodec-sample-types';
|
|
7
5
|
export type InternalStats = {
|
|
8
6
|
skippedBytes: number;
|
|
9
7
|
finalCursorOffset: number;
|
|
@@ -12,42 +10,75 @@ export type SpsAndPps = {
|
|
|
12
10
|
sps: AvcProfileInfo;
|
|
13
11
|
pps: AvcPPs;
|
|
14
12
|
};
|
|
15
|
-
|
|
16
|
-
export declare const makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHandlers, signal, getIterator, fields, }: {
|
|
13
|
+
export declare const makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHandlers, signal, getIterator, fields, nullifySamples, onAudioTrack, onVideoTrack, supportsContentRange, }: {
|
|
17
14
|
hasAudioTrackHandlers: boolean;
|
|
18
15
|
hasVideoTrackHandlers: boolean;
|
|
19
16
|
signal: AbortSignal | undefined;
|
|
20
17
|
getIterator: () => BufferIterator | null;
|
|
21
18
|
fields: Options<ParseMediaFields>;
|
|
19
|
+
nullifySamples: boolean;
|
|
20
|
+
supportsContentRange: boolean;
|
|
21
|
+
onAudioTrack: OnAudioTrack | null;
|
|
22
|
+
onVideoTrack: OnVideoTrack | null;
|
|
22
23
|
}) => {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
24
|
+
riff: {
|
|
25
|
+
getAvcProfile: () => SpsAndPps | null;
|
|
26
|
+
onProfile: (profile: SpsAndPps) => Promise<void>;
|
|
27
|
+
registerOnAvcProfileCallback: (callback: (profile: SpsAndPps) => Promise<void>) => void;
|
|
28
|
+
getNextTrackIndex: () => number;
|
|
29
|
+
incrementNextTrackIndex: () => void;
|
|
30
|
+
};
|
|
31
|
+
callbacks: {
|
|
32
|
+
registerVideoSampleCallback: (id: number, callback: import("../webcodec-sample-types").OnVideoSample | null) => Promise<void>;
|
|
33
|
+
onAudioSample: (trackId: number, audioSample: import("../webcodec-sample-types").AudioOrVideoSample) => Promise<void>;
|
|
34
|
+
getSamplesForTrack: (trackId: number) => number;
|
|
35
|
+
onVideoSample: (trackId: number, videoSample: import("../webcodec-sample-types").AudioOrVideoSample) => Promise<void>;
|
|
36
|
+
canSkipTracksState: {
|
|
37
|
+
canSkipTracks: () => boolean;
|
|
38
|
+
};
|
|
39
|
+
registerAudioSampleCallback: (id: number, callback: import("../webcodec-sample-types").OnAudioSample | null) => Promise<void>;
|
|
40
|
+
tracks: {
|
|
41
|
+
hasAllTracks: () => boolean;
|
|
42
|
+
setIsDone: () => void;
|
|
43
|
+
addTrack: (track: import("..").Track) => void;
|
|
44
|
+
getTracks: () => import("..").Track[];
|
|
45
|
+
ensureHasTracksAtEnd: () => void;
|
|
46
|
+
};
|
|
47
|
+
audioSampleCallbacks: Record<number, import("../webcodec-sample-types").OnAudioSample>;
|
|
48
|
+
videoSampleCallbacks: Record<number, import("../webcodec-sample-types").OnVideoSample>;
|
|
49
|
+
};
|
|
37
50
|
getInternalStats: () => InternalStats;
|
|
38
51
|
getSkipBytes: () => number;
|
|
39
52
|
increaseSkippedBytes: (bytes: number) => void;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
53
|
+
keyframes: {
|
|
54
|
+
addKeyframe: (keyframe: import("../options").MediaParserKeyframe) => void;
|
|
55
|
+
getKeyframes: () => import("../options").MediaParserKeyframe[];
|
|
56
|
+
};
|
|
57
|
+
structure: {
|
|
58
|
+
getStructureOrNull: () => import("../parse-result").Structure | null;
|
|
59
|
+
getStructure: () => import("../parse-result").Structure;
|
|
60
|
+
setStructure: (value: import("../parse-result").Structure) => void;
|
|
61
|
+
};
|
|
62
|
+
nullifySamples: boolean;
|
|
63
|
+
onAudioTrack: OnAudioTrack | null;
|
|
64
|
+
onVideoTrack: OnVideoTrack | null;
|
|
65
|
+
supportsContentRange: boolean;
|
|
66
|
+
webm: {
|
|
67
|
+
onTrackEntrySegment: import("../boxes/webm/segments").OnTrackEntrySegment;
|
|
68
|
+
getTrackInfoByNumber: (id: number) => import("../boxes/webm/segments/track-entry").TrackInfo;
|
|
69
|
+
setTimestampOffset: (byteOffset: number, timestamp: number) => void;
|
|
70
|
+
getTimestampOffsetForByteOffset: (byteOffset: number) => number | undefined;
|
|
71
|
+
timescale: null;
|
|
72
|
+
getTimescale: () => number;
|
|
73
|
+
setTimescale: (newTimescale: number) => void;
|
|
47
74
|
};
|
|
48
|
-
|
|
49
|
-
|
|
75
|
+
emittedFields: import("../options").AllOptions<ParseMediaFields>;
|
|
76
|
+
fields: Partial<import("../options").AllOptions<ParseMediaFields>>;
|
|
77
|
+
slowDurationAndFps: {
|
|
78
|
+
addSample: (videoSample: import("../webcodec-sample-types").AudioOrVideoSample) => void;
|
|
79
|
+
getSlowDurationInSeconds: () => number;
|
|
80
|
+
getFps: () => number;
|
|
81
|
+
getSlowNumberOfFrames: () => number;
|
|
50
82
|
};
|
|
51
83
|
};
|
|
52
84
|
export type ParserState = ReturnType<typeof makeParserState>;
|
|
53
|
-
export {};
|
|
@@ -1,154 +1,33 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.makeParserState = void 0;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
if (!trackId) {
|
|
13
|
-
throw new Error('Expected track id');
|
|
14
|
-
}
|
|
15
|
-
if (trackEntries[trackId]) {
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
const codec = (0, traversal_1.getTrackCodec)(trackEntry);
|
|
19
|
-
if (!codec) {
|
|
20
|
-
throw new Error('Expected codec');
|
|
21
|
-
}
|
|
22
|
-
const trackTimescale = (0, traversal_1.getTrackTimestampScale)(trackEntry);
|
|
23
|
-
trackEntries[trackId] = {
|
|
24
|
-
codec: codec.value,
|
|
25
|
-
trackTimescale: (_a = trackTimescale === null || trackTimescale === void 0 ? void 0 : trackTimescale.value) !== null && _a !== void 0 ? _a : null,
|
|
26
|
-
};
|
|
27
|
-
};
|
|
28
|
-
const videoSampleCallbacks = {};
|
|
29
|
-
const audioSampleCallbacks = {};
|
|
30
|
-
const queuedAudioSamples = {};
|
|
31
|
-
const queuedVideoSamples = {};
|
|
32
|
-
let timescale = null;
|
|
4
|
+
const emitted_fields_1 = require("./emitted-fields");
|
|
5
|
+
const keyframes_1 = require("./keyframes");
|
|
6
|
+
const riff_1 = require("./riff");
|
|
7
|
+
const sample_callbacks_1 = require("./sample-callbacks");
|
|
8
|
+
const slow_duration_fps_1 = require("./slow-duration-fps");
|
|
9
|
+
const structure_1 = require("./structure");
|
|
10
|
+
const webm_1 = require("./webm");
|
|
11
|
+
const makeParserState = ({ hasAudioTrackHandlers, hasVideoTrackHandlers, signal, getIterator, fields, nullifySamples, onAudioTrack, onVideoTrack, supportsContentRange, }) => {
|
|
33
12
|
let skippedBytes = 0;
|
|
34
|
-
const getTimescale = () => {
|
|
35
|
-
// https://www.matroska.org/technical/notes.html
|
|
36
|
-
// When using the default value of TimestampScale of “1,000,000”, one Segment Tick represents one millisecond.
|
|
37
|
-
if (timescale === null) {
|
|
38
|
-
return 1000000;
|
|
39
|
-
}
|
|
40
|
-
return timescale;
|
|
41
|
-
};
|
|
42
13
|
const increaseSkippedBytes = (bytes) => {
|
|
43
14
|
skippedBytes += bytes;
|
|
44
15
|
};
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
const
|
|
49
|
-
const setTimestampOffset = (byteOffset, timestamp) => {
|
|
50
|
-
timestampMap.set(byteOffset, timestamp);
|
|
51
|
-
};
|
|
52
|
-
const getTimestampOffsetForByteOffset = (byteOffset) => {
|
|
53
|
-
const entries = Array.from(timestampMap.entries());
|
|
54
|
-
const sortedByByteOffset = entries
|
|
55
|
-
.sort((a, b) => {
|
|
56
|
-
return a[0] - b[0];
|
|
57
|
-
})
|
|
58
|
-
.reverse();
|
|
59
|
-
for (const [offset, timestamp] of sortedByByteOffset) {
|
|
60
|
-
if (offset >= byteOffset) {
|
|
61
|
-
continue;
|
|
62
|
-
}
|
|
63
|
-
return timestamp;
|
|
64
|
-
}
|
|
65
|
-
return timestampMap.get(byteOffset);
|
|
66
|
-
};
|
|
67
|
-
const samplesForTrack = {};
|
|
68
|
-
const profileCallbacks = [];
|
|
69
|
-
const registerOnAvcProfileCallback = (callback) => {
|
|
70
|
-
profileCallbacks.push(callback);
|
|
71
|
-
};
|
|
72
|
-
let avcProfile = null;
|
|
73
|
-
const onProfile = async (profile) => {
|
|
74
|
-
avcProfile = profile;
|
|
75
|
-
for (const callback of profileCallbacks) {
|
|
76
|
-
await callback(profile);
|
|
77
|
-
}
|
|
78
|
-
profileCallbacks.length = 0;
|
|
79
|
-
};
|
|
80
|
-
const canSkipTracksState = (0, can_skip_tracks_1.makeCanSkipTracksState)({
|
|
81
|
-
hasAudioTrackHandlers,
|
|
82
|
-
fields,
|
|
83
|
-
hasVideoTrackHandlers,
|
|
84
|
-
});
|
|
85
|
-
const tracksState = (0, has_tracks_section_1.makeTracksSectionState)(canSkipTracksState);
|
|
16
|
+
const structure = (0, structure_1.structureState)();
|
|
17
|
+
const keyframes = (0, keyframes_1.keyframesState)();
|
|
18
|
+
const emittedFields = (0, emitted_fields_1.emittedState)();
|
|
19
|
+
const slowDurationAndFps = (0, slow_duration_fps_1.slowDurationAndFpsState)();
|
|
86
20
|
return {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
videoSampleCallbacks[id] = callback;
|
|
98
|
-
for (const queued of (_a = queuedVideoSamples[id]) !== null && _a !== void 0 ? _a : []) {
|
|
99
|
-
await callback(queued);
|
|
100
|
-
}
|
|
101
|
-
queuedVideoSamples[id] = [];
|
|
102
|
-
},
|
|
103
|
-
setTimestampOffset,
|
|
104
|
-
getTimestampOffsetForByteOffset,
|
|
105
|
-
registerAudioSampleCallback: async (id, callback) => {
|
|
106
|
-
var _a;
|
|
107
|
-
if (callback === null) {
|
|
108
|
-
delete audioSampleCallbacks[id];
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
audioSampleCallbacks[id] = callback;
|
|
112
|
-
for (const queued of (_a = queuedAudioSamples[id]) !== null && _a !== void 0 ? _a : []) {
|
|
113
|
-
await callback(queued);
|
|
114
|
-
}
|
|
115
|
-
queuedAudioSamples[id] = [];
|
|
116
|
-
},
|
|
117
|
-
onAudioSample: async (trackId, audioSample) => {
|
|
118
|
-
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
|
|
119
|
-
throw new Error('Aborted');
|
|
120
|
-
}
|
|
121
|
-
if (typeof samplesForTrack[trackId] === 'undefined') {
|
|
122
|
-
samplesForTrack[trackId] = 0;
|
|
123
|
-
}
|
|
124
|
-
samplesForTrack[trackId]++;
|
|
125
|
-
const callback = audioSampleCallbacks[trackId];
|
|
126
|
-
if (callback) {
|
|
127
|
-
await callback(audioSample);
|
|
128
|
-
}
|
|
129
|
-
},
|
|
130
|
-
onVideoSample: async (trackId, videoSample) => {
|
|
131
|
-
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
|
|
132
|
-
throw new Error('Aborted');
|
|
133
|
-
}
|
|
134
|
-
if (typeof samplesForTrack[trackId] === 'undefined') {
|
|
135
|
-
samplesForTrack[trackId] = 0;
|
|
136
|
-
}
|
|
137
|
-
samplesForTrack[trackId]++;
|
|
138
|
-
const callback = videoSampleCallbacks[trackId];
|
|
139
|
-
if (callback) {
|
|
140
|
-
await callback(videoSample);
|
|
141
|
-
}
|
|
142
|
-
},
|
|
143
|
-
getTimescale,
|
|
144
|
-
setTimescale,
|
|
145
|
-
getSamplesForTrack: (trackId) => {
|
|
146
|
-
var _a;
|
|
147
|
-
return (_a = samplesForTrack[trackId]) !== null && _a !== void 0 ? _a : 0;
|
|
148
|
-
},
|
|
149
|
-
getAvcProfile: () => {
|
|
150
|
-
return avcProfile;
|
|
151
|
-
},
|
|
21
|
+
riff: (0, riff_1.riffSpecificState)(),
|
|
22
|
+
callbacks: (0, sample_callbacks_1.sampleCallback)({
|
|
23
|
+
signal,
|
|
24
|
+
hasAudioTrackHandlers,
|
|
25
|
+
hasVideoTrackHandlers,
|
|
26
|
+
fields,
|
|
27
|
+
keyframes,
|
|
28
|
+
emittedFields,
|
|
29
|
+
slowDurationAndFpsState: slowDurationAndFps,
|
|
30
|
+
}),
|
|
152
31
|
getInternalStats: () => {
|
|
153
32
|
var _a, _b;
|
|
154
33
|
return ({
|
|
@@ -158,13 +37,16 @@ const makeParserState = ({ hasAudioTrackHandlers, hasVideoTrackHandlers, signal,
|
|
|
158
37
|
},
|
|
159
38
|
getSkipBytes: () => skippedBytes,
|
|
160
39
|
increaseSkippedBytes,
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
40
|
+
keyframes,
|
|
41
|
+
structure,
|
|
42
|
+
nullifySamples,
|
|
43
|
+
onAudioTrack,
|
|
44
|
+
onVideoTrack,
|
|
45
|
+
supportsContentRange,
|
|
46
|
+
webm: (0, webm_1.webmState)(),
|
|
47
|
+
emittedFields,
|
|
48
|
+
fields,
|
|
49
|
+
slowDurationAndFps,
|
|
168
50
|
};
|
|
169
51
|
};
|
|
170
52
|
exports.makeParserState = makeParserState;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SpsAndPps } from './parser-state';
|
|
2
|
+
type AvcProfileInfoCallback = (profile: SpsAndPps) => Promise<void>;
|
|
3
|
+
export declare const riffSpecificState: () => {
|
|
4
|
+
getAvcProfile: () => SpsAndPps | null;
|
|
5
|
+
onProfile: (profile: SpsAndPps) => Promise<void>;
|
|
6
|
+
registerOnAvcProfileCallback: (callback: AvcProfileInfoCallback) => void;
|
|
7
|
+
getNextTrackIndex: () => number;
|
|
8
|
+
incrementNextTrackIndex: () => void;
|
|
9
|
+
};
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.riffSpecificState = void 0;
|
|
4
|
+
const riffSpecificState = () => {
|
|
5
|
+
let avcProfile = null;
|
|
6
|
+
let nextTrackIndex = 0;
|
|
7
|
+
const profileCallbacks = [];
|
|
8
|
+
const registerOnAvcProfileCallback = (callback) => {
|
|
9
|
+
profileCallbacks.push(callback);
|
|
10
|
+
};
|
|
11
|
+
const onProfile = async (profile) => {
|
|
12
|
+
avcProfile = profile;
|
|
13
|
+
for (const callback of profileCallbacks) {
|
|
14
|
+
await callback(profile);
|
|
15
|
+
}
|
|
16
|
+
profileCallbacks.length = 0;
|
|
17
|
+
};
|
|
18
|
+
return {
|
|
19
|
+
getAvcProfile: () => {
|
|
20
|
+
return avcProfile;
|
|
21
|
+
},
|
|
22
|
+
onProfile,
|
|
23
|
+
registerOnAvcProfileCallback,
|
|
24
|
+
getNextTrackIndex: () => {
|
|
25
|
+
return nextTrackIndex;
|
|
26
|
+
},
|
|
27
|
+
incrementNextTrackIndex: () => {
|
|
28
|
+
nextTrackIndex++;
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
exports.riffSpecificState = riffSpecificState;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { AllOptions, Options, ParseMediaFields } from '../options';
|
|
2
|
+
import type { AudioOrVideoSample, OnAudioSample, OnVideoSample } from '../webcodec-sample-types';
|
|
3
|
+
import { type KeyframesState } from './keyframes';
|
|
4
|
+
import type { SlowDurationAndFpsState } from './slow-duration-fps';
|
|
5
|
+
export declare const sampleCallback: ({ signal, hasAudioTrackHandlers, hasVideoTrackHandlers, fields, keyframes, emittedFields, slowDurationAndFpsState, }: {
|
|
6
|
+
signal: AbortSignal | undefined;
|
|
7
|
+
hasAudioTrackHandlers: boolean;
|
|
8
|
+
hasVideoTrackHandlers: boolean;
|
|
9
|
+
fields: Options<ParseMediaFields>;
|
|
10
|
+
keyframes: KeyframesState;
|
|
11
|
+
emittedFields: AllOptions<ParseMediaFields>;
|
|
12
|
+
slowDurationAndFpsState: SlowDurationAndFpsState;
|
|
13
|
+
}) => {
|
|
14
|
+
registerVideoSampleCallback: (id: number, callback: OnVideoSample | null) => Promise<void>;
|
|
15
|
+
onAudioSample: (trackId: number, audioSample: AudioOrVideoSample) => Promise<void>;
|
|
16
|
+
getSamplesForTrack: (trackId: number) => number;
|
|
17
|
+
onVideoSample: (trackId: number, videoSample: AudioOrVideoSample) => Promise<void>;
|
|
18
|
+
canSkipTracksState: {
|
|
19
|
+
canSkipTracks: () => boolean;
|
|
20
|
+
};
|
|
21
|
+
registerAudioSampleCallback: (id: number, callback: OnAudioSample | null) => Promise<void>;
|
|
22
|
+
tracks: {
|
|
23
|
+
hasAllTracks: () => boolean;
|
|
24
|
+
setIsDone: () => void;
|
|
25
|
+
addTrack: (track: import("..").Track) => void;
|
|
26
|
+
getTracks: () => import("..").Track[];
|
|
27
|
+
ensureHasTracksAtEnd: () => void;
|
|
28
|
+
};
|
|
29
|
+
audioSampleCallbacks: Record<number, OnAudioSample>;
|
|
30
|
+
videoSampleCallbacks: Record<number, OnVideoSample>;
|
|
31
|
+
};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sampleCallback = void 0;
|
|
4
|
+
const need_samples_for_fields_1 = require("../may-skip-video-data/need-samples-for-fields");
|
|
5
|
+
const can_skip_tracks_1 = require("./can-skip-tracks");
|
|
6
|
+
const has_tracks_section_1 = require("./has-tracks-section");
|
|
7
|
+
const sampleCallback = ({ signal, hasAudioTrackHandlers, hasVideoTrackHandlers, fields, keyframes, emittedFields, slowDurationAndFpsState, }) => {
|
|
8
|
+
const videoSampleCallbacks = {};
|
|
9
|
+
const audioSampleCallbacks = {};
|
|
10
|
+
const queuedAudioSamples = {};
|
|
11
|
+
const queuedVideoSamples = {};
|
|
12
|
+
const canSkipTracksState = (0, can_skip_tracks_1.makeCanSkipTracksState)({
|
|
13
|
+
hasAudioTrackHandlers,
|
|
14
|
+
fields,
|
|
15
|
+
hasVideoTrackHandlers,
|
|
16
|
+
});
|
|
17
|
+
const tracksState = (0, has_tracks_section_1.makeTracksSectionState)(canSkipTracksState);
|
|
18
|
+
const samplesForTrack = {};
|
|
19
|
+
return {
|
|
20
|
+
registerVideoSampleCallback: async (id, callback) => {
|
|
21
|
+
var _a;
|
|
22
|
+
if (callback === null) {
|
|
23
|
+
delete videoSampleCallbacks[id];
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
videoSampleCallbacks[id] = callback;
|
|
27
|
+
for (const queued of (_a = queuedVideoSamples[id]) !== null && _a !== void 0 ? _a : []) {
|
|
28
|
+
await callback(queued);
|
|
29
|
+
}
|
|
30
|
+
queuedVideoSamples[id] = [];
|
|
31
|
+
},
|
|
32
|
+
onAudioSample: async (trackId, audioSample) => {
|
|
33
|
+
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
|
|
34
|
+
throw new Error('Aborted');
|
|
35
|
+
}
|
|
36
|
+
if (typeof samplesForTrack[trackId] === 'undefined') {
|
|
37
|
+
samplesForTrack[trackId] = 0;
|
|
38
|
+
}
|
|
39
|
+
samplesForTrack[trackId]++;
|
|
40
|
+
const callback = audioSampleCallbacks[trackId];
|
|
41
|
+
if (callback) {
|
|
42
|
+
await callback(audioSample);
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
getSamplesForTrack: (trackId) => {
|
|
46
|
+
var _a;
|
|
47
|
+
return (_a = samplesForTrack[trackId]) !== null && _a !== void 0 ? _a : 0;
|
|
48
|
+
},
|
|
49
|
+
onVideoSample: async (trackId, videoSample) => {
|
|
50
|
+
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
|
|
51
|
+
throw new Error('Aborted');
|
|
52
|
+
}
|
|
53
|
+
if (typeof samplesForTrack[trackId] === 'undefined') {
|
|
54
|
+
samplesForTrack[trackId] = 0;
|
|
55
|
+
}
|
|
56
|
+
samplesForTrack[trackId]++;
|
|
57
|
+
const callback = videoSampleCallbacks[trackId];
|
|
58
|
+
// If we emit samples with data 0, Chrome will fail
|
|
59
|
+
if (callback && videoSample.data.length > 0) {
|
|
60
|
+
await callback(videoSample);
|
|
61
|
+
}
|
|
62
|
+
if ((0, need_samples_for_fields_1.needsToIterateOverSamples)({
|
|
63
|
+
fields,
|
|
64
|
+
emittedFields,
|
|
65
|
+
})) {
|
|
66
|
+
if (fields.slowKeyframes && videoSample.type === 'key') {
|
|
67
|
+
keyframes.addKeyframe({
|
|
68
|
+
trackId,
|
|
69
|
+
decodingTimeInSeconds: videoSample.dts / videoSample.timescale,
|
|
70
|
+
positionInBytes: videoSample.offset,
|
|
71
|
+
presentationTimeInSeconds: videoSample.cts / videoSample.timescale,
|
|
72
|
+
sizeInBytes: videoSample.data.length,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
slowDurationAndFpsState.addSample(videoSample);
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
canSkipTracksState,
|
|
79
|
+
registerAudioSampleCallback: async (id, callback) => {
|
|
80
|
+
var _a;
|
|
81
|
+
if (callback === null) {
|
|
82
|
+
delete audioSampleCallbacks[id];
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
audioSampleCallbacks[id] = callback;
|
|
86
|
+
for (const queued of (_a = queuedAudioSamples[id]) !== null && _a !== void 0 ? _a : []) {
|
|
87
|
+
await callback(queued);
|
|
88
|
+
}
|
|
89
|
+
queuedAudioSamples[id] = [];
|
|
90
|
+
},
|
|
91
|
+
tracks: tracksState,
|
|
92
|
+
audioSampleCallbacks,
|
|
93
|
+
videoSampleCallbacks,
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
exports.sampleCallback = sampleCallback;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AudioOrVideoSample } from '../webcodec-sample-types';
|
|
2
|
+
export declare const slowDurationAndFpsState: () => {
|
|
3
|
+
addSample: (videoSample: AudioOrVideoSample) => void;
|
|
4
|
+
getSlowDurationInSeconds: () => number;
|
|
5
|
+
getFps: () => number;
|
|
6
|
+
getSlowNumberOfFrames: () => number;
|
|
7
|
+
};
|
|
8
|
+
export type SlowDurationAndFpsState = ReturnType<typeof slowDurationAndFpsState>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.slowDurationAndFpsState = void 0;
|
|
4
|
+
const slowDurationAndFpsState = () => {
|
|
5
|
+
let smallestSample;
|
|
6
|
+
let largestSample;
|
|
7
|
+
let samples = 0;
|
|
8
|
+
const getSlowDurationInSeconds = () => {
|
|
9
|
+
if (smallestSample !== undefined && largestSample !== undefined) {
|
|
10
|
+
const startingTimestampDifference = largestSample - smallestSample;
|
|
11
|
+
const timeBetweenSamples = startingTimestampDifference / (samples - 1);
|
|
12
|
+
return timeBetweenSamples * samples;
|
|
13
|
+
}
|
|
14
|
+
throw new Error('No samples');
|
|
15
|
+
};
|
|
16
|
+
return {
|
|
17
|
+
addSample: (videoSample) => {
|
|
18
|
+
samples++;
|
|
19
|
+
const presentationTimeInSeconds = videoSample.cts / videoSample.timescale;
|
|
20
|
+
if (largestSample === undefined ||
|
|
21
|
+
presentationTimeInSeconds > largestSample) {
|
|
22
|
+
largestSample = presentationTimeInSeconds;
|
|
23
|
+
}
|
|
24
|
+
if (smallestSample === undefined ||
|
|
25
|
+
presentationTimeInSeconds < smallestSample) {
|
|
26
|
+
smallestSample = presentationTimeInSeconds;
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
getSlowDurationInSeconds,
|
|
30
|
+
getFps: () => {
|
|
31
|
+
return samples / getSlowDurationInSeconds();
|
|
32
|
+
},
|
|
33
|
+
getSlowNumberOfFrames: () => samples,
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
exports.slowDurationAndFpsState = slowDurationAndFpsState;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Structure } from '../parse-result';
|
|
2
|
+
export declare const structureState: () => {
|
|
3
|
+
getStructureOrNull: () => Structure | null;
|
|
4
|
+
getStructure: () => Structure;
|
|
5
|
+
setStructure: (value: Structure) => void;
|
|
6
|
+
};
|
|
7
|
+
export type StructureState = ReturnType<typeof structureState>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.structureState = void 0;
|
|
4
|
+
const structureState = () => {
|
|
5
|
+
let structure = null;
|
|
6
|
+
return {
|
|
7
|
+
getStructureOrNull: () => {
|
|
8
|
+
return structure;
|
|
9
|
+
},
|
|
10
|
+
getStructure: () => {
|
|
11
|
+
if (structure === null) {
|
|
12
|
+
throw new Error('Expected structure');
|
|
13
|
+
}
|
|
14
|
+
return structure;
|
|
15
|
+
},
|
|
16
|
+
setStructure: (value) => {
|
|
17
|
+
structure = value;
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
exports.structureState = structureState;
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { OnTrackEntrySegment } from '../boxes/webm/segments';
|
|
2
|
+
import type { TrackInfo } from '../boxes/webm/segments/track-entry';
|
|
3
|
+
export declare const webmState: () => {
|
|
4
|
+
onTrackEntrySegment: OnTrackEntrySegment;
|
|
5
|
+
getTrackInfoByNumber: (id: number) => TrackInfo;
|
|
6
|
+
setTimestampOffset: (byteOffset: number, timestamp: number) => void;
|
|
7
|
+
getTimestampOffsetForByteOffset: (byteOffset: number) => number | undefined;
|
|
8
|
+
timescale: null;
|
|
9
|
+
getTimescale: () => number;
|
|
10
|
+
setTimescale: (newTimescale: number) => void;
|
|
11
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.webmState = void 0;
|
|
4
|
+
const traversal_1 = require("../boxes/webm/traversal");
|
|
5
|
+
const webmState = () => {
|
|
6
|
+
const trackEntries = {};
|
|
7
|
+
const onTrackEntrySegment = (trackEntry) => {
|
|
8
|
+
var _a;
|
|
9
|
+
const trackId = (0, traversal_1.getTrackId)(trackEntry);
|
|
10
|
+
if (!trackId) {
|
|
11
|
+
throw new Error('Expected track id');
|
|
12
|
+
}
|
|
13
|
+
if (trackEntries[trackId]) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const codec = (0, traversal_1.getTrackCodec)(trackEntry);
|
|
17
|
+
if (!codec) {
|
|
18
|
+
throw new Error('Expected codec');
|
|
19
|
+
}
|
|
20
|
+
const trackTimescale = (0, traversal_1.getTrackTimestampScale)(trackEntry);
|
|
21
|
+
trackEntries[trackId] = {
|
|
22
|
+
codec: codec.value,
|
|
23
|
+
trackTimescale: (_a = trackTimescale === null || trackTimescale === void 0 ? void 0 : trackTimescale.value) !== null && _a !== void 0 ? _a : null,
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
const timestampMap = new Map();
|
|
27
|
+
const getTimestampOffsetForByteOffset = (byteOffset) => {
|
|
28
|
+
const entries = Array.from(timestampMap.entries());
|
|
29
|
+
const sortedByByteOffset = entries
|
|
30
|
+
.sort((a, b) => {
|
|
31
|
+
return a[0] - b[0];
|
|
32
|
+
})
|
|
33
|
+
.reverse();
|
|
34
|
+
for (const [offset, timestamp] of sortedByByteOffset) {
|
|
35
|
+
if (offset >= byteOffset) {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
return timestamp;
|
|
39
|
+
}
|
|
40
|
+
return timestampMap.get(byteOffset);
|
|
41
|
+
};
|
|
42
|
+
const setTimestampOffset = (byteOffset, timestamp) => {
|
|
43
|
+
timestampMap.set(byteOffset, timestamp);
|
|
44
|
+
};
|
|
45
|
+
let timescale = null;
|
|
46
|
+
const setTimescale = (newTimescale) => {
|
|
47
|
+
timescale = newTimescale;
|
|
48
|
+
};
|
|
49
|
+
const getTimescale = () => {
|
|
50
|
+
// https://www.matroska.org/technical/notes.html
|
|
51
|
+
// When using the default value of TimestampScale of “1,000,000”, one Segment Tick represents one millisecond.
|
|
52
|
+
if (timescale === null) {
|
|
53
|
+
return 1000000;
|
|
54
|
+
}
|
|
55
|
+
return timescale;
|
|
56
|
+
};
|
|
57
|
+
return {
|
|
58
|
+
onTrackEntrySegment,
|
|
59
|
+
getTrackInfoByNumber: (id) => trackEntries[id],
|
|
60
|
+
setTimestampOffset,
|
|
61
|
+
getTimestampOffsetForByteOffset,
|
|
62
|
+
timescale,
|
|
63
|
+
getTimescale,
|
|
64
|
+
setTimescale,
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
exports.webmState = webmState;
|
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const VERSION = "4.0.
|
|
1
|
+
export declare const VERSION = "4.0.242";
|
package/dist/version.js
CHANGED