leo-connector-common 5.0.0 → 5.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,330 +1,330 @@
1
- "use strict";
2
- const crypto = require('crypto');
3
- const base = require("./handler.js");
4
- const moment = require("moment");
5
- const logger = require("leo-logger")("leo-checksum.basic");
6
- const Stream = require('stream').Stream;
7
-
8
- function promisify(method, arity) {
9
- if (method.length > arity) {
10
- return function(...args) {
11
- return new Promise((resolve, reject) => {
12
- args.push((...args) => {
13
- if (args[0]) reject(args[0]);
14
- else resolve.apply(this, args.splice(1));
15
- });
16
- method.apply(this, args);
17
- });
18
- };
19
- } else {
20
- return method;
21
- }
22
- }
23
-
24
- function readArray(array) {
25
- let stream = new Stream(),
26
- i = 0,
27
- paused = false,
28
- ended = false;
29
-
30
- stream.readable = true;
31
- stream.writable = false;
32
-
33
- if (!Array.isArray(array))
34
- throw new Error('event-stream.read expects an array');
35
-
36
- stream.resume = function() {
37
- if (ended) return;
38
- paused = false;
39
- let l = array.length;
40
- while (i < l && !paused && !ended) {
41
- stream.emit('data', array[i++]);
42
- }
43
- if (i == l && !ended)
44
- ended = true, stream.readable = false, stream.emit('end');
45
- };
46
- process.nextTick(stream.resume);
47
- stream.pause = function() {
48
- paused = true;
49
- };
50
- stream.destroy = function() {
51
- ended = true;
52
- stream.emit('close');
53
- };
54
- return stream;
55
- }
56
-
57
- function buildKeys(settings) {
58
- return Array.isArray(settings.fields) ? () => settings.fields : Object.keys;
59
- }
60
- module.exports = function(opts) {
61
-
62
- opts = Object.assign({
63
- batch: () => {
64
- return Promise.reject("Batch Not Implemented");
65
- },
66
- individual: () => {
67
- return Promise.reject("Individual Not Implemented");
68
- },
69
- sample: () => {
70
- return Promise.reject("Sample Not Implemented");
71
- },
72
- nibble: () => {
73
- return Promise.reject("Nibble Not Implemented");
74
- },
75
- range: () => {
76
- return Promise.reject("Range Not Implemented");
77
- },
78
- initialize: () => {
79
- return Promise.resolve({});
80
- },
81
- destroy: () => {
82
- return Promise.resolve({});
83
- },
84
- delete: () => {
85
- return Promise.reject("Delete Not Implemented");
86
- }
87
- }, opts);
88
-
89
- let wrap = opts.wrap || ((handler, base) => {
90
- return function(event, callback) {
91
- base(event, handler, callback);
92
- };
93
- });
94
- return base({
95
- batch: wrap(opts.batch, batch),
96
- individual: wrap(opts.individual, individual),
97
- sample: wrap(opts.sample, sample),
98
- nibble: wrap(opts.nibble, nibble),
99
- range: wrap(opts.range, range),
100
- initialize: wrap(opts.initialize, initialize),
101
- destroy: wrap(opts.destroy, destroy),
102
- delete: wrap(opts.delete, deleteFn)
103
- });
104
-
105
- function batch(event, handler, callback) {
106
- logger.log("Calling Batch", event);
107
-
108
- let startTime = moment.now();
109
- let data = event.data;
110
-
111
- promisify(handler, 2).call({
112
- settings: event.settings,
113
- session: event.session
114
- }, data.start, data.end).then(stream => {
115
- if (!Array.isArray(stream) && stream.hash) {
116
- return callback(null, {
117
- qty: stream.qty,
118
- ids: data.ids,
119
- start: data.start,
120
- end: data.end,
121
- hash: stream.hash
122
- });
123
- }
124
-
125
- let ObjectKeys = buildKeys(event.settings);
126
- stream = Array.isArray(stream) ? readArray(stream) : stream;
127
-
128
- let result = {
129
- qty: 0,
130
- ids: data.ids,
131
- start: data.start,
132
- end: data.end,
133
- hash: [0, 0, 0, 0]
134
- };
135
-
136
- stream.on("end", () => {
137
- result.duration = moment.now() - startTime;
138
- callback(null, result);
139
- }).on("error", (err) => {
140
- logger.log("Batch On Error", err);
141
- callback(err);
142
- }).on("data", (obj) => {
143
- let allFields = "";
144
- ObjectKeys(obj).forEach(key => {
145
- let value = obj[key];
146
- if (value instanceof Date) {
147
- allFields += crypto.createHash('md5').update(Math.round(value.getTime() / 1000).toString()).digest('hex');
148
- } else if (value !== null && value !== undefined && value.toString) {
149
- allFields += crypto.createHash('md5').update(value.toString()).digest('hex');
150
- } else {
151
- allFields += " ";
152
- }
153
- });
154
-
155
- let hash = crypto.createHash('md5').update(allFields).digest();
156
-
157
- result.hash[0] += hash.readUInt32BE(0);
158
- result.hash[1] += hash.readUInt32BE(4);
159
- result.hash[2] += hash.readUInt32BE(8);
160
- result.hash[3] += hash.readUInt32BE(12);
161
- result.qty += 1;
162
- });
163
- }).catch(callback);
164
- }
165
-
166
- function individual(event, handler, callback) {
167
- logger.log("Calling Individual", event);
168
- let startTime = moment.now();
169
- let data = event.data;
170
- promisify(handler, 2).call({
171
- settings: event.settings,
172
- session: event.session
173
- }, data.start, data.end).then(stream => {
174
- if (!Array.isArray(stream) && stream.checksums) {
175
- return callback(null, {
176
- ids: data.ids,
177
- start: data.start,
178
- end: data.end,
179
- qty: stream.qty,
180
- checksums: stream.checksums
181
- });
182
- }
183
-
184
- let ObjectKeys = buildKeys(event.settings);
185
- stream = Array.isArray(stream) ? readArray(stream) : stream;
186
- let results = {
187
- ids: data.ids,
188
- start: data.start,
189
- end: data.end,
190
- qty: 0,
191
- checksums: []
192
- };
193
- stream.on("end", () => {
194
- results.duration = moment.now() - startTime;
195
- callback(null, results);
196
- }).on("error", (err) => {
197
- logger.log("Individual On Error", err);
198
- callback(err);
199
- }).on("data", (obj) => {
200
- let allFields = "";
201
-
202
- ObjectKeys(obj).forEach(key => {
203
- let value = obj[key];
204
- if (value instanceof Date) {
205
- allFields += crypto.createHash('md5').update(Math.round(value.getTime() / 1000).toString()).digest('hex');
206
- } else if (value !== null && value !== undefined && value.toString) {
207
- allFields += crypto.createHash('md5').update(value.toString()).digest('hex');
208
- } else {
209
- allFields += " ";
210
- }
211
- });
212
- let hash = crypto.createHash('md5').update(allFields).digest('hex');
213
- results.checksums.push({
214
- id: obj[event.settings.id_column],
215
- _id: event.settings._id_column ? obj[event.settings._id_column] : undefined,
216
- hash: hash
217
- });
218
- results.qty += 1;
219
- });
220
-
221
- }).catch(callback);
222
- }
223
-
224
- function sample(event, handler, callback) {
225
- logger.log("Calling Sample", event);
226
- let data = event.data;
227
-
228
- promisify(handler, 1).call({
229
- settings: event.settings,
230
- session: event.session
231
- }, data.ids).then(stream => {
232
- if (!Array.isArray(stream) && stream.checksums) {
233
- return callback(null, {
234
- ids: data.ids,
235
- start: data.start,
236
- end: data.end,
237
- qty: stream.qty,
238
- checksums: stream.checksums
239
- });
240
- }
241
-
242
- let ObjectKeys = buildKeys(event.settings);
243
- stream = Array.isArray(stream) ? readArray(stream) : stream;
244
-
245
- let results = {
246
- qty: 0,
247
- ids: [],
248
- start: data.start,
249
- end: data.end,
250
- checksums: []
251
- };
252
-
253
- stream.on("end", function() {
254
- callback(null, results);
255
- }).on("err", function(err) {
256
- logger.log("error");
257
- throw err;
258
- }).on("data", function(obj) {
259
- let out = [];
260
- ObjectKeys(obj).forEach(key => {
261
- let value = obj[key];
262
- if (value instanceof Date) {
263
- out.push(Math.round(value.getTime() / 1000) + " " + moment(value).utc().format());
264
- } else if (value && typeof value == "object" && value.toHexString) {
265
- out.push(value.toString());
266
- } else {
267
- out.push(value);
268
- }
269
- });
270
-
271
- results.ids.push(obj[event.settings.id_column]);
272
- results.checksums.push(out);
273
- results.qty += 1;
274
- });
275
-
276
- }).catch(callback);
277
- }
278
-
279
- function range(event, handler, callback) {
280
- logger.log("Calling Range", event);
281
-
282
- let data = event.data;
283
- promisify(handler, 2).call({
284
- settings: event.settings,
285
- session: event.session
286
- }, data.start, data.end).then(data => {
287
- callback(null, data);
288
- }).catch(callback);
289
- }
290
-
291
- function nibble(event, handler, callback) {
292
- logger.log("Calling Nibble", event);
293
-
294
- let data = event.data;
295
- promisify(handler, 4).call({
296
- settings: event.settings,
297
- session: event.session
298
- }, data.start, data.end, data.limit, data.reverse).then(data => {
299
- callback(null, Object.assign({
300
- current: null,
301
- next: null
302
- }, data));
303
- }).catch(callback);
304
- }
305
-
306
- function initialize(event, handler, callback) {
307
- logger.log("Calling Initialize", event);
308
- promisify(handler, 1).call({
309
- settings: event.settings,
310
- session: event.session
311
- }, event.data).then(data => callback(null, data)).catch(callback);
312
- }
313
-
314
- function destroy(event, handler, callback) {
315
- logger.log("Calling Destroy", event);
316
- promisify(handler, 1).call({
317
- settings: event.settings,
318
- session: event.session
319
- }, event.data).then(() => callback()).catch(callback);
320
- }
321
-
322
- function deleteFn(event, handler, callback) {
323
- logger.log("Calling Delete", event);
324
- promisify(handler, 1).call({
325
- settings: event.settings,
326
- session: event.session,
327
- ...event.data
328
- }, event.data.ids).then(() => callback()).catch(callback);
329
- }
330
- };
1
+ "use strict";
2
+ const crypto = require('crypto');
3
+ const base = require("./handler.js");
4
+ const moment = require("moment");
5
+ const logger = require("leo-logger")("leo-checksum.basic");
6
+ const Stream = require('stream').Stream;
7
+
8
+ function promisify(method, arity) {
9
+ if (method.length > arity) {
10
+ return function(...args) {
11
+ return new Promise((resolve, reject) => {
12
+ args.push((...args) => {
13
+ if (args[0]) reject(args[0]);
14
+ else resolve.apply(this, args.splice(1));
15
+ });
16
+ method.apply(this, args);
17
+ });
18
+ };
19
+ } else {
20
+ return method;
21
+ }
22
+ }
23
+
24
+ function readArray(array) {
25
+ let stream = new Stream(),
26
+ i = 0,
27
+ paused = false,
28
+ ended = false;
29
+
30
+ stream.readable = true;
31
+ stream.writable = false;
32
+
33
+ if (!Array.isArray(array))
34
+ throw new Error('event-stream.read expects an array');
35
+
36
+ stream.resume = function() {
37
+ if (ended) return;
38
+ paused = false;
39
+ let l = array.length;
40
+ while (i < l && !paused && !ended) {
41
+ stream.emit('data', array[i++]);
42
+ }
43
+ if (i == l && !ended)
44
+ ended = true, stream.readable = false, stream.emit('end');
45
+ };
46
+ process.nextTick(stream.resume);
47
+ stream.pause = function() {
48
+ paused = true;
49
+ };
50
+ stream.destroy = function() {
51
+ ended = true;
52
+ stream.emit('close');
53
+ };
54
+ return stream;
55
+ }
56
+
57
+ function buildKeys(settings) {
58
+ return Array.isArray(settings.fields) ? () => settings.fields : Object.keys;
59
+ }
60
+ module.exports = function(opts) {
61
+
62
+ opts = Object.assign({
63
+ batch: () => {
64
+ return Promise.reject("Batch Not Implemented");
65
+ },
66
+ individual: () => {
67
+ return Promise.reject("Individual Not Implemented");
68
+ },
69
+ sample: () => {
70
+ return Promise.reject("Sample Not Implemented");
71
+ },
72
+ nibble: () => {
73
+ return Promise.reject("Nibble Not Implemented");
74
+ },
75
+ range: () => {
76
+ return Promise.reject("Range Not Implemented");
77
+ },
78
+ initialize: () => {
79
+ return Promise.resolve({});
80
+ },
81
+ destroy: () => {
82
+ return Promise.resolve({});
83
+ },
84
+ delete: () => {
85
+ return Promise.reject("Delete Not Implemented");
86
+ }
87
+ }, opts);
88
+
89
+ let wrap = opts.wrap || ((handler, base) => {
90
+ return function(event, callback) {
91
+ base(event, handler, callback);
92
+ };
93
+ });
94
+ return base({
95
+ batch: wrap(opts.batch, batch),
96
+ individual: wrap(opts.individual, individual),
97
+ sample: wrap(opts.sample, sample),
98
+ nibble: wrap(opts.nibble, nibble),
99
+ range: wrap(opts.range, range),
100
+ initialize: wrap(opts.initialize, initialize),
101
+ destroy: wrap(opts.destroy, destroy),
102
+ delete: wrap(opts.delete, deleteFn)
103
+ });
104
+
105
+ function batch(event, handler, callback) {
106
+ logger.log("Calling Batch", event);
107
+
108
+ let startTime = moment.now();
109
+ let data = event.data;
110
+
111
+ promisify(handler, 2).call({
112
+ settings: event.settings,
113
+ session: event.session
114
+ }, data.start, data.end).then(stream => {
115
+ if (!Array.isArray(stream) && stream.hash) {
116
+ return callback(null, {
117
+ qty: stream.qty,
118
+ ids: data.ids,
119
+ start: data.start,
120
+ end: data.end,
121
+ hash: stream.hash
122
+ });
123
+ }
124
+
125
+ let ObjectKeys = buildKeys(event.settings);
126
+ stream = Array.isArray(stream) ? readArray(stream) : stream;
127
+
128
+ let result = {
129
+ qty: 0,
130
+ ids: data.ids,
131
+ start: data.start,
132
+ end: data.end,
133
+ hash: [0, 0, 0, 0]
134
+ };
135
+
136
+ stream.on("end", () => {
137
+ result.duration = moment.now() - startTime;
138
+ callback(null, result);
139
+ }).on("error", (err) => {
140
+ logger.log("Batch On Error", err);
141
+ callback(err);
142
+ }).on("data", (obj) => {
143
+ let allFields = "";
144
+ ObjectKeys(obj).forEach(key => {
145
+ let value = obj[key];
146
+ if (value instanceof Date) {
147
+ allFields += crypto.createHash('md5').update(Math.round(value.getTime() / 1000).toString()).digest('hex');
148
+ } else if (value !== null && value !== undefined && value.toString) {
149
+ allFields += crypto.createHash('md5').update(value.toString()).digest('hex');
150
+ } else {
151
+ allFields += " ";
152
+ }
153
+ });
154
+
155
+ let hash = crypto.createHash('md5').update(allFields).digest();
156
+
157
+ result.hash[0] += hash.readUInt32BE(0);
158
+ result.hash[1] += hash.readUInt32BE(4);
159
+ result.hash[2] += hash.readUInt32BE(8);
160
+ result.hash[3] += hash.readUInt32BE(12);
161
+ result.qty += 1;
162
+ });
163
+ }).catch(callback);
164
+ }
165
+
166
+ function individual(event, handler, callback) {
167
+ logger.log("Calling Individual", event);
168
+ let startTime = moment.now();
169
+ let data = event.data;
170
+ promisify(handler, 2).call({
171
+ settings: event.settings,
172
+ session: event.session
173
+ }, data.start, data.end).then(stream => {
174
+ if (!Array.isArray(stream) && stream.checksums) {
175
+ return callback(null, {
176
+ ids: data.ids,
177
+ start: data.start,
178
+ end: data.end,
179
+ qty: stream.qty,
180
+ checksums: stream.checksums
181
+ });
182
+ }
183
+
184
+ let ObjectKeys = buildKeys(event.settings);
185
+ stream = Array.isArray(stream) ? readArray(stream) : stream;
186
+ let results = {
187
+ ids: data.ids,
188
+ start: data.start,
189
+ end: data.end,
190
+ qty: 0,
191
+ checksums: []
192
+ };
193
+ stream.on("end", () => {
194
+ results.duration = moment.now() - startTime;
195
+ callback(null, results);
196
+ }).on("error", (err) => {
197
+ logger.log("Individual On Error", err);
198
+ callback(err);
199
+ }).on("data", (obj) => {
200
+ let allFields = "";
201
+
202
+ ObjectKeys(obj).forEach(key => {
203
+ let value = obj[key];
204
+ if (value instanceof Date) {
205
+ allFields += crypto.createHash('md5').update(Math.round(value.getTime() / 1000).toString()).digest('hex');
206
+ } else if (value !== null && value !== undefined && value.toString) {
207
+ allFields += crypto.createHash('md5').update(value.toString()).digest('hex');
208
+ } else {
209
+ allFields += " ";
210
+ }
211
+ });
212
+ let hash = crypto.createHash('md5').update(allFields).digest('hex');
213
+ results.checksums.push({
214
+ id: obj[event.settings.id_column],
215
+ _id: event.settings._id_column ? obj[event.settings._id_column] : undefined,
216
+ hash: hash
217
+ });
218
+ results.qty += 1;
219
+ });
220
+
221
+ }).catch(callback);
222
+ }
223
+
224
+ function sample(event, handler, callback) {
225
+ logger.log("Calling Sample", event);
226
+ let data = event.data;
227
+
228
+ promisify(handler, 1).call({
229
+ settings: event.settings,
230
+ session: event.session
231
+ }, data.ids).then(stream => {
232
+ if (!Array.isArray(stream) && stream.checksums) {
233
+ return callback(null, {
234
+ ids: data.ids,
235
+ start: data.start,
236
+ end: data.end,
237
+ qty: stream.qty,
238
+ checksums: stream.checksums
239
+ });
240
+ }
241
+
242
+ let ObjectKeys = buildKeys(event.settings);
243
+ stream = Array.isArray(stream) ? readArray(stream) : stream;
244
+
245
+ let results = {
246
+ qty: 0,
247
+ ids: [],
248
+ start: data.start,
249
+ end: data.end,
250
+ checksums: []
251
+ };
252
+
253
+ stream.on("end", function() {
254
+ callback(null, results);
255
+ }).on("err", function(err) {
256
+ logger.log("error");
257
+ throw err;
258
+ }).on("data", function(obj) {
259
+ let out = [];
260
+ ObjectKeys(obj).forEach(key => {
261
+ let value = obj[key];
262
+ if (value instanceof Date) {
263
+ out.push(Math.round(value.getTime() / 1000) + " " + moment(value).utc().format());
264
+ } else if (value && typeof value == "object" && value.toHexString) {
265
+ out.push(value.toString());
266
+ } else {
267
+ out.push(value);
268
+ }
269
+ });
270
+
271
+ results.ids.push(obj[event.settings.id_column]);
272
+ results.checksums.push(out);
273
+ results.qty += 1;
274
+ });
275
+
276
+ }).catch(callback);
277
+ }
278
+
279
+ function range(event, handler, callback) {
280
+ logger.log("Calling Range", event);
281
+
282
+ let data = event.data;
283
+ promisify(handler, 2).call({
284
+ settings: event.settings,
285
+ session: event.session
286
+ }, data.start, data.end).then(data => {
287
+ callback(null, data);
288
+ }).catch(callback);
289
+ }
290
+
291
+ function nibble(event, handler, callback) {
292
+ logger.log("Calling Nibble", event);
293
+
294
+ let data = event.data;
295
+ promisify(handler, 4).call({
296
+ settings: event.settings,
297
+ session: event.session
298
+ }, data.start, data.end, data.limit, data.reverse).then(data => {
299
+ callback(null, Object.assign({
300
+ current: null,
301
+ next: null
302
+ }, data));
303
+ }).catch(callback);
304
+ }
305
+
306
+ function initialize(event, handler, callback) {
307
+ logger.log("Calling Initialize", event);
308
+ promisify(handler, 1).call({
309
+ settings: event.settings,
310
+ session: event.session
311
+ }, event.data).then(data => callback(null, data)).catch(callback);
312
+ }
313
+
314
+ function destroy(event, handler, callback) {
315
+ logger.log("Calling Destroy", event);
316
+ promisify(handler, 1).call({
317
+ settings: event.settings,
318
+ session: event.session
319
+ }, event.data).then(() => callback()).catch(callback);
320
+ }
321
+
322
+ function deleteFn(event, handler, callback) {
323
+ logger.log("Calling Delete", event);
324
+ promisify(handler, 1).call({
325
+ settings: event.settings,
326
+ session: event.session,
327
+ ...event.data
328
+ }, event.data.ids).then(() => callback()).catch(callback);
329
+ }
330
+ };