Skip to content

Commit a05ddd0

Browse files
authored
Merge pull request #237 from mStirner/dev
V2 is comming!
2 parents 8024519 + c499adb commit a05ddd0

File tree

4 files changed

+84
-44
lines changed

4 files changed

+84
-44
lines changed

components/endpoints/class.state.js

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -79,27 +79,30 @@ module.exports = class State {
7979
name: Joi.string().required(),
8080
description: Joi.string().allow(null).default(null),
8181
alias: Joi.string().required(),
82-
value: Joi.when("type", {
83-
is: "number",
84-
then: Joi.number()
85-
}).when("type", {
86-
is: "string",
87-
then: Joi.string()
88-
}).when("type", {
89-
is: "boolean",
90-
then: Joi.boolean()
91-
}).allow(null).default(null),
9282
type: Joi.string().valid("number", "string", "boolean").required(),
93-
identifier: Joi.string().allow(null).default(null),
9483
timestamps: Joi.object({
9584
created: Joi.number().allow(null),
9685
updated: Joi.number().allow(null)
97-
}).default(() => {
98-
return {
99-
created: Date.now(),
100-
updated: null
101-
};
10286
})
87+
}).when(".type", {
88+
switch: [{
89+
is: "number",
90+
then: Joi.object({
91+
value: Joi.number().default(null).allow(null),
92+
min: Joi.number().default(0),
93+
max: Joi.number().default(100)
94+
})
95+
}, {
96+
is: "string",
97+
then: Joi.object({
98+
value: Joi.string().default(null).allow(null)
99+
})
100+
}, {
101+
is: "boolean",
102+
then: Joi.object({
103+
value: Joi.boolean().default(null).allow(null)
104+
})
105+
}]
103106
});
104107
}
105108

components/vault/class.vault.js

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ const { EventEmitter } = require("events");
33
const mongodb = require("mongodb");
44
const Joi = require("joi");
55

6+
const _debounce = require("../../helper/debounce.js");
7+
68
const Secret = require("./class.secret.js");
79

810
/**
@@ -30,31 +32,33 @@ class Vault {
3032
let events = new EventEmitter();
3133
this.#privates.set("events", events);
3234

33-
Object.assign(this, obj);
34-
this._id = String(obj._id);
35+
let changed = _debounce(async (secret) => {
36+
try {
3537

36-
this.secrets = obj.secrets.map((data) => {
37-
return new Secret(data, async () => {
38-
try {
38+
// feedback
39+
scope.logger.debug(`Secret "${secret.key}" changed`);
3940

40-
// feedback
41-
scope.logger.debug(`Secret "${data.name}" value changed`);
41+
// update item in database
42+
await scope.update(this._id, this);
4243

43-
// update item in database
44-
await scope.update(this._id, this);
44+
} catch (err) {
4545

46-
events.emit("changed", this);
46+
scope.logger.warn(err, `Could not update secret value. (${obj._id}) ${secret.key}=${secret.value}`);
4747

48-
} catch (err) {
48+
} finally {
4949

50-
scope.logger.warn(err, `Could not update secret value. (${obj._id}) ${data.key}=${data.value}`);
50+
// notify for changes
51+
events.emit("changed", this);
5152

52-
} finally {
53+
}
54+
}, Number(process.env.DATABASE_UPDATE_DEBOUNCE_TIMER));
5355

54-
// notify for changes
55-
events.emit("changed", data.key, data.value);
56+
Object.assign(this, obj);
57+
this._id = String(obj._id);
5658

57-
}
59+
this.secrets = obj.secrets.map((secret) => {
60+
return new Secret(secret, () => {
61+
changed(secret);
5862
});
5963
});
6064

index.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ process.env = Object.assign({
3030
//DATABASE_TIMEOUT: "5", // #8
3131
DATABASE_URL: "",
3232
DATABASE_WATCH_CHANGES: "false",
33+
DATABASE_UPDATE_DEBOUNCE_TIMER: "15",
3334
HTTP_PORT: "8080",
3435
HTTP_ADDRESS: "0.0.0.0",
3536
HTTP_SOCKET: "",
@@ -84,6 +85,12 @@ if (process.env.NODE_ENV === "development") {
8485
}
8586

8687

88+
// implement #195
89+
if (process.env.NODE_ENV === "production") {
90+
console.log = () => { };
91+
}
92+
93+
8794
// init feedback
8895
//process.stdout.write("\033c"); // use console.clear()?!
8996
// https://stackoverflow.com/a/41407246/5781499

system/component/class.component.js

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const _merge = require("../../helper/merge");
66

77
const COMMON = require("./class.common.js");
88

9-
//const PENDING_CHANGE_EVENTS = new Set();
9+
const PENDING_CHANGE_EVENTS = new Set();
1010

1111
/**
1212
* @description
@@ -130,6 +130,10 @@ module.exports = class COMPONENT extends COMMON {
130130
});
131131

132132
changeStream.on("change", (event) => {
133+
134+
// feedback
135+
this.logger.trace("Change event triggerd", event);
136+
133137
// replace is used when updated via mongodb compass
134138
// updated is used when called via api/`.update` method
135139
if (event.operationType === "replace") {
@@ -145,6 +149,19 @@ module.exports = class COMPONENT extends COMMON {
145149
return;
146150
}
147151

152+
// when a change was initialized local, ignore changes from mongodb
153+
if (PENDING_CHANGE_EVENTS.has(target._id)) {
154+
155+
// feedback
156+
this.logger.trace("Local change detected, ignore event from change stream");
157+
158+
// cleanup
159+
PENDING_CHANGE_EVENTS.delete(target._id);
160+
161+
return;
162+
163+
}
164+
148165
// get original property descriptor
149166
//let descriptor = Object.getOwnPropertyDescriptors(target);
150167
//console.log("replace event", descriptor.config)
@@ -186,18 +203,17 @@ module.exports = class COMPONENT extends COMMON {
186203
}
187204

188205
// when a change was initialized local, ignore changes from mongodb
189-
/*
190206
if (PENDING_CHANGE_EVENTS.has(target._id)) {
191207

192208
// feedback
193-
this.logger.verbose("Local change detected, ignore event from change stream");
209+
this.logger.trace("Local change detected, ignore event from change stream");
194210

195211
// cleanup
196212
PENDING_CHANGE_EVENTS.delete(target._id);
197213

198214
return;
215+
199216
}
200-
*/
201217

