1 | var fs = require("fs")
|
2 | , url = require("url")
|
3 | , join = require("path").join
|
4 | , EventEmitter = require("events").EventEmitter
|
5 | , authom = module.exports = new EventEmitter
|
6 |
|
7 | authom.servers = {}
|
8 | authom.customServices = {}
|
9 | authom.route = /^\/auth\/([^\/]+)\/?$/
|
10 |
|
11 | authom.createServer = function(options, listener) {
|
12 | var service = options.service
|
13 | , name = options.name || service
|
14 | , path = join(__dirname, "services", service)
|
15 | , Service
|
16 | , server
|
17 |
|
18 | if (!(Service = authom.customServices[name])) {
|
19 | try { Service = require(path) }
|
20 | catch (err) { throw "No such service: " + path }
|
21 | }
|
22 |
|
23 | server = authom.servers[name] = new Service(options)
|
24 |
|
25 | server.on("auth", function(req, res, user) {
|
26 | user.service = name
|
27 | authom.emit("auth", req, res, user)
|
28 | })
|
29 |
|
30 | server.on("error", function(req, res, error) {
|
31 | error.service = name
|
32 | authom.emit("error", req, res, error)
|
33 | })
|
34 |
|
35 | if (listener) server.on("request", listener)
|
36 |
|
37 | return server
|
38 | }
|
39 |
|
40 | authom.registerService = function(serviceName, Service) {
|
41 | authom.customServices[serviceName] = Service
|
42 | }
|
43 |
|
44 | authom.listener = function(req, res) {
|
45 | var path = url.parse(req.url).pathname
|
46 | , match = path.match(authom.route)
|
47 | , service = match && authom.servers[match[1]]
|
48 |
|
49 | if (service) {
|
50 | service.emit("request", req, res)
|
51 | return true
|
52 | }
|
53 | }
|
54 |
|
55 | authom.listen = function(server) {
|
56 | var listeners = server.listeners("request")
|
57 |
|
58 | server.removeAllListeners("request")
|
59 |
|
60 | server.on("request", function(req, res) {
|
61 | if (authom.listener(req, res)) return
|
62 |
|
63 | listeners.forEach(function(listener) {
|
64 | listener.call(server, req, res)
|
65 | })
|
66 | })
|
67 | }
|
68 |
|
69 | authom.app = function(req, res) {
|
70 | var name = req.params.service
|
71 | , server = authom.servers[name]
|
72 |
|
73 | server.emit("request", req, res)
|
74 | } |
\ | No newline at end of file |