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!!

+ +codepen + + [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; +};