extendable-media-recorder-wav-encoder-worker
Version:
The worker which is used by the extendable-media-recorder-wav-encoder package.
55 lines (54 loc) • 2.92 kB
JavaScript
import { createWorker } from "worker-factory";
import { createCreateOrUpdateRecording } from "./factories/create-or-update-recording";
import { createEncode } from "./factories/encode";
import { computeNumberOfSamples } from "./functions/compute-number-of-samples";
import { encodeHeader } from "./functions/encode-header";
import { shiftChannelDataArrays } from "./functions/shift-channel-data-arrays";
export * from "./interfaces/index";
export * from "./types/index";
const recordings = /* @__PURE__ */ new Map();
const createOrUpdateRecording = createCreateOrUpdateRecording(recordings);
const encode = createEncode(computeNumberOfSamples, encodeHeader);
const encodings = /* @__PURE__ */ new Map();
createWorker(self, {
characterize: () => {
return { result: /^audio\/wav$/ };
},
encode: ({ recordingId, timeslice }) => {
const encoding = encodings.get(recordingId);
if (encoding !== void 0) {
encodings.delete(recordingId);
encoding.reject(new Error("Another request was made to initiate an encoding."));
}
const recording = recordings.get(recordingId);
if (timeslice !== null) {
if (recording === void 0 || computeNumberOfSamples(recording.channelDataArrays[0]) * (1e3 / recording.sampleRate) < timeslice) {
return new Promise((resolve, reject) => {
encodings.set(recordingId, { reject, resolve, timeslice });
});
}
const shiftedChannelDataArrays = shiftChannelDataArrays(recording.channelDataArrays, Math.ceil(timeslice * (recording.sampleRate / 1e3)));
const arrayBuffers = encode(shiftedChannelDataArrays, recording.isComplete ? "initial" : "subsequent", 16, recording.sampleRate);
recording.isComplete = false;
return { result: arrayBuffers, transferables: arrayBuffers };
}
if (recording !== void 0) {
const arrayBuffers = encode(recording.channelDataArrays, recording.isComplete ? "complete" : "subsequent", 16, recording.sampleRate);
recordings.delete(recordingId);
return { result: arrayBuffers, transferables: arrayBuffers };
}
return { result: [], transferables: [] };
},
record: ({ recordingId, sampleRate, typedArrays }) => {
const recording = createOrUpdateRecording(recordingId, sampleRate, typedArrays);
const encoding = encodings.get(recordingId);
if (encoding !== void 0 && computeNumberOfSamples(recording.channelDataArrays[0]) * (1e3 / sampleRate) >= encoding.timeslice) {
const shiftedChannelDataArrays = shiftChannelDataArrays(recording.channelDataArrays, Math.ceil(encoding.timeslice * (sampleRate / 1e3)));
const arrayBuffers = encode(shiftedChannelDataArrays, recording.isComplete ? "initial" : "subsequent", 16, sampleRate);
recording.isComplete = false;
encodings.delete(recordingId);
encoding.resolve({ result: arrayBuffers, transferables: arrayBuffers });
}
return { result: null };
}
});