@iobroker/db-base 4.0.21 → 4.1.0-alpha.0-20220819-74ceeddc
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.
- package/build/index.d.ts +4 -0
- package/build/index.js +10 -0
- package/build/lib/constants.d.ts +4 -0
- package/build/lib/constants.d.ts.map +1 -0
- package/build/lib/constants.js +11 -0
- package/build/lib/constants.js.map +1 -0
- package/build/lib/inMemFileDB.d.ts +130 -0
- package/build/lib/inMemFileDB.d.ts.map +1 -0
- package/{lib → build/lib}/inMemFileDB.js +119 -207
- package/build/lib/inMemFileDB.js.map +1 -0
- package/build/lib/redisHandler.d.ts +165 -0
- package/build/lib/redisHandler.d.ts.map +1 -0
- package/{lib → build/lib}/redisHandler.js +93 -145
- package/build/lib/redisHandler.js.map +1 -0
- package/package.json +24 -8
- package/index.js +0 -5
- package/lib/constants.js +0 -6
- package/lib/tools.js +0 -21
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* States DB in memory - Server
|
|
3
4
|
*
|
|
@@ -6,39 +7,15 @@
|
|
|
6
7
|
* MIT License
|
|
7
8
|
*
|
|
8
9
|
*/
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const
|
|
18
|
-
const path = require('path');
|
|
19
|
-
const tools = require('./tools.js');
|
|
20
|
-
|
|
21
|
-
// settings = {
|
|
22
|
-
// change: function (id, state) {},
|
|
23
|
-
// connected: function (nameOfServer) {},
|
|
24
|
-
// logger: {
|
|
25
|
-
// silly: function (msg) {},
|
|
26
|
-
// debug: function (msg) {},
|
|
27
|
-
// info: function (msg) {},
|
|
28
|
-
// warn: function (msg) {},
|
|
29
|
-
// error: function (msg) {}
|
|
30
|
-
// },
|
|
31
|
-
// connection: {
|
|
32
|
-
// dataDir: 'relative path'
|
|
33
|
-
// },
|
|
34
|
-
// auth: null, //unused
|
|
35
|
-
// secure: true/false,
|
|
36
|
-
// certificates: as required by createServer
|
|
37
|
-
// port: 9000,
|
|
38
|
-
// host: localhost
|
|
39
|
-
// };
|
|
40
|
-
//
|
|
41
|
-
|
|
10
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
11
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.InMemoryFileDB = void 0;
|
|
15
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
16
|
+
const path_1 = __importDefault(require("path"));
|
|
17
|
+
const js_controller_common_1 = require("@iobroker/js-controller-common");
|
|
18
|
+
const zlib_1 = require("zlib");
|
|
42
19
|
/**
|
|
43
20
|
* The parent of the class structure, which provides basic JSON storage
|
|
44
21
|
* and general subscription and publish functionality
|
|
@@ -46,136 +23,112 @@ const tools = require('./tools.js');
|
|
|
46
23
|
class InMemoryFileDB {
|
|
47
24
|
constructor(settings) {
|
|
48
25
|
this.settings = settings || {};
|
|
49
|
-
|
|
50
26
|
this.change = this.settings.change;
|
|
51
|
-
|
|
52
27
|
this.dataset = {};
|
|
53
|
-
|
|
54
28
|
this.namespace = this.settings.namespace || '';
|
|
55
29
|
this.lastSave = null;
|
|
56
|
-
this.zlib = null;
|
|
57
30
|
this.callbackSubscriptionClient = {};
|
|
58
|
-
|
|
59
31
|
this.settings.backup = this.settings.connection.backup || {
|
|
60
|
-
disabled: false,
|
|
61
|
-
files: 24,
|
|
62
|
-
hours: 48,
|
|
63
|
-
period: 120,
|
|
32
|
+
disabled: false,
|
|
33
|
+
files: 24,
|
|
34
|
+
hours: 48,
|
|
35
|
+
period: 120,
|
|
64
36
|
path: '' // use default path
|
|
65
37
|
};
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
this.dataDir = path.normalize(path.join(tools.getControllerDir(), this.dataDir));
|
|
38
|
+
this.dataDir = this.settings.connection.dataDir || js_controller_common_1.tools.getDefaultDataDir();
|
|
39
|
+
if (!path_1.default.isAbsolute(this.dataDir)) {
|
|
40
|
+
this.dataDir = path_1.default.normalize(path_1.default.join(js_controller_common_1.tools.getControllerDir(), this.dataDir));
|
|
70
41
|
}
|
|
71
42
|
this.dataDir = this.dataDir.replace(/\\/g, '/');
|
|
72
|
-
|
|
73
43
|
const fileName = this.settings.jsonlDB ? this.settings.jsonlDB.fileName : this.settings.fileDB.fileName;
|
|
74
|
-
this.datasetName =
|
|
75
|
-
const parts =
|
|
76
|
-
|
|
77
|
-
|
|
44
|
+
this.datasetName = path_1.default.join(this.dataDir, fileName);
|
|
45
|
+
const parts = path_1.default.dirname(this.datasetName);
|
|
46
|
+
fs_extra_1.default.ensureDirSync(parts);
|
|
78
47
|
this.stateTimer = null;
|
|
79
|
-
|
|
80
|
-
this.
|
|
81
|
-
|
|
82
|
-
this.log = tools.getLogger(this.settings.logger);
|
|
83
|
-
|
|
48
|
+
this.backupDir = this.settings.backup.path || path_1.default.join(this.dataDir, this.settings.fileDB.backupDirName);
|
|
49
|
+
this.log = js_controller_common_1.tools.getLogger(this.settings.logger);
|
|
84
50
|
if (!this.settings.backup.disabled) {
|
|
85
51
|
this.initBackupDir();
|
|
86
52
|
}
|
|
87
|
-
|
|
88
53
|
this.log.debug(`${this.namespace} Data File: ${this.datasetName}`);
|
|
89
54
|
}
|
|
90
|
-
|
|
91
|
-
/** @returns {Promise<void>} */
|
|
92
55
|
async open() {
|
|
93
56
|
// load values from file
|
|
94
57
|
this.dataset = await this.loadDataset(this.datasetName);
|
|
95
58
|
}
|
|
96
|
-
|
|
97
59
|
/**
|
|
98
60
|
* Loads a dataset file
|
|
99
61
|
*
|
|
100
|
-
* @param datasetName
|
|
101
|
-
* @returns
|
|
62
|
+
* @param datasetName Filename of the file to load
|
|
63
|
+
* @returns obj read data, normally as object
|
|
102
64
|
*/
|
|
103
65
|
async loadDatasetFile(datasetName) {
|
|
104
|
-
if (!(await
|
|
66
|
+
if (!(await fs_extra_1.default.pathExists(datasetName))) {
|
|
105
67
|
throw new Error(`Database file ${datasetName} does not exists.`);
|
|
106
68
|
}
|
|
107
|
-
return
|
|
69
|
+
return fs_extra_1.default.readJSON(datasetName);
|
|
108
70
|
}
|
|
109
|
-
|
|
110
71
|
/**
|
|
111
72
|
* Loads the dataset including pot. Fallback handling
|
|
112
73
|
*
|
|
113
|
-
* @param datasetName
|
|
114
|
-
* @returns
|
|
74
|
+
* @param datasetName Filename of the file to load
|
|
75
|
+
* @returns obj dataset read as object
|
|
115
76
|
*/
|
|
116
77
|
async loadDataset(datasetName) {
|
|
117
78
|
let ret = {};
|
|
118
79
|
try {
|
|
119
80
|
ret = await this.loadDatasetFile(datasetName);
|
|
120
|
-
|
|
121
81
|
// loading worked, make sure that "bak" File is not broken
|
|
122
82
|
try {
|
|
123
|
-
await
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
);
|
|
83
|
+
await fs_extra_1.default.readJSON(`${datasetName}.bak`);
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
this.log.info(`${this.namespace} Rewrite bak file, because error on verify ${datasetName}.bak: ${e.message}`);
|
|
128
87
|
try {
|
|
129
88
|
const jsonString = JSON.stringify(ret);
|
|
130
|
-
await
|
|
131
|
-
}
|
|
89
|
+
await fs_extra_1.default.writeFile(`${datasetName}.bak`, jsonString);
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
132
92
|
this.log.error(`${this.namespace} Cannot save ${datasetName}.bak: ${e.message}`);
|
|
133
93
|
}
|
|
134
94
|
}
|
|
135
|
-
}
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
136
97
|
this.log.error(`${this.namespace} Cannot load ${datasetName}: ${err.message}. We try last Backup!`);
|
|
137
|
-
|
|
138
98
|
try {
|
|
139
99
|
ret = await this.loadDatasetFile(`${datasetName}.bak`);
|
|
140
|
-
|
|
141
100
|
// it worked, lets overwrite old file and store the broken one for pot. forensic check
|
|
142
101
|
try {
|
|
143
|
-
if (await
|
|
102
|
+
if (await fs_extra_1.default.pathExists(datasetName)) {
|
|
144
103
|
try {
|
|
145
|
-
await
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
);
|
|
104
|
+
await fs_extra_1.default.move(datasetName, `${datasetName}.broken`, { overwrite: true });
|
|
105
|
+
}
|
|
106
|
+
catch (e) {
|
|
107
|
+
this.log.error(`${this.namespace} Cannot copy the broken file ${datasetName} to ${datasetName}.broken ${e.message}`);
|
|
150
108
|
}
|
|
151
109
|
try {
|
|
152
|
-
await
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
);
|
|
110
|
+
await fs_extra_1.default.writeFile(datasetName, JSON.stringify(ret));
|
|
111
|
+
}
|
|
112
|
+
catch (e) {
|
|
113
|
+
this.log.error(`${this.namespace} Cannot restore backup file as new main ${datasetName}: ${e.message}`);
|
|
157
114
|
}
|
|
158
115
|
}
|
|
159
|
-
}
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
160
118
|
// ignore, file does not exist
|
|
161
119
|
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
);
|
|
166
|
-
this.log.error(
|
|
167
|
-
`${this.namespace} If this is no Migration or initial start please restore the last backup from ${this.backupDir}`
|
|
168
|
-
);
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
this.log.error(`${this.namespace} Cannot load ${datasetName}.bak: ${err.message}. Continue with empty dataset!`);
|
|
123
|
+
this.log.error(`${this.namespace} If this is no Migration or initial start please restore the last backup from ${this.backupDir}`);
|
|
169
124
|
}
|
|
170
125
|
}
|
|
171
126
|
return ret;
|
|
172
127
|
}
|
|
173
|
-
|
|
174
128
|
initBackupDir() {
|
|
175
|
-
this.zlib = this.zlib || require('zlib');
|
|
176
129
|
// Interval in minutes => to milliseconds
|
|
177
130
|
this.settings.backup.period =
|
|
178
|
-
this.settings.backup.period === undefined ? 120 : parseInt(this.settings.backup.period);
|
|
131
|
+
this.settings.backup.period === undefined ? 120 : parseInt(String(this.settings.backup.period));
|
|
179
132
|
if (isNaN(this.settings.backup.period)) {
|
|
180
133
|
this.settings.backup.period = 120;
|
|
181
134
|
}
|
|
@@ -183,28 +136,23 @@ class InMemoryFileDB {
|
|
|
183
136
|
// If a user configured the backup this way, we use our default of 120 minutes instead.
|
|
184
137
|
const maxTimeoutMinutes = Math.floor((2 ** 31 - 1) / 60000);
|
|
185
138
|
if (this.settings.backup.period > maxTimeoutMinutes) {
|
|
139
|
+
this.log.warn(`${this.namespace} Configured backup period ${this.settings.backup.period} is larger than the supported maximum of ${maxTimeoutMinutes} minutes. Defaulting to 120 minutes.`);
|
|
186
140
|
this.settings.backup.period = 120;
|
|
187
|
-
this.log.warn(
|
|
188
|
-
`${this.namespace} Configured backup period ${this.settings.backup.period} is larger than the supported maximum of ${maxTimeoutMinutes} minutes. Defaulting to 120 minutes.`
|
|
189
|
-
);
|
|
190
141
|
}
|
|
191
142
|
this.settings.backup.period *= 60000;
|
|
192
|
-
|
|
193
143
|
this.settings.backup.files =
|
|
194
|
-
this.settings.backup.files === undefined ? 24 : parseInt(this.settings.backup.files);
|
|
144
|
+
this.settings.backup.files === undefined ? 24 : parseInt(String(this.settings.backup.files));
|
|
195
145
|
if (isNaN(this.settings.backup.files)) {
|
|
196
146
|
this.settings.backup.files = 24;
|
|
197
147
|
}
|
|
198
|
-
|
|
199
148
|
this.settings.backup.hours =
|
|
200
|
-
this.settings.backup.hours === undefined ? 48 : parseInt(this.settings.backup.hours);
|
|
149
|
+
this.settings.backup.hours === undefined ? 48 : parseInt(String(this.settings.backup.hours));
|
|
201
150
|
if (isNaN(this.settings.backup.hours)) {
|
|
202
151
|
this.settings.backup.hours = 48;
|
|
203
152
|
}
|
|
204
153
|
// Create backup directory
|
|
205
|
-
|
|
154
|
+
fs_extra_1.default.ensureDirSync(this.backupDir);
|
|
206
155
|
}
|
|
207
|
-
|
|
208
156
|
handleSubscribe(client, type, pattern, options, cb) {
|
|
209
157
|
if (typeof options === 'function') {
|
|
210
158
|
cb = options;
|
|
@@ -212,63 +160,52 @@ class InMemoryFileDB {
|
|
|
212
160
|
}
|
|
213
161
|
client._subscribe = client._subscribe || {};
|
|
214
162
|
client._subscribe[type] = client._subscribe[type] || [];
|
|
215
|
-
|
|
216
163
|
const s = client._subscribe[type];
|
|
217
|
-
|
|
218
164
|
if (pattern instanceof Array) {
|
|
219
165
|
pattern.forEach(pattern => {
|
|
220
166
|
if (s.find(sub => sub.pattern === pattern)) {
|
|
221
167
|
return;
|
|
222
168
|
}
|
|
223
|
-
|
|
224
|
-
s.push({ pattern: pattern, regex: new RegExp(tools.pattern2RegEx(pattern)), options: options });
|
|
169
|
+
s.push({ pattern, regex: new RegExp(js_controller_common_1.tools.pattern2RegEx(pattern)), options });
|
|
225
170
|
});
|
|
226
|
-
}
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
227
173
|
if (!s.find(sub => sub.pattern === pattern)) {
|
|
228
|
-
s.push({ pattern
|
|
174
|
+
s.push({ pattern, regex: new RegExp(js_controller_common_1.tools.pattern2RegEx(pattern)), options });
|
|
229
175
|
}
|
|
230
176
|
}
|
|
231
177
|
typeof cb === 'function' && cb();
|
|
232
178
|
}
|
|
233
|
-
|
|
234
179
|
handleUnsubscribe(client, type, pattern, cb) {
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
}
|
|
241
|
-
const s = client._subscribe[type];
|
|
242
|
-
if (pattern instanceof Array) {
|
|
243
|
-
pattern.forEach(pattern => {
|
|
244
|
-
const index = s.findIndex(sub => sub.pattern === pattern);
|
|
180
|
+
var _a;
|
|
181
|
+
const s = (_a = client === null || client === void 0 ? void 0 : client._subscribe) === null || _a === void 0 ? void 0 : _a[type];
|
|
182
|
+
if (s) {
|
|
183
|
+
const removeEntry = (p) => {
|
|
184
|
+
const index = s.findIndex(sub => sub.pattern === p);
|
|
245
185
|
if (index > -1) {
|
|
246
186
|
s.splice(index, 1);
|
|
247
187
|
}
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
188
|
+
};
|
|
189
|
+
if (pattern instanceof Array) {
|
|
190
|
+
pattern.forEach(p => {
|
|
191
|
+
removeEntry(p);
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
removeEntry(pattern);
|
|
254
196
|
}
|
|
255
197
|
}
|
|
256
|
-
|
|
198
|
+
return js_controller_common_1.tools.maybeCallback(cb);
|
|
257
199
|
}
|
|
258
|
-
|
|
259
|
-
/** @returns {number} */
|
|
260
200
|
publishToClients(_client, _type, _id, _obj) {
|
|
261
201
|
throw new Error('no communication handling implemented');
|
|
262
202
|
}
|
|
263
|
-
|
|
264
203
|
deleteOldBackupFiles(baseFilename) {
|
|
265
204
|
// delete files only if settings.backupNumber is not 0
|
|
266
|
-
let files =
|
|
205
|
+
let files = fs_extra_1.default.readdirSync(this.backupDir);
|
|
267
206
|
files.sort();
|
|
268
207
|
const limit = Date.now() - this.settings.backup.hours * 3600000;
|
|
269
|
-
|
|
270
208
|
files = files.filter(f => f.endsWith(baseFilename + '.gz'));
|
|
271
|
-
|
|
272
209
|
while (files.length > this.settings.backup.files) {
|
|
273
210
|
const file = files.shift();
|
|
274
211
|
if (!file) {
|
|
@@ -278,196 +215,172 @@ class InMemoryFileDB {
|
|
|
278
215
|
const ms = new Date(`${file.substring(0, 10)} ${file.substring(11, 16).replace('-', ':')}:00`).getTime();
|
|
279
216
|
if (limit > ms) {
|
|
280
217
|
try {
|
|
281
|
-
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
);
|
|
218
|
+
fs_extra_1.default.unlinkSync(path_1.default.join(this.backupDir, file));
|
|
219
|
+
}
|
|
220
|
+
catch (e) {
|
|
221
|
+
this.log.error(`${this.namespace} Cannot delete file "${path_1.default.join(this.backupDir, file)}: ${e.message}`);
|
|
286
222
|
}
|
|
287
223
|
}
|
|
288
224
|
}
|
|
289
225
|
}
|
|
290
|
-
|
|
291
226
|
getTimeStr(date) {
|
|
292
227
|
const dateObj = new Date(date);
|
|
293
|
-
|
|
294
228
|
let text = dateObj.getFullYear().toString() + '-';
|
|
295
229
|
let v = dateObj.getMonth() + 1;
|
|
296
230
|
if (v < 10) {
|
|
297
231
|
text += '0';
|
|
298
232
|
}
|
|
299
233
|
text += v.toString() + '-';
|
|
300
|
-
|
|
301
234
|
v = dateObj.getDate();
|
|
302
235
|
if (v < 10) {
|
|
303
236
|
text += '0';
|
|
304
237
|
}
|
|
305
238
|
text += v.toString() + '_';
|
|
306
|
-
|
|
307
239
|
v = dateObj.getHours();
|
|
308
240
|
if (v < 10) {
|
|
309
241
|
text += '0';
|
|
310
242
|
}
|
|
311
243
|
text += v.toString() + '-';
|
|
312
|
-
|
|
313
244
|
v = dateObj.getMinutes();
|
|
314
245
|
if (v < 10) {
|
|
315
246
|
text += '0';
|
|
316
247
|
}
|
|
317
248
|
text += v.toString();
|
|
318
|
-
|
|
319
249
|
return text;
|
|
320
250
|
}
|
|
321
|
-
|
|
322
251
|
/**
|
|
323
252
|
* Handle saving the dataset incl. backups
|
|
324
253
|
*/
|
|
325
254
|
async saveState() {
|
|
326
255
|
try {
|
|
327
256
|
const jsonString = await this.saveDataset();
|
|
328
|
-
|
|
329
257
|
if (!this.settings.backup.disabled && jsonString) {
|
|
330
258
|
this.saveBackup(jsonString);
|
|
331
259
|
}
|
|
332
|
-
}
|
|
260
|
+
}
|
|
261
|
+
finally {
|
|
333
262
|
if (this.stateTimer) {
|
|
334
263
|
clearTimeout(this.stateTimer);
|
|
335
264
|
this.stateTimer = null;
|
|
336
265
|
}
|
|
337
266
|
}
|
|
338
267
|
}
|
|
339
|
-
|
|
340
268
|
/**
|
|
341
269
|
* Saves the dataset into File incl. handling of a fallback backup file
|
|
342
270
|
*
|
|
343
|
-
* @returns
|
|
271
|
+
* @returns dataset JSON string of the complete dataset to also be stored into a compressed backup file
|
|
344
272
|
*/
|
|
345
273
|
async saveDataset() {
|
|
346
274
|
const jsonString = JSON.stringify(this.dataset);
|
|
347
|
-
|
|
348
275
|
try {
|
|
349
|
-
await
|
|
350
|
-
}
|
|
276
|
+
await fs_extra_1.default.writeFile(`${this.datasetName}.new`, jsonString);
|
|
277
|
+
}
|
|
278
|
+
catch (e) {
|
|
351
279
|
this.log.error(`${this.namespace} Cannot save Dataset to ${this.datasetName}.new: ${e.message}`);
|
|
352
280
|
return jsonString;
|
|
353
281
|
}
|
|
354
|
-
|
|
355
282
|
let bakOk = true;
|
|
356
283
|
try {
|
|
357
|
-
if (await
|
|
284
|
+
if (await fs_extra_1.default.pathExists(this.datasetName)) {
|
|
358
285
|
try {
|
|
359
|
-
await
|
|
360
|
-
}
|
|
286
|
+
await fs_extra_1.default.move(this.datasetName, `${this.datasetName}.bak`, { overwrite: true });
|
|
287
|
+
}
|
|
288
|
+
catch (e) {
|
|
361
289
|
bakOk = false;
|
|
362
290
|
this.log.error(`${this.namespace} Cannot backup file ${this.datasetName}.bak: ${e.message}`);
|
|
363
291
|
}
|
|
364
|
-
}
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
365
294
|
bakOk = false;
|
|
366
295
|
}
|
|
367
|
-
}
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
368
298
|
bakOk = false;
|
|
369
299
|
// ignore, file does not exist
|
|
370
300
|
}
|
|
371
|
-
|
|
372
301
|
try {
|
|
373
|
-
await
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
);
|
|
302
|
+
await fs_extra_1.default.move(`${this.datasetName}.new`, this.datasetName, { overwrite: true });
|
|
303
|
+
}
|
|
304
|
+
catch (e) {
|
|
305
|
+
this.log.error(`${this.namespace} Cannot move ${this.datasetName}.new to ${this.datasetName}: ${e.message}. Try direct write as fallback`);
|
|
378
306
|
try {
|
|
379
|
-
await
|
|
380
|
-
}
|
|
307
|
+
await fs_extra_1.default.writeFile(this.datasetName, jsonString);
|
|
308
|
+
}
|
|
309
|
+
catch (e) {
|
|
381
310
|
this.log.error(`${this.namespace} Cannot directly write Dataset to ${this.datasetName}: ${e.message}`);
|
|
382
311
|
return jsonString;
|
|
383
312
|
}
|
|
384
313
|
}
|
|
385
|
-
|
|
386
314
|
if (!bakOk) {
|
|
387
315
|
// it seems the bak File is not successfully there, write current content again
|
|
388
316
|
try {
|
|
389
|
-
await
|
|
390
|
-
}
|
|
317
|
+
await fs_extra_1.default.writeFile(`${this.datasetName}.bak`, jsonString);
|
|
318
|
+
}
|
|
319
|
+
catch (e) {
|
|
391
320
|
this.log.error(`${this.namespace} Cannot save ${this.datasetName}.bak: ${e.message}`);
|
|
392
321
|
}
|
|
393
322
|
}
|
|
394
|
-
|
|
395
323
|
return jsonString;
|
|
396
324
|
}
|
|
397
|
-
|
|
398
325
|
/**
|
|
399
326
|
* Stores a compressed backup of the DB in definable intervals
|
|
400
327
|
*
|
|
401
|
-
* @param jsonString
|
|
328
|
+
* @param jsonString JSON string of the complete dataset to also be stored into a compressed backup file
|
|
402
329
|
*/
|
|
403
330
|
saveBackup(jsonString) {
|
|
404
331
|
// save files for the last x hours
|
|
405
332
|
const now = Date.now();
|
|
406
|
-
|
|
407
333
|
// makes backups only if settings.backupInterval is not 0
|
|
408
334
|
if (this.settings.backup.period && (!this.lastSave || now - this.lastSave > this.settings.backup.period)) {
|
|
409
335
|
this.lastSave = now;
|
|
410
|
-
const backFileName =
|
|
411
|
-
this.backupDir,
|
|
412
|
-
this.getTimeStr(now) + '_' + this.settings.fileDB.fileName + '.gz'
|
|
413
|
-
);
|
|
414
|
-
|
|
336
|
+
const backFileName = path_1.default.join(this.backupDir, this.getTimeStr(now) + '_' + this.settings.fileDB.fileName + '.gz');
|
|
415
337
|
try {
|
|
416
|
-
if (!
|
|
417
|
-
|
|
418
|
-
const output = fs.createWriteStream(backFileName);
|
|
338
|
+
if (!fs_extra_1.default.existsSync(backFileName)) {
|
|
339
|
+
const output = fs_extra_1.default.createWriteStream(backFileName);
|
|
419
340
|
output.on('error', err => {
|
|
420
|
-
this.log.error(`${this.namespace} Cannot save ${this.datasetName}: ${err}`);
|
|
341
|
+
this.log.error(`${this.namespace} Cannot save ${this.datasetName}: ${err.stack}`);
|
|
421
342
|
});
|
|
422
|
-
const compress =
|
|
343
|
+
const compress = (0, zlib_1.createGzip)();
|
|
423
344
|
/* The following line will pipe everything written into compress to the file stream */
|
|
424
345
|
compress.pipe(output);
|
|
425
346
|
/* Since we're piped through the file stream, the following line will do:
|
|
426
347
|
'Hello World!'->gzip compression->file which is the desired effect */
|
|
427
348
|
compress.write(jsonString);
|
|
428
349
|
compress.end();
|
|
429
|
-
|
|
430
350
|
// analyse older files
|
|
431
351
|
this.deleteOldBackupFiles(this.settings.fileDB.fileName);
|
|
432
352
|
}
|
|
433
|
-
}
|
|
353
|
+
}
|
|
354
|
+
catch (e) {
|
|
434
355
|
this.log.error(`${this.namespace} Cannot save backup ${backFileName}: ${e.message}`);
|
|
435
356
|
}
|
|
436
357
|
}
|
|
437
358
|
}
|
|
438
|
-
|
|
439
359
|
getStatus() {
|
|
440
360
|
return { type: 'file', server: true };
|
|
441
361
|
}
|
|
442
|
-
|
|
443
|
-
/** @returns {object} */
|
|
444
362
|
getClients() {
|
|
445
363
|
return {};
|
|
446
364
|
}
|
|
447
|
-
|
|
448
365
|
publishAll(type, id, obj) {
|
|
449
366
|
if (id === undefined) {
|
|
450
367
|
this.log.error(`${this.namespace} Can not publish empty ID`);
|
|
451
368
|
return 0;
|
|
452
369
|
}
|
|
453
|
-
|
|
454
370
|
const clients = this.getClients();
|
|
455
371
|
let publishCount = 0;
|
|
456
|
-
|
|
457
372
|
if (clients && typeof clients === 'object') {
|
|
458
373
|
for (const i of Object.keys(clients)) {
|
|
459
374
|
publishCount += this.publishToClients(clients[i], type, id, obj);
|
|
460
375
|
}
|
|
461
376
|
}
|
|
462
|
-
|
|
463
377
|
// local subscriptions
|
|
464
|
-
if (
|
|
465
|
-
this.change &&
|
|
378
|
+
if (this.change &&
|
|
466
379
|
this.callbackSubscriptionClient._subscribe &&
|
|
467
|
-
this.callbackSubscriptionClient._subscribe[type]
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
380
|
+
this.callbackSubscriptionClient._subscribe[type]) {
|
|
381
|
+
for (const entry of this.callbackSubscriptionClient._subscribe[type]) {
|
|
382
|
+
if (entry.regex.test(id)) {
|
|
383
|
+
// @ts-expect-error we have checked 3 lines above
|
|
471
384
|
setImmediate(() => this.change(id, obj));
|
|
472
385
|
break;
|
|
473
386
|
}
|
|
@@ -475,7 +388,6 @@ class InMemoryFileDB {
|
|
|
475
388
|
}
|
|
476
389
|
return publishCount;
|
|
477
390
|
}
|
|
478
|
-
|
|
479
391
|
// Destructor of the class. Called by shutting down.
|
|
480
392
|
async destroy() {
|
|
481
393
|
if (this.stateTimer) {
|
|
@@ -484,5 +396,5 @@ class InMemoryFileDB {
|
|
|
484
396
|
}
|
|
485
397
|
}
|
|
486
398
|
}
|
|
487
|
-
|
|
488
|
-
|
|
399
|
+
exports.InMemoryFileDB = InMemoryFileDB;
|
|
400
|
+
//# sourceMappingURL=inMemFileDB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inMemFileDB.js","sourceRoot":"","sources":["../../src/lib/inMemFileDB.ts"],"names":[],"mappings":"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"}
|