-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfsjs.js
More file actions
72 lines (72 loc) · 2.33 KB
/
fsjs.js
File metadata and controls
72 lines (72 loc) · 2.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
var http = require('http')
, path = require('path')
, fs = require('fs')
, url = require('url')
, dir = path.dirname(require.main.filename)
, requireFile = function(name,callback){
if (name != require.main.filename) {
if (require.cache[name]) delete require.cache[name]
try {
require(name)
console.log('Requiring '+name)
}
catch (e) {
if (path.extname(name) === '.js') console.log('Error requiring '+name)
}
}
if (callback) callback()
}
, requireDir = function(callback){
fs.readdir(dir,function(e,files){
if (!e) files.forEach(function(filename,filenumber){
requireFile(path.resolve(dir,filename),function(){
if (filenumber === files.length-1) callback()
})
})
})
}
, watchDir = function(callback){
fs.watch(dir,function(event,filename){
requireFile(path.resolve(dir,filename))
})
}
module.exports = function(port){
var args = Array.prototype.slice.call(arguments)
watchDir(function(){
requireDir(function(){
http.createServer(function(req,res){
var urlparts = url.parse(req.url).pathname.split('/').slice(1)
, method = req.method.toLowerCase()
, defaultCallback = function(data){
if (typeof data === 'string') res.write(data)
else {
res.writeHead(200,{'Content-Type':'application/json'})
res.write(JSON.stringify(data))
}
res.end()
}
if (typeof args[args.length-1]==='function') callback = function(data){
args[args.length-1](data,defaultCallback)
}
else callback = defaultCallback
if (urlparts[urlparts.length-1]==='') urlparts.pop()
args.slice(1).forEach(function(arg){
if (!urlparts.length) return
if (require.cache[path.resolve(dir,urlparts[0]+'.js')]) return
if (typeof arg !== 'string') return
this[arg] = urlparts.shift()
})
this.request = req
this.response = res
var modu = require.cache[path.resolve(dir,urlparts[0]+'.js')]
if (modu && modu.exports[method]) {
modu.exports[method].apply(this,urlparts.slice(1).concat([callback]))
}
else if (require.main.exports[method]) {
require.main.exports[method].apply(this,urlparts.concat([callback]))
}
else callback('oops')
})
}).listen(port)
})
}