Source: general_util.js

1
/* global module, require, process, console */
2
3
/**
4
* @file        General utility functions not specific to EasyRTC
5
* @module      general_util
6
* @author      Priologic Software, info@easyrtc.com
7
* @copyright   Copyright 2016 Priologic Software. All rights reserved.
8
* @license     BSD v2, see LICENSE file in module root folder.
9
*/
10
11
var util = require("util");
12
13
/**
14
*  Object to hold EasyRTC General Utility methods and classes.
15
*
16
* @class
17
*/
18
var g = module.exports;
19
20
/**
21
* Performs a deep copy of an object, returning the duplicate.
22
* Do not use on objects with circular references.
23
*
24
* @param       {Object} input          Input variable (or object) to be copied.
25
* @returns     {Object}                New copy of variable.
26
*/
27
g.deepCopy = function(input) {
28
29
if (
30
input === null || input === undefined ||
31
typeof input !== "object" || 
32
(input.constructor !== Object && input.constructor !== Array)
33
) {
34
return input;
35
}
36
37
if (
38
input.constructor === Boolean || 
39
input.constructor === Date || 
40
input.constructor === Function || 
41
input.constructor === Number || 
42
input.constructor === RegExp || 
43
input.constructor === String
44
) {
45
return new input.constructor(input);
46
}
47
48
var copy;
49
if (input instanceof Array) {
50
copy = [];
51
for (var i = 0, len = input.length; i < len; i++) {
52
copy[i] = g.deepCopy(input[i]);
53
}
54
return copy;
55
}
56
57
if (input instanceof Object) {
58
copy = {};
59
for (var key in input) {
60
if (input.hasOwnProperty(key)) {
61
copy[key] = g.deepCopy(input[key]);
62
}
63
}
64
return copy;
65
}
66
return null;
67
};
68
69
70
/**
71
* Returns a field from the package.json file in the module root.
72
* Giving null field name will return the full contents of the file.
73
* If a field name is provided, it will return null if the field not found.
74
*
75
* @param       {Object} fieldName      Name of field you wish to return.
76
* @returns     {Object}                Value of the given field, or the full contents of the file if a null field is given.
77
*/
78
g.getPackageData = function(fieldName) {
79
var packageFile = require("../package");
80
if (!fieldName) {
81
return g.deepCopy(packageFile);
82
}
83
else if (packageFile[fieldName]) {
84
return g.deepCopy(packageFile[fieldName]);
85
}
86
else {
87
return null;
88
}
89
};
90
91
92
/* An abstract error object which should be easy to extend for custom Error classes.
93
*
94
* @copyright Based on code in article by Dustin Seno.
95
*
96
* @param   {String}    Custom error message.
97
* @param   {Object}    Constructor property.
98
*
99
*/
100
g.AbstractError = function(msg, constr){
101
Error.captureStackTrace(this, constr || this);
102
this.message = msg || "Error";
103
};
104
util.inherits(g.AbstractError, Error);
105
g.AbstractError.prototype.name = "Abstract Error";
106
107
108
/**
109
* Reads package.json and ensures all required modules are installed. Will exit if one or more is not found.
110
*/
111
g.checkModules = function () {
112
113
var easyrtcPackage;
114
115
try {
116
easyrtcPackage = require("../package");
117
}
118
catch( e ) {
119
console.log("ERROR: Could not load package.json from project root. This file is required for reading project properties.");
120
process.exit(1);
121
}
122
123
var moduleExists = function (modName) {
124
try { return require.resolve(modName); }
125
catch( e ) { return false; }
126
};
127
128
var isModuleMissing = false;
129
for (var key in easyrtcPackage.dependencies) {
130
if (!moduleExists(key)) {
131
isModuleMissing = true;
132
console.log("ERROR: Missing module '" + key + "'");
133
}
134
}
135
136
if (isModuleMissing) {
137
console.log("ERROR: Required modules are not installed. Run 'npm install' from command line.");
138
process.exit(1);
139
}
140
141
delete require.cache[easyrtcPackage];
142
};
143
144
145
/*
146
* Return a random string of characters
147
*
148
* @param {Integer} stringLength    Number of random characters the returned string should contain. Defaults to 16.
149
* @param {String}  chars           Available characters to use in a string. Defaults to [A-Za-z0-9]
150
* @returns {String}                Generated random string
151
*
152
*/
153
g.randomString = function(stringLength, chars){
154
var newString = "";
155
156
if (!chars) {
157
chars = "ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz0123456789";
158
}
159
160
if (!stringLength) {
161
stringLength = 16;
162
}
163
164
for (var i=0; i < stringLength; i=i+1) {
165
var randomNumber = Math.floor(Math.random() * chars.length);
166
newString += chars.substring(randomNumber, randomNumber + 1);
167
}
168
169
return newString;
170
};