Skip to content

Instantly share code, notes, and snippets.

@chrisdickinson
Created February 16, 2013 16:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chrisdickinson/5f637d50610e4e070fdc to your computer and use it in GitHub Desktop.
Save chrisdickinson/5f637d50610e4e070fdc to your computer and use it in GitHub Desktop.
module.exports = worker
var prelude = require('./prelude')
, path = require('path')
, cache = {}
, make_blob
, make_url
switch(true) {
case typeof Blob !== 'undefined':
make_blob = function(data) {
return new Blob([data], {'type': 'text/javascript'})
}
break
case typeof BlobBuilder !== 'undefined':
make_blob = builder(BlobBuilder)
break
case typeof MSBlobBuilder !== 'undefined':
make_blob = builder(MSBlobBuidler)
break
case typeof MozBlobBuilder !== 'undefined':
make_blob = builder(MozBlobBuidler)
break
case typeof WebKitBlobBuilder !== 'undefined':
make_blob = builder(WebKitBlobBuilder)
break
}
switch(true) {
case typeof URL !== 'undefined' && !!URL.createObjectURL:
make_url = urler(URL)
break
case typeof webkitURL !== 'undefined' && !!webkitURL.createObjectURL:
make_url = urler(webkitURL)
break
case typeof msURL !== 'undefined' && !!msURL.createObjectURL:
make_url = urler(msURL)
break
case typeof MozURL !== 'undefined' && !!MozURL.createObjectURL:
make_url = urler(MozURL)
break
}
function worker(fn, dir) {
if(typeof fn !== 'string') {
if(cache[dir] && cache[dir][0] === fn) {
return new Worker(cache[dir][1])
}
}
fn = fn+''
var src = make_src(fn, dir)
, blob = make_blob(src)
, url = make_url(blob)
, worker = new Worker(url)
cache[dir] = [fn, url]
return worker
}
function builder(type) {
return function(data) {
var bb = new type
bb.append(data)
return bb.getBlob('text/javascript')
}
}
function urler(type) {
return function(blob) {
return type.createObjectURL(blob)
}
}
function make_src(fn, dir) {
var src = [''+prelude.replace('$extensions', '{}')]
, entry = JSON.stringify(path.join(dir, 'worker.js'))
for(var key in require.modules) {
src.push('require.define('+JSON.stringify(key)+', '+require.modules[key].source+');')
}
src.push('require.define('+entry+', '+
'function(require,module,exports,__dirname,__filename,process,global) { !'+fn+'() });'+
'require('+entry+');')
return src.join('')
}
module.exports="var require = function (file, cwd) {\n var resolved = require.resolve(file, cwd || '/');\n var mod = require.modules[resolved];\n if (!mod) throw new Error(\n 'Failed to resolve module ' + file + ', tried ' + resolved\n );\n var cached = require.cache[resolved];\n var res = cached? cached.exports : mod();\n return res;\n};\n\nrequire.paths = [];\nrequire.modules = {};\nrequire.cache = {};\nrequire.extensions = $extensions;\n\nrequire._core = {\n 'assert': true,\n 'events': true,\n 'fs': true,\n 'path': true,\n 'vm': true\n};\n\nrequire.resolve = (function () {\n return function (x, cwd) {\n if (!cwd) cwd = '/';\n \n if (require._core[x]) return x;\n var path = require.modules.path();\n cwd = path.resolve('/', cwd);\n var y = cwd || '/';\n \n if (x.match(/^(?:\\.\\.?\\/|\\/)/)) {\n var m = loadAsFileSync(path.resolve(y, x))\n || loadAsDirectorySync(path.resolve(y, x));\n if (m) return m;\n }\n \n var n = loadNodeModulesSync(x, y);\n if (n) return n;\n \n throw new Error(\"Cannot find module '\" + x + \"'\");\n \n function loadAsFileSync (x) {\n x = path.normalize(x);\n if (require.modules[x]) {\n return x;\n }\n \n for (var i = 0; i < require.extensions.length; i++) {\n var ext = require.extensions[i];\n if (require.modules[x + ext]) return x + ext;\n }\n }\n \n function loadAsDirectorySync (x) {\n x = x.replace(/\\/+$/, '');\n var pkgfile = path.normalize(x + '/package.json');\n if (require.modules[pkgfile]) {\n var pkg = require.modules[pkgfile]();\n var b = pkg.browserify;\n if (typeof b === 'object' && b.main) {\n var m = loadAsFileSync(path.resolve(x, b.main));\n if (m) return m;\n }\n else if (typeof b === 'string') {\n var m = loadAsFileSync(path.resolve(x, b));\n if (m) return m;\n }\n else if (pkg.main) {\n var m = loadAsFileSync(path.resolve(x, pkg.main));\n if (m) return m;\n }\n }\n \n return loadAsFileSync(x + '/index');\n }\n \n function loadNodeModulesSync (x, start) {\n var dirs = nodeModulesPathsSync(start);\n for (var i = 0; i < dirs.length; i++) {\n var dir = dirs[i];\n var m = loadAsFileSync(dir + '/' + x);\n if (m) return m;\n var n = loadAsDirectorySync(dir + '/' + x);\n if (n) return n;\n }\n \n var m = loadAsFileSync(x);\n if (m) return m;\n }\n \n function nodeModulesPathsSync (start) {\n var parts;\n if (start === '/') parts = [ '' ];\n else parts = path.normalize(start).split('/');\n \n var dirs = [];\n for (var i = parts.length - 1; i >= 0; i--) {\n if (parts[i] === 'node_modules') continue;\n var dir = parts.slice(0, i + 1).join('/') + '/node_modules';\n dirs.push(dir);\n }\n \n return dirs;\n }\n };\n})();\n\nrequire.alias = function (from, to) {\n var path = require.modules.path();\n var res = null;\n try {\n res = require.resolve(from + '/package.json', '/');\n }\n catch (err) {\n res = require.resolve(from, '/');\n }\n var basedir = path.dirname(res);\n \n var keys = (Object.keys || function (obj) {\n var res = [];\n for (var key in obj) res.push(key);\n return res;\n })(require.modules);\n \n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (key.slice(0, basedir.length + 1) === basedir + '/') {\n var f = key.slice(basedir.length);\n require.modules[to + f] = require.modules[basedir + f];\n }\n else if (key === basedir) {\n require.modules[to] = require.modules[basedir];\n }\n }\n};\n\n(function () {\n var process = {};\n var global = typeof window !== 'undefined' ? window : {};\n var definedProcess = false;\n \n require.define = function (filename, fn) {\n if (!definedProcess && require.modules.__browserify_process) {\n process = require.modules.__browserify_process();\n definedProcess = true;\n }\n \n var dirname = require._core[filename]\n ? ''\n : require.modules.path().dirname(filename)\n ;\n \n var require_ = function (file) {\n var requiredModule = require(file, dirname);\n var cached = require.cache[require.resolve(file, dirname)];\n\n if (cached && cached.parent === null) {\n cached.parent = module_;\n }\n\n return requiredModule;\n };\n require_.resolve = function (name) {\n return require.resolve(name, dirname);\n };\n require_.modules = require.modules;\n require_.define = require.define;\n require_.cache = require.cache;\n var module_ = {\n id : filename,\n filename: filename,\n exports : {},\n loaded : false,\n parent: null\n };\n \n require.modules[filename] = function () {\n require.cache[filename] = module_;\n fn.call(\n module_.exports,\n require_,\n module_,\n module_.exports,\n dirname,\n filename,\n process,\n global\n );\n module_.loaded = true;\n return module_.exports;\n };\n };\n})();\n"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment