From 0455923e439974b6de848754332d05ebe4b2d3c1 Mon Sep 17 00:00:00 2001
From: Jerome Wu
Date: Wed, 30 Oct 2019 21:23:51 +0800
Subject: [PATCH] Fix worker cross domain issue
---
README.md | 4 ++++
src/createWorker.js | 5 +++--
src/utils/getEnvironment.js | 10 ++++++++++
src/utils/resolvePaths.js | 12 ++++++++++++
src/worker/browser/defaultOptions.js | 1 +
src/worker/browser/spawnWorker.js | 16 +++++++++++++---
6 files changed, 43 insertions(+), 5 deletions(-)
create mode 100644 src/utils/getEnvironment.js
create mode 100644 src/utils/resolvePaths.js
diff --git a/README.md b/README.md
index b52d72b..b8143e7 100644
--- a/README.md
+++ b/README.md
@@ -22,6 +22,10 @@ Use FFmpeg directly in your browser without any backend services!!
+
+
+
+
[Source Code](https://github.com/ffmpegjs/ffmpeg.js/blob/master/examples/browser/transcode.html)
---
diff --git a/src/createWorker.js b/src/createWorker.js
index a8469e1..8a4829b 100644
--- a/src/createWorker.js
+++ b/src/createWorker.js
@@ -1,6 +1,7 @@
const createJob = require('./createJob');
const { log } = require('./utils/log');
const getId = require('./utils/getId');
+const resolvePaths = require('./utils/resolvePaths');
const {
defaultOptions,
spawnWorker,
@@ -17,10 +18,10 @@ module.exports = (_options = {}) => {
const {
logger,
...options
- } = {
+ } = resolvePaths({
...defaultOptions,
..._options,
- };
+ });
const resolves = {};
const rejects = {};
let worker = spawnWorker(options);
diff --git a/src/utils/getEnvironment.js b/src/utils/getEnvironment.js
new file mode 100644
index 0000000..71b1c01
--- /dev/null
+++ b/src/utils/getEnvironment.js
@@ -0,0 +1,10 @@
+module.exports = (key) => {
+ const env = {
+ type: (typeof window !== 'undefined') && (typeof window.document !== 'undefined') ? 'browser' : 'node',
+ };
+
+ if (typeof key === 'undefined') {
+ return env;
+ }
+ return env[key];
+};
diff --git a/src/utils/resolvePaths.js b/src/utils/resolvePaths.js
new file mode 100644
index 0000000..93be72f
--- /dev/null
+++ b/src/utils/resolvePaths.js
@@ -0,0 +1,12 @@
+const isBrowser = require('./getEnvironment')('type') === 'browser';
+const resolveURL = isBrowser ? require('resolve-url') : s => s; // eslint-disable-line
+
+module.exports = (options) => {
+ const opts = { ...options };
+ ['corePath', 'workerPath'].forEach((key) => {
+ if (typeof options[key] !== 'undefined') {
+ opts[key] = resolveURL(opts[key]);
+ }
+ });
+ return opts;
+};
diff --git a/src/worker/browser/defaultOptions.js b/src/worker/browser/defaultOptions.js
index 55146c0..61bd237 100644
--- a/src/worker/browser/defaultOptions.js
+++ b/src/worker/browser/defaultOptions.js
@@ -11,4 +11,5 @@ module.exports = {
? resolveURL(`/dist/worker.dev.js?nocache=${Math.random().toString(36).slice(3)}`)
: `https://unpkg.com/@ffmpeg/ffmpeg@v${version}/dist/worker.min.js`,
corePath: `https://unpkg.com/@ffmpeg/core@v${dependencies['@ffmpeg/core'].substring(1)}/ffmpeg-core.js`,
+ workerBlobURL: true,
};
diff --git a/src/worker/browser/spawnWorker.js b/src/worker/browser/spawnWorker.js
index 5604aa4..4344f8a 100644
--- a/src/worker/browser/spawnWorker.js
+++ b/src/worker/browser/spawnWorker.js
@@ -5,6 +5,16 @@
* @function create a new Worker in browser
* @access public
*/
-module.exports = ({ workerPath }) => (
- new Worker(workerPath)
-);
+module.exports = ({ workerPath, workerBlobURL }) => {
+ let worker;
+ if (Blob && URL && workerBlobURL) {
+ /* Use Blob to load cross domain worker script */
+ const blob = new Blob([`importScripts("${workerPath}");`], {
+ type: 'application/javascript',
+ });
+ worker = new Worker(URL.createObjectURL(blob));
+ } else {
+ worker = new Worker(workerPath);
+ }
+ return worker;
+};