forked from jhs/probe_couchdb
-
Notifications
You must be signed in to change notification settings - Fork 1
/
emitter.js
120 lines (95 loc) · 3.43 KB
/
emitter.js
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
// Core routines for event emitters
//
// Copyright 2011 Iris Couch
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
require('defaultable')(module,
{ 'http_proxy': process.env.http_proxy
, 'log_label' : 'probe_couchdb'
}, function(module, exports, DEFS, require) {
var lib = require('./lib')
, util = require('util')
, events = require('events')
, request = require('request')
;
module.exports = { "Emitter" : Emitter
};
function Emitter (log_label) {
var self = this;
events.EventEmitter.call(self);
self.log = lib.getLogger(log_label)
// Callbacks can register for "known" states either before or after the information
// actually becomes known. If before, they will queue up until it is known, then run
// in order. Susequent "known" calls will call back immediately.
self.known_state = {};
} // Emitter
util.inherits(Emitter, events.EventEmitter);
Emitter.prototype.request = function request_wrapper(opts, callback) {
var self = this;
if(typeof opts == 'string')
opts = {uri:opts};
opts.proxy = opts.proxy || self.proxy || DEFS.http_proxy;
opts.client = opts.client || self.client;
opts.followRedirect = false;
opts.rejectUnauthorized = DEFS.strict_ssl
opts.headers = opts.headers || {};
opts.headers.accept = opts.headers.accept || 'application/json';
//opts.headers.Connection = opts.headers.Connection || 'keep-alive';
if(opts.method && opts.method !== "GET" && opts.method !== "HEAD")
opts.headers['content-type'] = 'application/json';
return request.apply(self, [opts, json_body]);
function json_body(er, resp, body) {
if(!er) {
try { body = JSON.parse(body) }
catch(e) { er = e }
}
// TODO: Maybe set self.client = resp.client?
return callback && callback.apply(this, [er, resp, body]);
}
}
Emitter.prototype.known = function on_known(name, cb, newval) {
var self = this;
if(!self.known_state[name])
self.known_state[name] = { known: false
, value: undefined
, callbacks: []
};
var state = self.known_state[name];
if(cb) {
// Fetch the value (either call back now, or register when it is known.
if(! state.known)
state.callbacks.push(cb)
else
return cb && cb.apply(self, [state.value]);
} else {
// Store the value, calling back any pending callbacks.
state.known = true;
state.value = newval;
state.callbacks.forEach(function(cb) {
cb && cb.apply(self, [newval]);
})
state.callbacks = [];
}
}
// If event A triggers event B, B should wait to emit until A is finished.
Emitter.prototype.x_emit = function push_emit() {
var self = this
, args = arguments;
process.nextTick(function() {
// Actually emit the event.
self.emit.apply(self, args)
// Also register that the value is known.
self.known(args[0], null, args[1]);
})
}
}) // defaultable