@remotion/studio-server 4.0.91
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/.eslintrc +13 -0
- package/.turbo/turbo-build.log +4 -0
- package/LICENSE.md +45 -0
- package/README.md +3 -0
- package/dist/ansi-diff.d.ts +41 -0
- package/dist/ansi-diff.js +220 -0
- package/dist/better-opn/index.d.ts +6 -0
- package/dist/better-opn/index.js +202 -0
- package/dist/codemods/update-default-props.d.ts +7 -0
- package/dist/codemods/update-default-props.js +137 -0
- package/dist/file-watcher.d.ts +9 -0
- package/dist/file-watcher.js +35 -0
- package/dist/get-latest-remotion-version.d.ts +1 -0
- package/dist/get-latest-remotion-version.js +31 -0
- package/dist/get-network-address.d.ts +1 -0
- package/dist/get-network-address.js +16 -0
- package/dist/helpers/get-file-source.d.ts +1 -0
- package/dist/helpers/get-file-source.js +22 -0
- package/dist/helpers/open-in-editor.d.ts +16 -0
- package/dist/helpers/open-in-editor.js +503 -0
- package/dist/index.d.ts +58 -0
- package/dist/index.js +27 -0
- package/dist/max-timeline-tracks.d.ts +2 -0
- package/dist/max-timeline-tracks.js +25 -0
- package/dist/open-directory-in-finder.d.ts +1 -0
- package/dist/open-directory-in-finder.js +49 -0
- package/dist/preview-server/api-routes.d.ts +5 -0
- package/dist/preview-server/api-routes.js +25 -0
- package/dist/preview-server/api-types.d.ts +23 -0
- package/dist/preview-server/api-types.js +2 -0
- package/dist/preview-server/dev-middleware/compatible-api.d.ts +7 -0
- package/dist/preview-server/dev-middleware/compatible-api.js +20 -0
- package/dist/preview-server/dev-middleware/get-paths.d.ts +7 -0
- package/dist/preview-server/dev-middleware/get-paths.js +19 -0
- package/dist/preview-server/dev-middleware/index.d.ts +3 -0
- package/dist/preview-server/dev-middleware/index.js +27 -0
- package/dist/preview-server/dev-middleware/middleware.d.ts +9 -0
- package/dist/preview-server/dev-middleware/middleware.js +222 -0
- package/dist/preview-server/dev-middleware/range-parser.d.ts +15 -0
- package/dist/preview-server/dev-middleware/range-parser.js +96 -0
- package/dist/preview-server/dev-middleware/ready.d.ts +3 -0
- package/dist/preview-server/dev-middleware/ready.js +11 -0
- package/dist/preview-server/dev-middleware/setup-hooks.d.ts +2 -0
- package/dist/preview-server/dev-middleware/setup-hooks.js +52 -0
- package/dist/preview-server/dev-middleware/setup-output-filesystem.d.ts +2 -0
- package/dist/preview-server/dev-middleware/setup-output-filesystem.js +13 -0
- package/dist/preview-server/dev-middleware/types.d.ts +10 -0
- package/dist/preview-server/dev-middleware/types.js +2 -0
- package/dist/preview-server/env-supports-fs-recursive.d.ts +1 -0
- package/dist/preview-server/env-supports-fs-recursive.js +18 -0
- package/dist/preview-server/file-existence-watchers.d.ts +13 -0
- package/dist/preview-server/file-existence-watchers.js +62 -0
- package/dist/preview-server/get-absolute-public-dir.d.ts +4 -0
- package/dist/preview-server/get-absolute-public-dir.js +14 -0
- package/dist/preview-server/get-package-manager.d.ts +10 -0
- package/dist/preview-server/get-package-manager.js +62 -0
- package/dist/preview-server/handler.d.ts +12 -0
- package/dist/preview-server/handler.js +36 -0
- package/dist/preview-server/hot-middleware/index.d.ts +102 -0
- package/dist/preview-server/hot-middleware/index.js +149 -0
- package/dist/preview-server/hot-middleware/types.d.ts +2 -0
- package/dist/preview-server/hot-middleware/types.js +2 -0
- package/dist/preview-server/live-events.d.ts +10 -0
- package/dist/preview-server/live-events.js +76 -0
- package/dist/preview-server/parse-body.d.ts +2 -0
- package/dist/preview-server/parse-body.js +16 -0
- package/dist/preview-server/project-info.d.ts +2 -0
- package/dist/preview-server/project-info.js +32 -0
- package/dist/preview-server/public-folder.d.ts +12 -0
- package/dist/preview-server/public-folder.js +58 -0
- package/dist/preview-server/routes/add-render.d.ts +3 -0
- package/dist/preview-server/routes/add-render.js +122 -0
- package/dist/preview-server/routes/can-update-default-props.d.ts +4 -0
- package/dist/preview-server/routes/can-update-default-props.js +40 -0
- package/dist/preview-server/routes/cancel-render.d.ts +3 -0
- package/dist/preview-server/routes/cancel-render.js +8 -0
- package/dist/preview-server/routes/copy-still-to-clipboard-handler.d.ts +3 -0
- package/dist/preview-server/routes/copy-still-to-clipboard-handler.js +17 -0
- package/dist/preview-server/routes/open-in-file-explorer.d.ts +3 -0
- package/dist/preview-server/routes/open-in-file-explorer.js +8 -0
- package/dist/preview-server/routes/remove-render.d.ts +3 -0
- package/dist/preview-server/routes/remove-render.js +8 -0
- package/dist/preview-server/routes/subscribe-to-file-existence.d.ts +3 -0
- package/dist/preview-server/routes/subscribe-to-file-existence.js +13 -0
- package/dist/preview-server/routes/unsubscribe-from-file-existence.d.ts +3 -0
- package/dist/preview-server/routes/unsubscribe-from-file-existence.js +13 -0
- package/dist/preview-server/routes/update-available.d.ts +3 -0
- package/dist/preview-server/routes/update-available.js +9 -0
- package/dist/preview-server/routes/update-default-props.d.ts +3 -0
- package/dist/preview-server/routes/update-default-props.js +34 -0
- package/dist/preview-server/serve-static.d.ts +14 -0
- package/dist/preview-server/serve-static.js +75 -0
- package/dist/preview-server/start-server.d.ts +31 -0
- package/dist/preview-server/start-server.js +123 -0
- package/dist/preview-server/update-available.d.ts +3 -0
- package/dist/preview-server/update-available.js +47 -0
- package/dist/routes.d.ts +24 -0
- package/dist/routes.js +242 -0
- package/dist/server-ready.d.ts +2 -0
- package/dist/server-ready.js +13 -0
- package/dist/start-studio.d.ts +26 -0
- package/dist/start-studio.js +117 -0
- package/dist/watch-root-file.d.ts +1 -0
- package/dist/watch-root-file.js +22 -0
- package/package.json +54 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/web/beep.wav +0 -0
- package/web/favicon.png +0 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export { ApiRoutes, CopyStillToClipboardRequest, getDefaultOutLocation, OpenInFileExplorerRequest, } from '@remotion/studio-shared';
|
|
2
|
+
export type { AggregateRenderProgress, BundlingState, CopyingState, DownloadProgress, HotMiddlewareOptions, JobProgressCallback, ModuleMap, PackageManager, ProjectInfo, RenderingProgressInput, RenderJob, RenderJobWithCleanup, RenderStep, RequiredChromiumOptions, StitchingProgressInput, UiOpenGlOptions, } from '@remotion/studio-shared';
|
|
3
|
+
import { AnsiDiff } from './ansi-diff';
|
|
4
|
+
export declare const StudioServerInternals: {
|
|
5
|
+
startStudio: ({ browserArgs, browserFlag, configValueShouldOpenBrowser, fullEntryPath, logLevel, getCurrentInputProps, getEnvVariables, desiredPort, maxTimelineTracks, remotionRoot, keyboardShortcutsEnabled, userPassedPublicDir, webpackOverride, poll, getRenderDefaults, getRenderQueue, numberOfAudioTags, queueMethods, parsedCliOpen, previewEntry, }: {
|
|
6
|
+
browserArgs: string;
|
|
7
|
+
browserFlag: string;
|
|
8
|
+
logLevel: "verbose" | "info" | "warn" | "error";
|
|
9
|
+
configValueShouldOpenBrowser: boolean;
|
|
10
|
+
fullEntryPath: string;
|
|
11
|
+
getCurrentInputProps: () => object;
|
|
12
|
+
getEnvVariables: () => Record<string, string>;
|
|
13
|
+
desiredPort: number | null;
|
|
14
|
+
maxTimelineTracks: number;
|
|
15
|
+
remotionRoot: string;
|
|
16
|
+
keyboardShortcutsEnabled: boolean;
|
|
17
|
+
userPassedPublicDir: string | null;
|
|
18
|
+
webpackOverride: import("@remotion/bundler").WebpackOverrideFn;
|
|
19
|
+
poll: number | null;
|
|
20
|
+
getRenderDefaults: () => import("@remotion/studio-shared").RenderDefaults;
|
|
21
|
+
getRenderQueue: () => import("@remotion/studio-shared").RenderJob[];
|
|
22
|
+
numberOfAudioTags: number;
|
|
23
|
+
queueMethods: import("./preview-server/api-types").QueueMethods;
|
|
24
|
+
parsedCliOpen: boolean;
|
|
25
|
+
previewEntry: string;
|
|
26
|
+
}) => Promise<void>;
|
|
27
|
+
getRemotionVersion: () => any;
|
|
28
|
+
waitForLiveEventsListener: () => Promise<import("./preview-server/live-events").LiveEventsServer>;
|
|
29
|
+
lockFilePaths: {
|
|
30
|
+
manager: import("@remotion/studio-shared").PackageManager;
|
|
31
|
+
path: string;
|
|
32
|
+
installCommand: string;
|
|
33
|
+
startCommand: string;
|
|
34
|
+
}[];
|
|
35
|
+
getPackageManager: (remotionRoot: string, packageManager: string | undefined) => {
|
|
36
|
+
manager: import("@remotion/studio-shared").PackageManager;
|
|
37
|
+
path: string;
|
|
38
|
+
installCommand: string;
|
|
39
|
+
startCommand: string;
|
|
40
|
+
} | "unknown";
|
|
41
|
+
getMaxTimelineTracks: () => number;
|
|
42
|
+
setMaxTimelineTracks: (maxTracks: number) => void;
|
|
43
|
+
getLatestRemotionVersion: () => Promise<any>;
|
|
44
|
+
installFileWatcher: ({ file, onChange, }: {
|
|
45
|
+
file: string;
|
|
46
|
+
onChange: (type: "created" | "deleted" | "changed") => void;
|
|
47
|
+
}) => {
|
|
48
|
+
exists: boolean;
|
|
49
|
+
unwatch: () => void;
|
|
50
|
+
};
|
|
51
|
+
AnsiDiff: typeof AnsiDiff;
|
|
52
|
+
formatBytes: (number: number, options?: (Intl.NumberFormatOptions & {
|
|
53
|
+
locale: string;
|
|
54
|
+
bits?: boolean | undefined;
|
|
55
|
+
binary?: boolean | undefined;
|
|
56
|
+
signed: boolean;
|
|
57
|
+
}) | undefined) => string;
|
|
58
|
+
};
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StudioServerInternals = exports.getDefaultOutLocation = void 0;
|
|
4
|
+
const studio_shared_1 = require("@remotion/studio-shared");
|
|
5
|
+
var studio_shared_2 = require("@remotion/studio-shared");
|
|
6
|
+
Object.defineProperty(exports, "getDefaultOutLocation", { enumerable: true, get: function () { return studio_shared_2.getDefaultOutLocation; } });
|
|
7
|
+
const ansi_diff_1 = require("./ansi-diff");
|
|
8
|
+
const file_watcher_1 = require("./file-watcher");
|
|
9
|
+
const get_latest_remotion_version_1 = require("./get-latest-remotion-version");
|
|
10
|
+
const max_timeline_tracks_1 = require("./max-timeline-tracks");
|
|
11
|
+
const get_package_manager_1 = require("./preview-server/get-package-manager");
|
|
12
|
+
const live_events_1 = require("./preview-server/live-events");
|
|
13
|
+
const update_available_1 = require("./preview-server/update-available");
|
|
14
|
+
const start_studio_1 = require("./start-studio");
|
|
15
|
+
exports.StudioServerInternals = {
|
|
16
|
+
startStudio: start_studio_1.startStudio,
|
|
17
|
+
getRemotionVersion: update_available_1.getRemotionVersion,
|
|
18
|
+
waitForLiveEventsListener: live_events_1.waitForLiveEventsListener,
|
|
19
|
+
lockFilePaths: get_package_manager_1.lockFilePaths,
|
|
20
|
+
getPackageManager: get_package_manager_1.getPackageManager,
|
|
21
|
+
getMaxTimelineTracks: max_timeline_tracks_1.getMaxTimelineTracks,
|
|
22
|
+
setMaxTimelineTracks: max_timeline_tracks_1.setMaxTimelineTracks,
|
|
23
|
+
getLatestRemotionVersion: get_latest_remotion_version_1.getLatestRemotionVersion,
|
|
24
|
+
installFileWatcher: file_watcher_1.installFileWatcher,
|
|
25
|
+
AnsiDiff: ansi_diff_1.AnsiDiff,
|
|
26
|
+
formatBytes: studio_shared_1.formatBytes,
|
|
27
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getMaxTimelineTracks = exports.setMaxTimelineTracks = void 0;
|
|
4
|
+
const studio_shared_1 = require("@remotion/studio-shared");
|
|
5
|
+
let maxTimelineTracks = studio_shared_1.DEFAULT_TIMELINE_TRACKS;
|
|
6
|
+
const setMaxTimelineTracks = (maxTracks) => {
|
|
7
|
+
if (typeof maxTracks !== 'number') {
|
|
8
|
+
throw new Error(`Need to pass a number to Config.setMaxTimelineTracks(), got ${typeof maxTracks}`);
|
|
9
|
+
}
|
|
10
|
+
if (Number.isNaN(maxTracks)) {
|
|
11
|
+
throw new Error(`Need to pass a real number to Config.setMaxTimelineTracks(), got NaN`);
|
|
12
|
+
}
|
|
13
|
+
if (!Number.isFinite(maxTracks)) {
|
|
14
|
+
throw new Error(`Need to pass a real number to Config.setMaxTimelineTracks(), got ${maxTracks}`);
|
|
15
|
+
}
|
|
16
|
+
if (maxTracks < 0) {
|
|
17
|
+
throw new Error(`Need to pass a non-negative number to Config.setMaxTimelineTracks(), got ${maxTracks}`);
|
|
18
|
+
}
|
|
19
|
+
maxTimelineTracks = maxTracks;
|
|
20
|
+
};
|
|
21
|
+
exports.setMaxTimelineTracks = setMaxTimelineTracks;
|
|
22
|
+
const getMaxTimelineTracks = () => {
|
|
23
|
+
return maxTimelineTracks;
|
|
24
|
+
};
|
|
25
|
+
exports.getMaxTimelineTracks = getMaxTimelineTracks;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const openDirectoryInFinder: (dirToOpen: string, allowedDirectory: string) => Promise<void>;
|
|
@@ -0,0 +1,49 @@
|
|
|
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.openDirectoryInFinder = void 0;
|
|
7
|
+
const node_child_process_1 = require("node:child_process");
|
|
8
|
+
const node_os_1 = require("node:os");
|
|
9
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
10
|
+
const no_react_1 = require("remotion/no-react");
|
|
11
|
+
const openDirectoryInFinder = (dirToOpen, allowedDirectory) => {
|
|
12
|
+
const resolved = node_path_1.default.resolve(allowedDirectory, dirToOpen);
|
|
13
|
+
const relativeToProcessCwd = node_path_1.default.relative(allowedDirectory, resolved);
|
|
14
|
+
if (relativeToProcessCwd.startsWith('..')) {
|
|
15
|
+
throw new Error(`Not allowed to open ${relativeToProcessCwd}`);
|
|
16
|
+
}
|
|
17
|
+
if ((0, node_os_1.platform)() === 'win32') {
|
|
18
|
+
return new Promise((resolve, reject) => {
|
|
19
|
+
(0, node_child_process_1.exec)(`start ${dirToOpen}`, (error) => {
|
|
20
|
+
if (error) {
|
|
21
|
+
reject(error);
|
|
22
|
+
}
|
|
23
|
+
resolve();
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
const command = (0, node_os_1.platform)() === 'darwin' ? 'open' : 'xdg-open';
|
|
28
|
+
const p = (0, node_child_process_1.spawn)(command, [(0, node_os_1.platform)() === 'darwin' ? '-R' : null, dirToOpen].filter(no_react_1.NoReactInternals.truthy));
|
|
29
|
+
const stderrChunks = [];
|
|
30
|
+
p.stderr.on('data', (d) => stderrChunks.push(d));
|
|
31
|
+
return new Promise((resolve, reject) => {
|
|
32
|
+
p.on('exit', (code) => {
|
|
33
|
+
if (code === 0) {
|
|
34
|
+
resolve();
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
const message = Buffer.concat(stderrChunks).toString('utf-8');
|
|
38
|
+
reject(new Error(message));
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
p.on('error', (err) => {
|
|
42
|
+
p.kill();
|
|
43
|
+
if (err) {
|
|
44
|
+
reject(err);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
exports.openDirectoryInFinder = openDirectoryInFinder;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.allApiRoutes = void 0;
|
|
4
|
+
const add_render_1 = require("./routes/add-render");
|
|
5
|
+
const can_update_default_props_1 = require("./routes/can-update-default-props");
|
|
6
|
+
const cancel_render_1 = require("./routes/cancel-render");
|
|
7
|
+
const copy_still_to_clipboard_handler_1 = require("./routes/copy-still-to-clipboard-handler");
|
|
8
|
+
const open_in_file_explorer_1 = require("./routes/open-in-file-explorer");
|
|
9
|
+
const remove_render_1 = require("./routes/remove-render");
|
|
10
|
+
const subscribe_to_file_existence_1 = require("./routes/subscribe-to-file-existence");
|
|
11
|
+
const unsubscribe_from_file_existence_1 = require("./routes/unsubscribe-from-file-existence");
|
|
12
|
+
const update_available_1 = require("./routes/update-available");
|
|
13
|
+
const update_default_props_1 = require("./routes/update-default-props");
|
|
14
|
+
exports.allApiRoutes = {
|
|
15
|
+
'/api/cancel': cancel_render_1.handleCancelRender,
|
|
16
|
+
'/api/render': add_render_1.handleAddRender,
|
|
17
|
+
'/api/unsubscribe-from-file-existence': unsubscribe_from_file_existence_1.unsubscribeFromFileExistence,
|
|
18
|
+
'/api/subscribe-to-file-existence': subscribe_to_file_existence_1.subscribeToFileExistence,
|
|
19
|
+
'/api/remove-render': remove_render_1.handleRemoveRender,
|
|
20
|
+
'/api/open-in-file-explorer': open_in_file_explorer_1.handleOpenInFileExplorer,
|
|
21
|
+
'/api/copy-still-to-clipboard': copy_still_to_clipboard_handler_1.handleCopyStillToClipboard,
|
|
22
|
+
'/api/update-default-props': update_default_props_1.updateDefaultPropsHandler,
|
|
23
|
+
'/api/can-update-default-props': can_update_default_props_1.canUpdateDefaultPropsHandler,
|
|
24
|
+
'/api/update-available': update_available_1.handleUpdate,
|
|
25
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import type { LogLevel } from '@remotion/renderer';
|
|
3
|
+
import type { RenderJobWithCleanup } from '@remotion/studio-shared';
|
|
4
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
5
|
+
export type QueueMethods = {
|
|
6
|
+
removeJob: (jobId: string) => void;
|
|
7
|
+
cancelJob: (jobId: string) => void;
|
|
8
|
+
addJob: ({ job, entryPoint, remotionRoot, logLevel, }: {
|
|
9
|
+
job: RenderJobWithCleanup;
|
|
10
|
+
entryPoint: string;
|
|
11
|
+
remotionRoot: string;
|
|
12
|
+
logLevel: LogLevel;
|
|
13
|
+
}) => void;
|
|
14
|
+
};
|
|
15
|
+
export type ApiHandler<ReqData, ResData> = (params: {
|
|
16
|
+
input: ReqData;
|
|
17
|
+
entryPoint: string;
|
|
18
|
+
remotionRoot: string;
|
|
19
|
+
request: IncomingMessage;
|
|
20
|
+
response: ServerResponse;
|
|
21
|
+
logLevel: LogLevel;
|
|
22
|
+
methods: QueueMethods;
|
|
23
|
+
}) => Promise<ResData>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
/// <reference types="node" />
|
|
4
|
+
import type { ReadStream } from 'node:fs';
|
|
5
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
6
|
+
export declare function setHeaderForResponse(res: ServerResponse, name: string, value: string | number): void;
|
|
7
|
+
export declare function send(req: IncomingMessage, res: ServerResponse, bufferOtStream: ReadStream | string | Buffer, byteLength: number): void;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.send = exports.setHeaderForResponse = void 0;
|
|
4
|
+
function setHeaderForResponse(res, name, value) {
|
|
5
|
+
res.setHeader(name, typeof value === 'number' ? String(value) : value);
|
|
6
|
+
}
|
|
7
|
+
exports.setHeaderForResponse = setHeaderForResponse;
|
|
8
|
+
function send(req, res, bufferOtStream, byteLength) {
|
|
9
|
+
if (typeof bufferOtStream === 'string' || Buffer.isBuffer(bufferOtStream)) {
|
|
10
|
+
res.end(bufferOtStream);
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
setHeaderForResponse(res, 'Content-Length', byteLength);
|
|
14
|
+
if (req.method === 'HEAD') {
|
|
15
|
+
res.end();
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
bufferOtStream.pipe(res);
|
|
19
|
+
}
|
|
20
|
+
exports.send = send;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getPaths = void 0;
|
|
4
|
+
function getPaths(context) {
|
|
5
|
+
const { stats } = context;
|
|
6
|
+
const publicPaths = [];
|
|
7
|
+
if (!stats) {
|
|
8
|
+
return publicPaths;
|
|
9
|
+
}
|
|
10
|
+
const { compilation } = stats;
|
|
11
|
+
// The `output.path` is always present and always absolute
|
|
12
|
+
const outputPath = compilation.getPath(compilation.outputOptions.path || '');
|
|
13
|
+
const publicPath = compilation.outputOptions.publicPath
|
|
14
|
+
? compilation.getPath(compilation.outputOptions.publicPath)
|
|
15
|
+
: '';
|
|
16
|
+
publicPaths.push({ outputPath, publicPath });
|
|
17
|
+
return publicPaths;
|
|
18
|
+
}
|
|
19
|
+
exports.getPaths = getPaths;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.wdm = void 0;
|
|
4
|
+
const middleware_1 = require("./middleware");
|
|
5
|
+
const setup_hooks_1 = require("./setup-hooks");
|
|
6
|
+
const setup_output_filesystem_1 = require("./setup-output-filesystem");
|
|
7
|
+
const wdm = (compiler) => {
|
|
8
|
+
const context = {
|
|
9
|
+
state: false,
|
|
10
|
+
stats: undefined,
|
|
11
|
+
callbacks: [],
|
|
12
|
+
compiler,
|
|
13
|
+
logger: compiler.getInfrastructureLogger('remotion'),
|
|
14
|
+
outputFileSystem: undefined,
|
|
15
|
+
};
|
|
16
|
+
(0, setup_hooks_1.setupHooks)(context);
|
|
17
|
+
(0, setup_output_filesystem_1.setupOutputFileSystem)(context);
|
|
18
|
+
const errorHandler = (error) => {
|
|
19
|
+
if (error) {
|
|
20
|
+
context.logger.error(error);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
const watchOptions = context.compiler.options.watchOptions || {};
|
|
24
|
+
context.compiler.watch(watchOptions, errorHandler);
|
|
25
|
+
return (0, middleware_1.middleware)(context);
|
|
26
|
+
};
|
|
27
|
+
exports.wdm = wdm;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
3
|
+
import type { DevMiddlewareContext } from './types';
|
|
4
|
+
export declare function getValueContentRangeHeader(type: string, size: number, range?: {
|
|
5
|
+
start: number;
|
|
6
|
+
end: number;
|
|
7
|
+
}): string;
|
|
8
|
+
export type MiddleWare = (req: IncomingMessage, res: ServerResponse, next: () => void) => void;
|
|
9
|
+
export declare function middleware(context: DevMiddlewareContext): (req: IncomingMessage, res: ServerResponse, next: () => void) => void;
|
|
@@ -0,0 +1,222 @@
|
|
|
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.middleware = exports.getValueContentRangeHeader = void 0;
|
|
7
|
+
const renderer_1 = require("@remotion/renderer");
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const node_querystring_1 = __importDefault(require("node:querystring"));
|
|
10
|
+
const node_url_1 = require("node:url");
|
|
11
|
+
const compatible_api_1 = require("./compatible-api");
|
|
12
|
+
const get_paths_1 = require("./get-paths");
|
|
13
|
+
const range_parser_1 = require("./range-parser");
|
|
14
|
+
const ready_1 = require("./ready");
|
|
15
|
+
const cacheStore = new WeakMap();
|
|
16
|
+
const mem = (fn, { cache = new Map() } = {}) => {
|
|
17
|
+
const memoized = (...arguments_) => {
|
|
18
|
+
const [key] = arguments_;
|
|
19
|
+
const cacheItem = cache.get(key);
|
|
20
|
+
if (cacheItem) {
|
|
21
|
+
return cacheItem.data;
|
|
22
|
+
}
|
|
23
|
+
const result = fn.apply(this, arguments_);
|
|
24
|
+
cache.set(key, {
|
|
25
|
+
data: result,
|
|
26
|
+
});
|
|
27
|
+
return result;
|
|
28
|
+
};
|
|
29
|
+
cacheStore.set(memoized, cache);
|
|
30
|
+
return memoized;
|
|
31
|
+
};
|
|
32
|
+
const memoizedParse = mem(node_url_1.parse);
|
|
33
|
+
function getFilenameFromUrl(context, url) {
|
|
34
|
+
var _a, _b;
|
|
35
|
+
const paths = (0, get_paths_1.getPaths)(context);
|
|
36
|
+
let foundFilename;
|
|
37
|
+
let urlObject;
|
|
38
|
+
try {
|
|
39
|
+
// The `url` property of the `request` is contains only `pathname`, `search` and `hash`
|
|
40
|
+
urlObject = memoizedParse(url, false, true);
|
|
41
|
+
}
|
|
42
|
+
catch (_ignoreError) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
for (const { publicPath, outputPath } of paths) {
|
|
46
|
+
let filename;
|
|
47
|
+
let publicPathObject;
|
|
48
|
+
try {
|
|
49
|
+
publicPathObject = memoizedParse(publicPath !== 'auto' && publicPath ? publicPath : '/', false, true);
|
|
50
|
+
}
|
|
51
|
+
catch (_ignoreError) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if ((_a = urlObject.pathname) === null || _a === void 0 ? void 0 : _a.startsWith(publicPathObject.pathname)) {
|
|
55
|
+
filename = outputPath;
|
|
56
|
+
// Strip the `pathname` property from the `publicPath` option from the start of requested url
|
|
57
|
+
// `/complex/foo.js` => `foo.js`
|
|
58
|
+
const pathname = urlObject.pathname.substr(publicPathObject.pathname.length);
|
|
59
|
+
if (pathname) {
|
|
60
|
+
filename = node_path_1.default.join(outputPath, node_querystring_1.default.unescape(pathname));
|
|
61
|
+
}
|
|
62
|
+
if (!context.outputFileSystem) {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
let fsStats = (_b = context.outputFileSystem) === null || _b === void 0 ? void 0 : _b.statSync(filename);
|
|
67
|
+
if (fsStats.isFile()) {
|
|
68
|
+
foundFilename = filename;
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
else if (fsStats.isDirectory()) {
|
|
72
|
+
const indexValue = 'index.html';
|
|
73
|
+
filename = node_path_1.default.join(filename, indexValue);
|
|
74
|
+
// eslint-disable-next-line max-depth
|
|
75
|
+
try {
|
|
76
|
+
fsStats = context.outputFileSystem.statSync(filename);
|
|
77
|
+
}
|
|
78
|
+
catch (__ignoreError) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
// eslint-disable-next-line max-depth
|
|
82
|
+
if (fsStats.isFile()) {
|
|
83
|
+
foundFilename = filename;
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch (_ignoreError) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return foundFilename;
|
|
94
|
+
}
|
|
95
|
+
function getValueContentRangeHeader(type, size, range) {
|
|
96
|
+
return `${type} ${range ? `${range.start}-${range.end}` : '*'}/${size}`;
|
|
97
|
+
}
|
|
98
|
+
exports.getValueContentRangeHeader = getValueContentRangeHeader;
|
|
99
|
+
function createHtmlDocument(title, body) {
|
|
100
|
+
return (`${'<!DOCTYPE html>\n' +
|
|
101
|
+
'<html lang="en">\n' +
|
|
102
|
+
'<head>\n' +
|
|
103
|
+
'<meta charset="utf-8">\n' +
|
|
104
|
+
'<title>'}${title}</title>\n` +
|
|
105
|
+
`</head>\n` +
|
|
106
|
+
`<body>\n` +
|
|
107
|
+
`<pre>${body}</pre>\n` +
|
|
108
|
+
`</body>\n` +
|
|
109
|
+
`</html>\n`);
|
|
110
|
+
}
|
|
111
|
+
const BYTES_RANGE_REGEXP = /^ *bytes/i;
|
|
112
|
+
function middleware(context) {
|
|
113
|
+
return function (req, res, next) {
|
|
114
|
+
const acceptedMethods = ['GET', 'HEAD'];
|
|
115
|
+
if (req.method && !acceptedMethods.includes(req.method)) {
|
|
116
|
+
goNext();
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
(0, ready_1.ready)(context, processRequest);
|
|
120
|
+
function goNext() {
|
|
121
|
+
return next();
|
|
122
|
+
}
|
|
123
|
+
async function processRequest() {
|
|
124
|
+
var _a;
|
|
125
|
+
const filename = getFilenameFromUrl(context, req.url);
|
|
126
|
+
if (!filename) {
|
|
127
|
+
goNext();
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* @type {{key: string, value: string | number}[]}
|
|
132
|
+
*/
|
|
133
|
+
if (!res.getHeader('Content-Type')) {
|
|
134
|
+
// content-type name(like application/javascript; charset=utf-8) or false
|
|
135
|
+
const contentType = renderer_1.RenderInternals.mimeContentType(node_path_1.default.extname(filename));
|
|
136
|
+
// Only set content-type header if media type is known
|
|
137
|
+
// https://tools.ietf.org/html/rfc7231#section-3.1.1.5
|
|
138
|
+
if (contentType) {
|
|
139
|
+
(0, compatible_api_1.setHeaderForResponse)(res, 'Content-Type', contentType);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (!res.getHeader('Accept-Ranges')) {
|
|
143
|
+
res.setHeader('Accept-Ranges', 'bytes');
|
|
144
|
+
(0, compatible_api_1.setHeaderForResponse)(res, 'Accept-Ranges', 'bytes');
|
|
145
|
+
}
|
|
146
|
+
const rangeHeader = req.headers.range;
|
|
147
|
+
let start;
|
|
148
|
+
let end;
|
|
149
|
+
if (rangeHeader &&
|
|
150
|
+
BYTES_RANGE_REGEXP.test(rangeHeader) &&
|
|
151
|
+
context.outputFileSystem) {
|
|
152
|
+
const size = await new Promise((resolve) => {
|
|
153
|
+
var _a;
|
|
154
|
+
(_a = context.outputFileSystem) === null || _a === void 0 ? void 0 : _a.lstat(filename, (error, stats) => {
|
|
155
|
+
var _a;
|
|
156
|
+
if (error) {
|
|
157
|
+
context.logger.error(error);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
resolve((_a = stats === null || stats === void 0 ? void 0 : stats.size) !== null && _a !== void 0 ? _a : 0);
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
const parsedRanges = (0, range_parser_1.parseRange)(size, rangeHeader);
|
|
164
|
+
if (parsedRanges === -1) {
|
|
165
|
+
const message = "Unsatisfiable range for 'Range' header.";
|
|
166
|
+
context.logger.error(message);
|
|
167
|
+
const existingHeaders = res.getHeaderNames();
|
|
168
|
+
for (const header of existingHeaders) {
|
|
169
|
+
res.removeHeader(header);
|
|
170
|
+
}
|
|
171
|
+
res.statusCode = 416;
|
|
172
|
+
(0, compatible_api_1.setHeaderForResponse)(res, 'Content-Range', getValueContentRangeHeader('bytes', size));
|
|
173
|
+
(0, compatible_api_1.setHeaderForResponse)(res, 'Content-Type', 'text/html; charset=utf-8');
|
|
174
|
+
const document = createHtmlDocument(416, `Error: ${message}`);
|
|
175
|
+
const _byteLength = Buffer.byteLength(document);
|
|
176
|
+
(0, compatible_api_1.setHeaderForResponse)(res, 'Content-Length', Buffer.byteLength(document));
|
|
177
|
+
(0, compatible_api_1.send)(req, res, document, _byteLength);
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
if (parsedRanges === -2) {
|
|
181
|
+
context.logger.error("A malformed 'Range' header was provided. A regular response will be sent for this request.");
|
|
182
|
+
}
|
|
183
|
+
else if (parsedRanges.length > 1) {
|
|
184
|
+
context.logger.error("A 'Range' header with multiple ranges was provided. Multiple ranges are not supported, so a regular response will be sent for this request.");
|
|
185
|
+
}
|
|
186
|
+
if (parsedRanges !== -2 && parsedRanges.length === 1) {
|
|
187
|
+
// Content-Range
|
|
188
|
+
res.statusCode = 206;
|
|
189
|
+
(0, compatible_api_1.setHeaderForResponse)(res, 'Content-Range', getValueContentRangeHeader('bytes', size, parsedRanges[0]));
|
|
190
|
+
[{ start, end }] = parsedRanges;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
const isFsSupportsStream = typeof ((_a = context.outputFileSystem) === null || _a === void 0 ? void 0 : _a.createReadStream) === 'function';
|
|
194
|
+
let bufferOtStream;
|
|
195
|
+
let byteLength = 0;
|
|
196
|
+
try {
|
|
197
|
+
if (typeof start !== 'undefined' &&
|
|
198
|
+
typeof end !== 'undefined' &&
|
|
199
|
+
isFsSupportsStream &&
|
|
200
|
+
context.outputFileSystem) {
|
|
201
|
+
bufferOtStream = context.outputFileSystem.createReadStream(filename, {
|
|
202
|
+
start,
|
|
203
|
+
end,
|
|
204
|
+
});
|
|
205
|
+
byteLength = end - start + 1;
|
|
206
|
+
}
|
|
207
|
+
else if (context.outputFileSystem) {
|
|
208
|
+
bufferOtStream = context.outputFileSystem.readFileSync(filename);
|
|
209
|
+
byteLength = bufferOtStream.byteLength;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
catch (_ignoreError) {
|
|
213
|
+
goNext();
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
if (bufferOtStream) {
|
|
217
|
+
(0, compatible_api_1.send)(req, res, bufferOtStream, byteLength);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
exports.middleware = middleware;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* range-parser
|
|
3
|
+
* Copyright(c) 2012-2014 TJ Holowaychuk
|
|
4
|
+
* Copyright(c) 2015-2016 Douglas Christopher Wilson
|
|
5
|
+
* MIT Licensed
|
|
6
|
+
*/
|
|
7
|
+
type Range = {
|
|
8
|
+
start: number;
|
|
9
|
+
end: number;
|
|
10
|
+
};
|
|
11
|
+
type Ranges = Range[] & {
|
|
12
|
+
type?: string;
|
|
13
|
+
};
|
|
14
|
+
export declare function parseRange(size: number, str: string | string[]): -2 | -1 | Ranges;
|
|
15
|
+
export {};
|