202218
// event now contain dot notation partial update
203219
// to make things simpler, just fetch the doc and merge it
@@ -226,6 +242,7 @@ module.exports = class COMPONENT extends COMMON {
226242
this.logger.verbose(`$watch operation (${event.operationType}) not implemented!`);
227243

228244
}
245+
229246
});
230247

231248
} catch (err) {
@@ -274,6 +291,9 @@ module.exports = class COMPONENT extends COMMON {
274291
// override string with ObjectId, see #175
275292
result.value._id = new mongodb.ObjectId(result.value._id);
276293

294+
// add id to pending change events
295+
PENDING_CHANGE_EVENTS.add(result.value._id);
296+
277297
this.collection.insertOne(result.value, (err, result) => {
278298
if (err) {
279299
if (err.code === 11000 && options.returnDuplicate) {
@@ -296,8 +316,8 @@ module.exports = class COMPONENT extends COMMON {
296316
*/
297317
});
298318

299-
// add id to pending change events
300-
//PENDING_CHANGE_EVENTS.add(item._id);
319+
// remove id when error occurs
320+
PENDING_CHANGE_EVENTS.delete(result.value._id);
301321

302322
if (item) {
303323
resolve([item]);
@@ -398,21 +418,24 @@ module.exports = class COMPONENT extends COMMON {
398418
return obj._id === _id;
399419
});
400420

421+
// add id to pending change events
422+
PENDING_CHANGE_EVENTS.add(target._id);
423+
401424
this.collection.deleteOne({
402425
_id: new mongodb.ObjectId(_id)
403426
}, (err, result) => {
404427
if (err) {
405428

429+
// remove id when error occurs
430+
PENDING_CHANGE_EVENTS.delete(result.value._id);
431+
406432
reject(err);
407433

408434
} else {
409435

410436
//if (result.n === 1 && result.ok === 1 && target) {
411437
if (result.acknowledged && result.deletedCount > 0) {
412438

413-
// add id to pending change events
414-
//PENDING_CHANGE_EVENTS.add(target._id);
415-
416439
resolve([target, result, _id]);
417440

418441
} else {
@@ -472,6 +495,9 @@ module.exports = class COMPONENT extends COMMON {
472495
// _id is immutable. remove it
473496
delete validation.value._id;
474497

498+
// add id to pending change events
499+
PENDING_CHANGE_EVENTS.add(target._id);
500+
475501
this.collection.findOneAndUpdate({
476502
// casting problem, see #175
477503
_id: new mongodb.ObjectId(_id)
@@ -485,6 +511,9 @@ module.exports = class COMPONENT extends COMMON {
485511
}, (err) => {
486512
if (err) {
487513

514+
// remove id when error occurs
515+
PENDING_CHANGE_EVENTS.delete(target._id);
516+
488517
//console.log("4tpoiwrejtkwienrut", err)
489518
reject(err);
490519

@@ -502,9 +531,6 @@ module.exports = class COMPONENT extends COMMON {
502531
// Umwandlung von object/string zu/von object/string
503532
// muss in middlware erflogen!!!!!!!!!!!!!!
504533

505-
// add id to pending change events
506-
//PENDING_CHANGE_EVENTS.add(target._id);
507-
508534
// TODO CHECK RESUTL!
509535
// extend exisiting object in items array
510536
//_extend(target, validation.value);

0 commit comments

Comments
 (0)