forked from forks/ffprobe-wasm-npm
Bundle browser script, add package exports, add sourcemaps
This commit is contained in:
@@ -1,34 +1,59 @@
|
||||
import type { Chapter, ChapterTag, FileInfo, Frame, FramesInfo, Stream } from "./ffprobe-wasm.mjs";
|
||||
import type {
|
||||
Chapter,
|
||||
ChapterTag,
|
||||
FileInfo,
|
||||
Frame,
|
||||
FramesInfo,
|
||||
Stream,
|
||||
} from "./ffprobe-wasm.mjs";
|
||||
import type { FFprobeWorker as AbstractFFprobeWorker } from "./ffprobe-worker.js";
|
||||
import BrowserWorker from "./worker-browser.mjs?worker&inline";
|
||||
import type {
|
||||
IncomingMessage,
|
||||
IncomingData,
|
||||
OutgoingMessage,
|
||||
} from "./worker.mjs";
|
||||
|
||||
export class FFprobeWorker {
|
||||
export class FFprobeWorker implements AbstractFFprobeWorker {
|
||||
readonly #worker: Worker;
|
||||
|
||||
constructor() {
|
||||
this.#worker = new Worker("./worker-browser.mjs");
|
||||
this.#worker = new BrowserWorker();
|
||||
}
|
||||
|
||||
async getFileInfo(file: File): Promise<FileInfo> {
|
||||
return this.#postMessage({ type: "getFileInfo", payload: [file.name, { files: [file] }] });
|
||||
this.#validateFile(file);
|
||||
return this.#postMessage({
|
||||
type: "getFileInfo",
|
||||
payload: [file.name, { files: [file] }],
|
||||
});
|
||||
}
|
||||
|
||||
async getFrames(file: File, offset: number): Promise<FramesInfo> {
|
||||
return this.#postMessage({ type: "getFrames", payload: [file.name, { files: [file] }, offset] });
|
||||
this.#validateFile(file);
|
||||
return this.#postMessage({
|
||||
type: "getFrames",
|
||||
payload: [file.name, { files: [file] }, offset],
|
||||
});
|
||||
}
|
||||
|
||||
terminate(): void {
|
||||
this.#worker.terminate();
|
||||
}
|
||||
|
||||
#validateFile(file: File | string): asserts file is File {
|
||||
if (typeof file === "string") {
|
||||
throw new Error(
|
||||
"String only supported in Node.js, you must provide a File"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#postMessage(data: IncomingData): Promise<any> {
|
||||
const channel = new MessageChannel();
|
||||
const message: IncomingMessage = {
|
||||
...data,
|
||||
port: channel.port2
|
||||
port: channel.port2,
|
||||
};
|
||||
|
||||
this.#worker.postMessage(message, [channel.port2]);
|
||||
@@ -41,7 +66,7 @@ export class FFprobeWorker {
|
||||
} else {
|
||||
reject(new Error(data.message));
|
||||
}
|
||||
}
|
||||
};
|
||||
});
|
||||
}
|
||||
}
|
||||
1
src/declarations/vite.d.ts
vendored
Normal file
1
src/declarations/vite.d.ts
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/// <reference types="vite/client" />
|
||||
93
src/ffprobe-wasm-shared.d.ts
vendored
93
src/ffprobe-wasm-shared.d.ts
vendored
@@ -70,19 +70,22 @@ export interface AnalyzePathReturn {
|
||||
}
|
||||
|
||||
export interface FileInfo {
|
||||
bit_rate: number
|
||||
chapters: Chapter[]
|
||||
duration: number
|
||||
flags: number
|
||||
name: string
|
||||
nb_chapters: number
|
||||
nb_streams: number
|
||||
streams: Stream[]
|
||||
url: string
|
||||
bit_rate: number;
|
||||
chapters: Chapter[];
|
||||
/**
|
||||
* Duration in microseconds
|
||||
*/
|
||||
duration: number;
|
||||
flags: number;
|
||||
name: string;
|
||||
nb_chapters: number;
|
||||
nb_streams: number;
|
||||
streams: Stream[];
|
||||
url: string;
|
||||
}
|
||||
|
||||
export interface Collection<T> {
|
||||
count: { value: number }
|
||||
count: { value: number };
|
||||
ptr: number;
|
||||
ptrType: any;
|
||||
get(index: number): T;
|
||||
@@ -90,56 +93,56 @@ export interface Collection<T> {
|
||||
}
|
||||
|
||||
export type Raw<T> = {
|
||||
[K in keyof T]: T[K] extends Array<infer U> ? Collection<Raw<U>> : T[K]
|
||||
}
|
||||
[K in keyof T]: T[K] extends Array<infer U> ? Collection<Raw<U>> : T[K];
|
||||
};
|
||||
|
||||
export interface Chapter {
|
||||
end: number
|
||||
id: number
|
||||
start: number
|
||||
tags: ChapterTag[]
|
||||
end: number;
|
||||
id: number;
|
||||
start: number;
|
||||
tags: ChapterTag[];
|
||||
/**
|
||||
* @example "1/1000"
|
||||
*/
|
||||
time_base: string
|
||||
time_base: string;
|
||||
}
|
||||
|
||||
export interface ChapterTag {
|
||||
key: string
|
||||
value: string
|
||||
key: string;
|
||||
value: string;
|
||||
}
|
||||
|
||||
export interface Stream {
|
||||
bit_rate: number
|
||||
channels: number
|
||||
codec_name: string
|
||||
codec_type: number
|
||||
duration: number
|
||||
format: string
|
||||
frame_size: number
|
||||
height: number
|
||||
id: number
|
||||
level: number
|
||||
profile: string
|
||||
sample_rate: number
|
||||
start_time: number
|
||||
width: number
|
||||
bit_rate: number;
|
||||
channels: number;
|
||||
codec_name: string;
|
||||
codec_type: number;
|
||||
duration: number;
|
||||
format: string;
|
||||
frame_size: number;
|
||||
height: number;
|
||||
id: number;
|
||||
level: number;
|
||||
profile: string;
|
||||
sample_rate: number;
|
||||
start_time: number;
|
||||
width: number;
|
||||
}
|
||||
|
||||
export interface FramesInfo {
|
||||
avg_frame_rate: number
|
||||
duration: number
|
||||
frames: Frame[]
|
||||
gop_size: number
|
||||
nb_frames: number
|
||||
time_base: number
|
||||
avg_frame_rate: number;
|
||||
duration: number;
|
||||
frames: Frame[];
|
||||
gop_size: number;
|
||||
nb_frames: number;
|
||||
time_base: number;
|
||||
}
|
||||
|
||||
export interface Frame {
|
||||
dts: number
|
||||
frame_number: number
|
||||
pict_type: number
|
||||
pkt_size: number
|
||||
pos: number
|
||||
pts: number
|
||||
dts: number;
|
||||
frame_number: number;
|
||||
pict_type: number;
|
||||
pkt_size: number;
|
||||
pos: number;
|
||||
pts: number;
|
||||
}
|
||||
|
||||
18
src/ffprobe-worker.d.ts
vendored
Normal file
18
src/ffprobe-worker.d.ts
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
import type {
|
||||
Chapter,
|
||||
ChapterTag,
|
||||
FileInfo,
|
||||
Frame,
|
||||
FramesInfo,
|
||||
Stream,
|
||||
} from "./ffprobe-wasm-shared";
|
||||
|
||||
export declare class FFprobeWorker {
|
||||
getFileInfo(file: File | string): Promise<FileInfo>;
|
||||
|
||||
getFrames(file: File | string, offset: number): Promise<FramesInfo>;
|
||||
|
||||
terminate(): void;
|
||||
}
|
||||
|
||||
export { Chapter, ChapterTag, FileInfo, Frame, FramesInfo, Stream };
|
||||
36
src/node.mts
36
src/node.mts
@@ -1,14 +1,22 @@
|
||||
import { basename, dirname } from "path";
|
||||
import { fileURLToPath } from 'url';
|
||||
import { fileURLToPath } from "url";
|
||||
import { MessageChannel, Worker } from "worker_threads";
|
||||
import type { Chapter, ChapterTag, FileInfo, Frame, FramesInfo, Stream } from "./ffprobe-wasm.mjs";
|
||||
import type {
|
||||
Chapter,
|
||||
ChapterTag,
|
||||
FileInfo,
|
||||
Frame,
|
||||
FramesInfo,
|
||||
Stream,
|
||||
} from "./ffprobe-wasm.js";
|
||||
import type { FFprobeWorker as AbstractFFprobeWorker } from "./ffprobe-worker.js";
|
||||
import type {
|
||||
IncomingMessage,
|
||||
IncomingData,
|
||||
OutgoingMessage,
|
||||
} from "./worker.mjs";
|
||||
|
||||
export class FFprobeWorker {
|
||||
export class FFprobeWorker implements AbstractFFprobeWorker {
|
||||
readonly #worker: Worker;
|
||||
|
||||
constructor() {
|
||||
@@ -17,22 +25,38 @@ export class FFprobeWorker {
|
||||
}
|
||||
|
||||
async getFileInfo(filePath: string): Promise<FileInfo> {
|
||||
return this.#postMessage({ type: "getFileInfo", payload: [basename(filePath), { root: dirname(filePath) }] });
|
||||
this.#validateFile(filePath);
|
||||
return this.#postMessage({
|
||||
type: "getFileInfo",
|
||||
payload: [basename(filePath), { root: dirname(filePath) }],
|
||||
});
|
||||
}
|
||||
|
||||
async getFrames(filePath: string, offset: number): Promise<FramesInfo> {
|
||||
return this.#postMessage({ type: "getFrames", payload: [basename(filePath), { root: dirname(filePath) }, offset] });
|
||||
this.#validateFile(filePath);
|
||||
return this.#postMessage({
|
||||
type: "getFrames",
|
||||
payload: [basename(filePath), { root: dirname(filePath) }, offset],
|
||||
});
|
||||
}
|
||||
|
||||
terminate(): void {
|
||||
this.#worker.terminate();
|
||||
}
|
||||
|
||||
#validateFile(filePath: string | File): asserts filePath is string {
|
||||
if (typeof filePath === "object") {
|
||||
throw new Error(
|
||||
"File object only supported in Browser, you must provide a string (path)"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#postMessage(data: IncomingData): Promise<any> {
|
||||
const channel = new MessageChannel();
|
||||
const message: IncomingMessage = {
|
||||
...data,
|
||||
port: channel.port2
|
||||
port: channel.port2,
|
||||
};
|
||||
|
||||
this.#worker.postMessage(message, [channel.port2]);
|
||||
|
||||
@@ -1,11 +1,6 @@
|
||||
import loadFFprobe from "./ffprobe-wasm.mjs";
|
||||
import { createListener, IncomingMessage } from "./worker.mjs";
|
||||
|
||||
const listener = createListener(
|
||||
loadFFprobe({
|
||||
locateFile: (path) => `${location.origin}/node_modules/ffprobe-wasm/${path}`
|
||||
}),
|
||||
"WORKERFS",
|
||||
);
|
||||
const listener = createListener(loadFFprobe(), "WORKERFS");
|
||||
|
||||
self.onmessage = (event: MessageEvent<IncomingMessage>) => listener(event.data);
|
||||
|
||||
Reference in New Issue
Block a user