@remotion/webcodecs 4.0.250 → 4.0.251
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/can-copy-audio-track.d.ts +2 -2
- package/dist/can-copy-video-track.d.ts +2 -2
- package/dist/convert-media.d.ts +4 -2
- package/dist/create/matroska/matroska-trackentry.js +3 -0
- package/dist/create/matroska/matroska-utils.d.ts +1 -1
- package/dist/esm/index.mjs +9 -3
- package/dist/esm/web-fs.mjs +6 -3
- package/dist/on-audio-track-handler.d.ts +2 -2
- package/dist/on-video-track-handler.d.ts +2 -2
- package/dist/select-container-creator.d.ts +1 -1
- package/dist/test/create-matroska.test.js +13 -13
- package/dist/test/remux-serverside.test.js +4 -0
- package/dist/test/stsd.test.js +2 -4
- package/dist/writers/web-fs.js +6 -3
- package/package.json +5 -5
- package/dist/esm/node-writer.mjs +0 -92
- package/dist/test/remux-serverside.d.ts +0 -1
- package/dist/test/remux-serverside.js +0 -12
- package/dist/writers/fs.d.ts +0 -4
- package/dist/writers/fs.js +0 -78
- package/dist/writers/node-writer.d.ts +0 -4
- package/dist/writers/node-writer.js +0 -77
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { MediaParserAudioCodec,
|
|
1
|
+
import type { MediaParserAudioCodec, MediaParserContainer } from '@remotion/media-parser';
|
|
2
2
|
import type { ConvertMediaContainer } from './get-available-containers';
|
|
3
3
|
export declare const canCopyAudioTrack: ({ inputCodec, outputContainer, inputContainer, }: {
|
|
4
4
|
inputCodec: MediaParserAudioCodec;
|
|
5
5
|
outputContainer: ConvertMediaContainer;
|
|
6
|
-
inputContainer:
|
|
6
|
+
inputContainer: MediaParserContainer;
|
|
7
7
|
}) => boolean;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { MediaParserContainer, VideoTrack } from '@remotion/media-parser';
|
|
2
2
|
import type { ConvertMediaContainer } from './get-available-containers';
|
|
3
3
|
import type { ResizeOperation } from './resizing/mode';
|
|
4
4
|
export declare const canCopyVideoTrack: ({ outputContainer, rotationToApply, inputContainer, resizeOperation, inputTrack, }: {
|
|
5
|
-
inputContainer:
|
|
5
|
+
inputContainer: MediaParserContainer;
|
|
6
6
|
inputTrack: VideoTrack;
|
|
7
7
|
rotationToApply: number;
|
|
8
8
|
outputContainer: ConvertMediaContainer;
|
package/dist/convert-media.d.ts
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* Copyright (c) 2025 Remotion AG
|
|
3
3
|
* For licensing, see: https://remotion.dev/docs/webcodecs#license
|
|
4
4
|
*/
|
|
5
|
-
import type { AudioTrack, LogLevel, Options,
|
|
5
|
+
import type { AudioTrack, LogLevel, Options, ParseMediaFields, ParseMediaOptions, VideoTrack } from '@remotion/media-parser';
|
|
6
|
+
import type { ParseMediaCallbacks } from '@remotion/media-parser';
|
|
6
7
|
import type { ConvertMediaAudioCodec } from './get-available-audio-codecs';
|
|
7
8
|
import type { ConvertMediaContainer } from './get-available-containers';
|
|
8
9
|
import type { ConvertMediaVideoCodec } from './get-available-video-codecs';
|
|
@@ -52,4 +53,5 @@ export declare const convertMedia: <F extends Options<ParseMediaFields>>({ src,
|
|
|
52
53
|
rotate?: number;
|
|
53
54
|
resize?: ResizeOperation;
|
|
54
55
|
apiKey?: string | null;
|
|
55
|
-
|
|
56
|
+
fields?: F;
|
|
57
|
+
} & ParseMediaCallbacks) => Promise<ConvertMediaResult>;
|
|
@@ -19,7 +19,7 @@ export type EbmlParsedOrUint8Array<T extends Ebml> = {
|
|
|
19
19
|
value: EbmlValueOrUint8Array<T>;
|
|
20
20
|
minVintWidth: number | null;
|
|
21
21
|
};
|
|
22
|
-
export declare const measureEBMLVarInt: (value: number) => 2 | 1 |
|
|
22
|
+
export declare const measureEBMLVarInt: (value: number) => 2 | 1 | 4 | 3 | 5 | 6;
|
|
23
23
|
export declare const getVariableInt: (value: number, minWidth: number | null) => Uint8Array;
|
|
24
24
|
export declare const makeMatroskaBytes: (fields: PossibleEbmlOrUint8Array) => BytesAndOffset;
|
|
25
25
|
export type PossibleEbmlOrUint8Array = Prettify<{
|
package/dist/esm/index.mjs
CHANGED
|
@@ -97,9 +97,12 @@ var createContent = async ({ filename }) => {
|
|
|
97
97
|
const directoryHandle = await navigator.storage.getDirectory();
|
|
98
98
|
const actualFilename = `__remotion_mediaparser:${filename}`;
|
|
99
99
|
const remove = async () => {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
100
|
+
try {
|
|
101
|
+
await directoryHandle.removeEntry(actualFilename, {
|
|
102
|
+
recursive: true
|
|
103
|
+
});
|
|
104
|
+
} catch {
|
|
105
|
+
}
|
|
103
106
|
};
|
|
104
107
|
await remove();
|
|
105
108
|
const fileHandle = await directoryHandle.getFileHandle(actualFilename, {
|
|
@@ -3746,6 +3749,9 @@ var makeAudioCodecId = (codecId) => {
|
|
|
3746
3749
|
if (codecId === "vorbis") {
|
|
3747
3750
|
return "A_VORBIS";
|
|
3748
3751
|
}
|
|
3752
|
+
if (codecId === "flac") {
|
|
3753
|
+
return "A_FLAC";
|
|
3754
|
+
}
|
|
3749
3755
|
if (codecId === "pcm-u8") {
|
|
3750
3756
|
return "A_PCM/INT/LIT";
|
|
3751
3757
|
}
|
package/dist/esm/web-fs.mjs
CHANGED
|
@@ -21,9 +21,12 @@ var createContent = async ({ filename }) => {
|
|
|
21
21
|
const directoryHandle = await navigator.storage.getDirectory();
|
|
22
22
|
const actualFilename = `__remotion_mediaparser:${filename}`;
|
|
23
23
|
const remove = async () => {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
try {
|
|
25
|
+
await directoryHandle.removeEntry(actualFilename, {
|
|
26
|
+
recursive: true
|
|
27
|
+
});
|
|
28
|
+
} catch {
|
|
29
|
+
}
|
|
27
30
|
};
|
|
28
31
|
await remove();
|
|
29
32
|
const fileHandle = await directoryHandle.getFileHandle(actualFilename, {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AudioTrack, LogLevel,
|
|
1
|
+
import type { AudioTrack, LogLevel, MediaParserContainer } from '@remotion/media-parser';
|
|
2
2
|
import type { ConvertMediaAudioCodec } from './get-available-audio-codecs';
|
|
3
3
|
import type { ConvertMediaContainer } from './get-available-containers';
|
|
4
4
|
export type AudioOperation = {
|
|
@@ -17,6 +17,6 @@ export type ConvertMediaOnAudioTrackHandler = (options: {
|
|
|
17
17
|
defaultAudioCodec: ConvertMediaAudioCodec | null;
|
|
18
18
|
logLevel: LogLevel;
|
|
19
19
|
outputContainer: ConvertMediaContainer;
|
|
20
|
-
inputContainer:
|
|
20
|
+
inputContainer: MediaParserContainer;
|
|
21
21
|
canCopyTrack: boolean;
|
|
22
22
|
}) => AudioOperation | Promise<AudioOperation>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { LogLevel,
|
|
1
|
+
import type { LogLevel, MediaParserContainer, VideoTrack } from '@remotion/media-parser';
|
|
2
2
|
import type { ConvertMediaContainer } from './get-available-containers';
|
|
3
3
|
import type { ConvertMediaVideoCodec } from './get-available-video-codecs';
|
|
4
4
|
import type { ResizeOperation } from './resizing/mode';
|
|
@@ -21,6 +21,6 @@ export type ConvertMediaOnVideoTrackHandler = (options: {
|
|
|
21
21
|
outputContainer: ConvertMediaContainer;
|
|
22
22
|
rotate: number;
|
|
23
23
|
resizeOperation: ResizeOperation | null;
|
|
24
|
-
inputContainer:
|
|
24
|
+
inputContainer: MediaParserContainer;
|
|
25
25
|
canCopyTrack: boolean;
|
|
26
26
|
}) => VideoOperation | Promise<VideoOperation>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import type { ConvertMediaContainer } from './get-available-containers';
|
|
2
|
-
export declare const selectContainerCreator: (container: ConvertMediaContainer) => ({
|
|
2
|
+
export declare const selectContainerCreator: (container: ConvertMediaContainer) => ({ writer, onBytesProgress, onMillisecondsProgress, logLevel, filename, progressTracker, }: import("./create/media-fn").MediaFnGeneratorInput) => Promise<import("./create/media-fn").MediaFn>;
|
|
@@ -3,18 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const media_parser_1 = require("@remotion/media-parser");
|
|
4
4
|
const bun_test_1 = require("bun:test");
|
|
5
5
|
const matroska_utils_1 = require("../create/matroska/matroska-utils");
|
|
6
|
-
const state = media_parser_1.MediaParserInternals.makeParserState({
|
|
7
|
-
hasAudioTrackHandlers: false,
|
|
8
|
-
hasVideoTrackHandlers: false,
|
|
9
|
-
signal: undefined,
|
|
10
|
-
getIterator: () => null,
|
|
11
|
-
fields: {},
|
|
12
|
-
onAudioTrack: null,
|
|
13
|
-
onVideoTrack: null,
|
|
14
|
-
supportsContentRange: true,
|
|
15
|
-
contentLength: null,
|
|
16
|
-
logLevel: 'info',
|
|
17
|
-
});
|
|
18
6
|
(0, bun_test_1.test)('Should make Matroska header that is same as input', async () => {
|
|
19
7
|
const headerOutput = (0, matroska_utils_1.makeMatroskaBytes)({
|
|
20
8
|
type: 'Header',
|
|
@@ -58,7 +46,19 @@ const state = media_parser_1.MediaParserInternals.makeParserState({
|
|
|
58
46
|
],
|
|
59
47
|
});
|
|
60
48
|
const iterator = media_parser_1.MediaParserInternals.getArrayBufferIterator(headerOutput.bytes, headerOutput.bytes.length);
|
|
61
|
-
const
|
|
49
|
+
const state = media_parser_1.MediaParserInternals.makeParserState({
|
|
50
|
+
hasAudioTrackHandlers: false,
|
|
51
|
+
hasVideoTrackHandlers: false,
|
|
52
|
+
signal: undefined,
|
|
53
|
+
iterator,
|
|
54
|
+
fields: {},
|
|
55
|
+
onAudioTrack: null,
|
|
56
|
+
onVideoTrack: null,
|
|
57
|
+
supportsContentRange: true,
|
|
58
|
+
contentLength: null,
|
|
59
|
+
logLevel: 'info',
|
|
60
|
+
});
|
|
61
|
+
const parsed = await media_parser_1.MediaParserInternals.parseEbml(state);
|
|
62
62
|
(0, bun_test_1.expect)(parsed).toEqual({
|
|
63
63
|
type: 'Header',
|
|
64
64
|
minVintWidth: 1,
|
|
@@ -7,6 +7,10 @@ const node_fs_1 = require("node:fs");
|
|
|
7
7
|
const convert_media_1 = require("../convert-media");
|
|
8
8
|
const node_2 = require("../writers/node");
|
|
9
9
|
(0, bun_test_1.test)('should be able to remux server side', async () => {
|
|
10
|
+
// bun file descriptor problem
|
|
11
|
+
if (process.platform === 'win32') {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
10
14
|
const { save } = await (0, convert_media_1.convertMedia)({
|
|
11
15
|
src: example_videos_1.exampleVideos.bigBuckBunny,
|
|
12
16
|
reader: node_1.nodeReader,
|
package/dist/test/stsd.test.js
CHANGED
|
@@ -35,7 +35,6 @@ const bun_test_1 = require("bun:test");
|
|
|
35
35
|
const iterator = media_parser_1.MediaParserInternals.getArrayBufferIterator(buffer, null);
|
|
36
36
|
iterator.discard(8);
|
|
37
37
|
const parsed = await media_parser_1.MediaParserInternals.parseStsd({
|
|
38
|
-
iterator,
|
|
39
38
|
offset: 0,
|
|
40
39
|
size: 159,
|
|
41
40
|
state: media_parser_1.MediaParserInternals.makeParserState({
|
|
@@ -44,7 +43,7 @@ const bun_test_1 = require("bun:test");
|
|
|
44
43
|
hasAudioTrackHandlers: true,
|
|
45
44
|
hasVideoTrackHandlers: true,
|
|
46
45
|
signal: undefined,
|
|
47
|
-
|
|
46
|
+
iterator,
|
|
48
47
|
fields: {},
|
|
49
48
|
supportsContentRange: true,
|
|
50
49
|
contentLength: null,
|
|
@@ -202,14 +201,13 @@ const bun_test_1 = require("bun:test");
|
|
|
202
201
|
0, 0, 0, 16, 112, 97, 115, 112, 0, 0, 0, 1, 0, 0, 0, 1,
|
|
203
202
|
]);
|
|
204
203
|
const parsed = await media_parser_1.MediaParserInternals.processSample({
|
|
205
|
-
iterator: media_parser_1.MediaParserInternals.getArrayBufferIterator(buffer, null),
|
|
206
204
|
state: media_parser_1.MediaParserInternals.makeParserState({
|
|
207
205
|
onAudioTrack: null,
|
|
208
206
|
onVideoTrack: () => () => undefined,
|
|
209
207
|
hasAudioTrackHandlers: true,
|
|
210
208
|
hasVideoTrackHandlers: true,
|
|
211
209
|
signal: undefined,
|
|
212
|
-
|
|
210
|
+
iterator: media_parser_1.MediaParserInternals.getArrayBufferIterator(buffer, null),
|
|
213
211
|
fields: {
|
|
214
212
|
structure: true,
|
|
215
213
|
},
|
package/dist/writers/web-fs.js
CHANGED
|
@@ -5,9 +5,12 @@ const createContent = async ({ filename }) => {
|
|
|
5
5
|
const directoryHandle = await navigator.storage.getDirectory();
|
|
6
6
|
const actualFilename = `__remotion_mediaparser:${filename}`;
|
|
7
7
|
const remove = async () => {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
try {
|
|
9
|
+
await directoryHandle.removeEntry(actualFilename, {
|
|
10
|
+
recursive: true,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
catch (_a) { }
|
|
11
14
|
};
|
|
12
15
|
await remove();
|
|
13
16
|
const fileHandle = await directoryHandle.getFileHandle(actualFilename, {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@remotion/webcodecs",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.251",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"module": "dist/esm/index.mjs",
|
|
@@ -17,15 +17,15 @@
|
|
|
17
17
|
"author": "Jonny Burger <jonny@remotion.dev>",
|
|
18
18
|
"license": "Remotion License (See https://remotion.dev/docs/webcodecs#license)",
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@remotion/media-parser": "4.0.
|
|
21
|
-
"@remotion/licensing": "4.0.
|
|
20
|
+
"@remotion/media-parser": "4.0.251",
|
|
21
|
+
"@remotion/licensing": "4.0.251"
|
|
22
22
|
},
|
|
23
23
|
"peerDependencies": {},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"@types/dom-webcodecs": "0.1.11",
|
|
26
26
|
"eslint": "9.14.0",
|
|
27
|
-
"@remotion/example-videos": "4.0.
|
|
28
|
-
"@remotion/eslint-config-internal": "4.0.
|
|
27
|
+
"@remotion/example-videos": "4.0.251",
|
|
28
|
+
"@remotion/eslint-config-internal": "4.0.251"
|
|
29
29
|
},
|
|
30
30
|
"keywords": [],
|
|
31
31
|
"publishConfig": {
|
package/dist/esm/node-writer.mjs
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
var __create = Object.create;
|
|
2
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
3
|
-
var __defProp = Object.defineProperty;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __toESM = (mod, isNodeMode, target) => {
|
|
7
|
-
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
8
|
-
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
9
|
-
for (let key of __getOwnPropNames(mod))
|
|
10
|
-
if (!__hasOwnProp.call(to, key))
|
|
11
|
-
__defProp(to, key, {
|
|
12
|
-
get: () => mod[key],
|
|
13
|
-
enumerable: true
|
|
14
|
-
});
|
|
15
|
-
return to;
|
|
16
|
-
};
|
|
17
|
-
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
18
|
-
|
|
19
|
-
// src/writers/node-writer.ts
|
|
20
|
-
var { default: fs} = (() => ({}));
|
|
21
|
-
var createContent = (filename) => {
|
|
22
|
-
return async () => {
|
|
23
|
-
const writPromise = Promise.resolve();
|
|
24
|
-
const remove = async () => {
|
|
25
|
-
await fs.promises.unlink(filename).catch(() => {
|
|
26
|
-
});
|
|
27
|
-
};
|
|
28
|
-
await remove();
|
|
29
|
-
const writeStream = await new Promise((resolve, reject) => {
|
|
30
|
-
fs.open(filename, "w", (err, fd) => {
|
|
31
|
-
if (err) {
|
|
32
|
-
reject(err);
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
resolve(fd);
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
let written = 0;
|
|
39
|
-
const write = async (arr) => {
|
|
40
|
-
await new Promise((resolve, reject) => {
|
|
41
|
-
fs.write(writeStream, arr, (err) => {
|
|
42
|
-
if (err) {
|
|
43
|
-
reject(err);
|
|
44
|
-
}
|
|
45
|
-
resolve();
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
written += arr.byteLength;
|
|
49
|
-
};
|
|
50
|
-
const updateDataAt = async (position, data) => {
|
|
51
|
-
return new Promise((resolve, reject) => {
|
|
52
|
-
fs.write(writeStream, data, 0, data.length, position, (err) => {
|
|
53
|
-
if (err) {
|
|
54
|
-
reject(err);
|
|
55
|
-
}
|
|
56
|
-
resolve();
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
};
|
|
60
|
-
const writer = {
|
|
61
|
-
write: (arr) => {
|
|
62
|
-
writPromise.then(() => write(arr));
|
|
63
|
-
return writPromise;
|
|
64
|
-
},
|
|
65
|
-
updateDataAt: (position, data) => {
|
|
66
|
-
writPromise.then(() => updateDataAt(position, data));
|
|
67
|
-
return writPromise;
|
|
68
|
-
},
|
|
69
|
-
waitForFinish: async () => {
|
|
70
|
-
await writPromise;
|
|
71
|
-
},
|
|
72
|
-
getWrittenByteCount: () => written,
|
|
73
|
-
remove,
|
|
74
|
-
save: async () => {
|
|
75
|
-
try {
|
|
76
|
-
fs.closeSync(writeStream);
|
|
77
|
-
const file = await fs.promises.readFile(filename);
|
|
78
|
-
return new Blob([file]);
|
|
79
|
-
} catch (e) {
|
|
80
|
-
return Promise.reject(e);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
};
|
|
84
|
-
return writer;
|
|
85
|
-
};
|
|
86
|
-
};
|
|
87
|
-
var nodeWriter = (path) => {
|
|
88
|
-
return { createContent: createContent(path) };
|
|
89
|
-
};
|
|
90
|
-
export {
|
|
91
|
-
nodeWriter
|
|
92
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const node_1 = require("@remotion/media-parser/node");
|
|
4
|
-
const bun_test_1 = require("bun:test");
|
|
5
|
-
const convert_media_1 = require("../convert-media");
|
|
6
|
-
(0, bun_test_1.test)('should be able to remux on server side', async () => {
|
|
7
|
-
await (0, convert_media_1.convertMedia)({
|
|
8
|
-
src: '/Users/jonathanburger/Downloads/odaje_glitch.mov',
|
|
9
|
-
reader: node_1.nodeReader,
|
|
10
|
-
container: 'mp4',
|
|
11
|
-
});
|
|
12
|
-
});
|
package/dist/writers/fs.d.ts
DELETED
package/dist/writers/fs.js
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.fsWriter = void 0;
|
|
7
|
-
const fs_1 = __importDefault(require("fs"));
|
|
8
|
-
const createContent = (filename) => {
|
|
9
|
-
return async () => {
|
|
10
|
-
let writPromise = Promise.resolve();
|
|
11
|
-
const remove = () => {
|
|
12
|
-
try {
|
|
13
|
-
fs_1.default.unlinkSync(filename);
|
|
14
|
-
}
|
|
15
|
-
catch (_a) { }
|
|
16
|
-
return Promise.resolve();
|
|
17
|
-
};
|
|
18
|
-
await remove();
|
|
19
|
-
if (!fs_1.default.existsSync(filename)) {
|
|
20
|
-
fs_1.default.writeFileSync(filename, '');
|
|
21
|
-
}
|
|
22
|
-
const writeStream = fs_1.default.openSync(filename, 'w');
|
|
23
|
-
let written = 0;
|
|
24
|
-
const write = async (data) => {
|
|
25
|
-
await new Promise((resolve, reject) => {
|
|
26
|
-
fs_1.default.write(writeStream, data, 0, data.byteLength, written, (err) => {
|
|
27
|
-
if (err) {
|
|
28
|
-
reject(err);
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
resolve();
|
|
32
|
-
});
|
|
33
|
-
});
|
|
34
|
-
written += data.byteLength;
|
|
35
|
-
};
|
|
36
|
-
const updateDataAt = (position, data) => {
|
|
37
|
-
return new Promise((resolve, reject) => {
|
|
38
|
-
fs_1.default.write(writeStream, data, 0, data.byteLength, position, (err) => {
|
|
39
|
-
if (err) {
|
|
40
|
-
reject(err);
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
resolve();
|
|
44
|
-
});
|
|
45
|
-
});
|
|
46
|
-
};
|
|
47
|
-
const writer = {
|
|
48
|
-
write: (arr) => {
|
|
49
|
-
writPromise = writPromise.then(() => write(arr));
|
|
50
|
-
return writPromise;
|
|
51
|
-
},
|
|
52
|
-
updateDataAt: (position, data) => {
|
|
53
|
-
writPromise = writPromise.then(() => updateDataAt(position, data));
|
|
54
|
-
return writPromise;
|
|
55
|
-
},
|
|
56
|
-
waitForFinish: async () => {
|
|
57
|
-
await writPromise;
|
|
58
|
-
},
|
|
59
|
-
getWrittenByteCount: () => written,
|
|
60
|
-
remove,
|
|
61
|
-
save: async () => {
|
|
62
|
-
try {
|
|
63
|
-
fs_1.default.closeSync(writeStream);
|
|
64
|
-
const file = await fs_1.default.promises.readFile(filename);
|
|
65
|
-
return new Blob([file]);
|
|
66
|
-
}
|
|
67
|
-
catch (e) {
|
|
68
|
-
return Promise.reject(e);
|
|
69
|
-
}
|
|
70
|
-
},
|
|
71
|
-
};
|
|
72
|
-
return writer;
|
|
73
|
-
};
|
|
74
|
-
};
|
|
75
|
-
const fsWriter = (path) => {
|
|
76
|
-
return { createContent: createContent(path) };
|
|
77
|
-
};
|
|
78
|
-
exports.fsWriter = fsWriter;
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.nodeWriter = void 0;
|
|
7
|
-
const node_fs_1 = __importDefault(require("node:fs"));
|
|
8
|
-
const createContent = (filename) => {
|
|
9
|
-
return async () => {
|
|
10
|
-
const writPromise = Promise.resolve();
|
|
11
|
-
const remove = async () => {
|
|
12
|
-
await node_fs_1.default.promises.unlink(filename).catch(() => { });
|
|
13
|
-
};
|
|
14
|
-
await remove();
|
|
15
|
-
const writeStream = await new Promise((resolve, reject) => {
|
|
16
|
-
node_fs_1.default.open(filename, 'w', (err, fd) => {
|
|
17
|
-
if (err) {
|
|
18
|
-
reject(err);
|
|
19
|
-
return;
|
|
20
|
-
}
|
|
21
|
-
resolve(fd);
|
|
22
|
-
});
|
|
23
|
-
});
|
|
24
|
-
let written = 0;
|
|
25
|
-
const write = async (arr) => {
|
|
26
|
-
await new Promise((resolve, reject) => {
|
|
27
|
-
node_fs_1.default.write(writeStream, arr, (err) => {
|
|
28
|
-
if (err) {
|
|
29
|
-
reject(err);
|
|
30
|
-
}
|
|
31
|
-
resolve();
|
|
32
|
-
});
|
|
33
|
-
});
|
|
34
|
-
written += arr.byteLength;
|
|
35
|
-
};
|
|
36
|
-
const updateDataAt = async (position, data) => {
|
|
37
|
-
return new Promise((resolve, reject) => {
|
|
38
|
-
node_fs_1.default.write(writeStream, data, 0, data.length, position, (err) => {
|
|
39
|
-
if (err) {
|
|
40
|
-
reject(err);
|
|
41
|
-
}
|
|
42
|
-
resolve();
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
};
|
|
46
|
-
const writer = {
|
|
47
|
-
write: (arr) => {
|
|
48
|
-
writPromise.then(() => write(arr));
|
|
49
|
-
return writPromise;
|
|
50
|
-
},
|
|
51
|
-
updateDataAt: (position, data) => {
|
|
52
|
-
writPromise.then(() => updateDataAt(position, data));
|
|
53
|
-
return writPromise;
|
|
54
|
-
},
|
|
55
|
-
waitForFinish: async () => {
|
|
56
|
-
await writPromise;
|
|
57
|
-
},
|
|
58
|
-
getWrittenByteCount: () => written,
|
|
59
|
-
remove,
|
|
60
|
-
save: async () => {
|
|
61
|
-
try {
|
|
62
|
-
node_fs_1.default.closeSync(writeStream);
|
|
63
|
-
const file = await node_fs_1.default.promises.readFile(filename);
|
|
64
|
-
return new Blob([file]);
|
|
65
|
-
}
|
|
66
|
-
catch (e) {
|
|
67
|
-
return Promise.reject(e);
|
|
68
|
-
}
|
|
69
|
-
},
|
|
70
|
-
};
|
|
71
|
-
return writer;
|
|
72
|
-
};
|
|
73
|
-
};
|
|
74
|
-
const nodeWriter = (path) => {
|
|
75
|
-
return { createContent: createContent(path) };
|
|
76
|
-
};
|
|
77
|
-
exports.nodeWriter = nodeWriter;
|