]> git.r.bdr.sh - rbdr/cologne/blame - lib/cobalt.js
Makes the simple formatter useful
[rbdr/cologne] / lib / cobalt.js
CommitLineData
db6bc3cb
BB
1// Load up dependencies
2if (typeof require === 'function') {
3 require('neon');
4 var Microtime = require('microtime');
5}
6
7Cobalt = Module("Cobalt");
8Module(Cobalt, 'Logger')({});
9Module(Cobalt, 'Formatter')({});
10
11// Load up loggers + formatters
12if (typeof require === 'function') {
13 // Formatters
14 require('./formatters/token.js');
15
16 // Loggers
17 require('./loggers/console.js');
18 require('./loggers/socket.js');
19}
20
21Cobalt.now = function () {
22 if (typeof performance !== 'undefined' && performance.timing) {
23 return performance.timing.navigationStart + performance.now();
bdedb5e5
BB
24 }
25
db6bc3cb
BB
26 if (typeof Microtime !== 'undefined') {
27 return Microtime.nowDouble() * 1000;
bdedb5e5
BB
28 }
29
db6bc3cb
BB
30 return Date.now();
31}
71a808fe 32
db6bc3cb
BB
33// Stringify with circular dereference.
34Cobalt.stringify = function (object) {
35 var cache = [], stringified;
36 stringified = JSON.stringify(object, function (key, value) {
37 if (typeof value === 'object' && value !== null) {
38 if (cache.indexOf(value) !== -1) {
39 return "[Circular]";
40 }
41 cache.push(value);
71a808fe 42 }
db6bc3cb
BB
43 return value;
44 });
45 cache = null;
46
47 return stringified;
48}
49
50Class(Cobalt, 'Console')({
51 prototype : {
52 from : "Generic Cobalt Logger",
53 version : "0.1.0",
54 currentIndent : 0,
55 indentSize : 2,
56 loggers : [],
57 separatorLength : 120,
58 currentColor : "black",
59
60 // Initialize instance of cobalt console
61 // and extend configuration.
62 init : function (config) {
63 var co = this,
64 property;
65
66 if (config) {
67 for (property in config) {
68 co[property] = config[property];
aa1e9cff 69 }
aa1e9cff 70 }
db6bc3cb
BB
71 },
72
73 addLogger : function (logger) {
74 this.loggers.push(logger);
75 },
76
77 removeLogger : function (logger) {
78 var index;
79
80 index = this.loggers.indexOf(logger);
81 this.loggers.splice(index, 1);
82 },
83
84 // Builds a Cobalt Log Object
85 buildLog : function (item, level) {
86 var co = this, oldItem, logObject = {};
87
88 if (typeof item === "undefined" || item === null || !item._cobaltLog) {
89 logObject.message = item;
90 logObject._cobaltLog = true;
91 logObject._from = co.from;
92 logObject._level = level || 6;
93 logObject._levelString = co._levelString(logObject._level);
94 logObject._version = co.version;
95 logObject._timestamp = co.now();
96 logObject._indentLevel = co.currentIndent;
97 logObject._color = co.currentColor;
98 logObject._separator = false;
99 return logObject;
100 }
aa1e9cff 101
db6bc3cb
BB
102 if (item._cobaltLog) {
103 item._level = level || item._level || 6;
104 item._levelString = co._levelString(item._level);
105 }
bdedb5e5 106
db6bc3cb
BB
107 return item;
108 },
bdedb5e5 109
db6bc3cb
BB
110 extendLog : function (extendingObject) {
111 var co = this, logObject,
112 property;
f6cd3c16 113
db6bc3cb
BB
114 logObject = co.buildLog(undefined, 6);
115 extendingObject = extendingObject || {};
f6cd3c16 116
db6bc3cb
BB
117 for (property in extendingObject) {
118 if (extendingObject.hasOwnProperty(property)) {
119 logObject[property] = extendingObject[property];
f6cd3c16 120 }
db6bc3cb 121 }
f6cd3c16 122
db6bc3cb
BB
123 return logObject;
124 },
125
126 buildSeparator : function (type) {
127 var co = this;
128 return {
129 _cobaltLog : true,
130 _separator : true,
131 _version : co.version,
132 _timestamp : co.now(),
133 _separatorType : type,
134 _indentLevel : co.currentIndent,
135 _color : co.currentColor
136 }
137 },
71a808fe 138
db6bc3cb
BB
139 _log : function (severity) {
140 var co = this,
141 logString,
142 logObjectArray = [],
143 i, j;
bdedb5e5 144
db6bc3cb
BB
145 for (i = 1; i < arguments.length; i++) {
146 if (typeof arguments[i] === 'undefined') {
147 logObjectArray.push(co.buildLog("undefined", severity));
148 } else {
149 logObjectArray.push(co.buildLog(arguments[i], severity));
150 }
151 }
bdedb5e5 152
db6bc3cb
BB
153 for (j = 0; j < co.loggers.length; j++) {
154 co.loggers[j].log.apply(co.loggers[j], logObjectArray);
155 }
156 },
5c03d3b4 157
db6bc3cb
BB
158 log : function () {
159 this._log.apply(this, [6].concat(Array.prototype.slice.call(arguments)));
160 },
bdedb5e5 161
db6bc3cb
BB
162 debug : function () {
163 this._log.apply(this, [7].concat(Array.prototype.slice.call(arguments)));
164 },
bdedb5e5 165
db6bc3cb
BB
166 info : function () {
167 this._log.apply(this, [6].concat(Array.prototype.slice.call(arguments)));
168 },
bdedb5e5 169
db6bc3cb
BB
170 notice : function () {
171 this._log.apply(this, [5].concat(Array.prototype.slice.call(arguments)));
172 },
5c03d3b4 173
db6bc3cb
BB
174 warn : function () {
175 this._log.apply(this, [4].concat(Array.prototype.slice.call(arguments)));
176 },
5c03d3b4 177
db6bc3cb
BB
178 error : function () {
179 this._log.apply(this, [3].concat(Array.prototype.slice.call(arguments)));
180 },
5c03d3b4 181
db6bc3cb
BB
182 dir : function () {
183 },
5c03d3b4 184
db6bc3cb
BB
185 time : function () {
186 },
5c03d3b4 187
db6bc3cb
BB
188 timeEnd : function () {
189 },
bdedb5e5 190
db6bc3cb
BB
191 groupCollapsed : function () {
192 },
bdedb5e5 193
db6bc3cb
BB
194 groupEnd : function () {
195 },
bdedb5e5 196
db6bc3cb
BB
197 separator : function (type) {
198 var co = this;
bdedb5e5 199
db6bc3cb
BB
200 co._log(7, co.buildSeparator(type));
201 },
bdedb5e5 202
db6bc3cb
BB
203 space : function (lines) {
204 var co = this,
205 i;
bdedb5e5 206
db6bc3cb
BB
207 if (typeof lines === "undefined") {
208 lines = 1;
209 }
bdedb5e5 210
db6bc3cb
BB
211 for (i = 0; i < lines; i++) {
212 co.log(' ');
213 }
bdedb5e5 214
db6bc3cb
BB
215 return co;
216 },
bdedb5e5 217
db6bc3cb
BB
218 indent : function (callback) {
219 var co = this;
bdedb5e5 220
db6bc3cb
BB
221 if (typeof callback === "function") {
222 co.currentIndent = co.currentIndent + co.indentSize;
223 callback();
224 co.currentIndent = co.currentIndent - co.indentSize;
225 } else {
226 co.currentIndent = co.currentIndent + co.indentSize;
227 }
bdedb5e5 228
db6bc3cb
BB
229 return co;
230 },
bdedb5e5 231
db6bc3cb
BB
232 outdent : function (callback) {
233 var co = this;
bdedb5e5 234
db6bc3cb
BB
235 if (typeof callback === "function") {
236 co.currentIndent = co.currentIndent - co.indentSize;
237 if (co.currentIndent < 0) {
238 co.currentIndent = 0;
bdedb5e5
BB
239 }
240
db6bc3cb 241 callback();
bdedb5e5 242
db6bc3cb
BB
243 co.currentIndent = co.currentIndent + co.indentSize;
244 } else {
245 co.currentIndent = co.currentIndent - co.indentSize;
246 if (co.currentIndent < 0) {
247 co.currentIndent = 0;
bdedb5e5 248 }
db6bc3cb 249 }
bdedb5e5 250
db6bc3cb
BB
251 return co;
252 },
bdedb5e5 253
db6bc3cb
BB
254 color : function (color, callback) {
255 var co = this,
256 oldColor = co.currentColor;
adc1a8da 257
db6bc3cb
BB
258 if (typeof callback === "function") {
259 co.currentColor = color;
260 callback();
261 co.currentColor = oldColor;
262 } else {
263 co.currentColor = color;
264 }
adc1a8da 265
db6bc3cb
BB
266 return co;
267 },
268
269 // Returns the current time in microseconds.
270 now : function () {
271 if (typeof performance !== 'undefined' && performance.timing) {
272 return performance.timing.navigationStart + performance.now();
bdedb5e5 273 }
bdedb5e5 274
db6bc3cb
BB
275 if (typeof Microtime !== 'undefined') {
276 return Microtime.nowDouble() * 1000;
277 }
71a808fe 278
db6bc3cb
BB
279 return Date.now();
280 },
281
282 _levelString : function (level) {
283 switch(level) {
284 case 0:
285 return "PANIC";
286 break;
287 case 1:
288 return "ALERT"
289 break;
290 case 2:
291 return "CRIT"
292 break;
293 case 3:
294 return "ERROR"
295 break;
296 case 4:
297 return "WARN"
298 break;
299 case 5:
300 return "NOTICE"
301 break;
302 case 6:
303 return "INFO"
304 break;
305 case 7:
306 return "DEBUG"
307 break;
308 }
309 }
bdedb5e5 310 }
db6bc3cb 311});
bdedb5e5 312
db6bc3cb
BB
313if (Cobalt.Console.__objectSpy) {
314 Cobalt.Console.__objectSpy.destroy();
315}