@iobroker/js-controller-common 7.0.0 → 7.0.1

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.
@@ -93,7 +93,7 @@ async function readDirAsZip(objects, id, name, options, callback) {
93
93
  }
94
94
  options = options || {};
95
95
  let adapter = id;
96
- if (adapter.indexOf(".") !== -1) {
96
+ if (adapter.includes(".")) {
97
97
  adapter = id.split(".")[0];
98
98
  }
99
99
  try {
@@ -140,7 +140,11 @@ async function _checkDir(_options) {
140
140
  return _checkDir({ id, objects, options, root, parts });
141
141
  }
142
142
  async function _writeOneFile(objects, zip, id, name, filename, options) {
143
- let data = await zip.files[filename].async("nodebuffer");
143
+ const zipFile = zip.files[filename];
144
+ if (!zipFile) {
145
+ throw new Error(`Cannot write file "${filename}", because JSZip instance is incomplete`);
146
+ }
147
+ let data = await zipFile.async("nodebuffer");
144
148
  if (options.parse) {
145
149
  data = options.parse(name, filename, data, options ? options.settings : null);
146
150
  }
@@ -172,8 +176,8 @@ async function writeDirAsZip(objects, id, name, data, options) {
172
176
  }
173
177
  try {
174
178
  await _writeOneFile(objects, zip, id, name, filename, options);
175
- } catch (error) {
176
- errors.push(`Cannot write file "${filename}": ${error.toString()}`);
179
+ } catch (e) {
180
+ errors.push(`Cannot write file "${filename}": ${e.toString()}`);
177
181
  }
178
182
  }
179
183
  if (errors.length) {
@@ -193,16 +197,17 @@ async function readObjectsAsZip(objects, rootId, adapter, options = {}) {
193
197
  }
194
198
  const objs = await objects.getObjectsAsync(keys, options);
195
199
  const zip = new import_jszip.default();
196
- for (let f = 0; f < objs.length; f++) {
197
- let data = { id: keys[f], data: objs[f] };
200
+ for (const obj of objs) {
201
+ const id = obj._id;
202
+ let data = { id, data: obj };
198
203
  if (options.stringify) {
199
204
  try {
200
205
  data = options.stringify(data, options ? options.settings : null);
201
206
  } catch {
202
- data.id = `${keys[f].replace(/\./g, "/").substring(rootId.length + 1)}.json`;
207
+ data.id = `${id.replace(/\./g, "/").substring(rootId.length + 1)}.json`;
203
208
  }
204
209
  } else {
205
- data.id = `${keys[f].replace(/\./g, "/").substring(rootId.length + 1)}.json`;
210
+ data.id = `${id.replace(/\./g, "/").substring(rootId.length + 1)}.json`;
206
211
  }
207
212
  if (typeof data.data === "object") {
208
213
  data.data = JSON.stringify(data.data, null, 2);
@@ -212,41 +217,37 @@ async function readObjectsAsZip(objects, rootId, adapter, options = {}) {
212
217
  const base64 = await zip.generateAsync({ type: "base64" });
213
218
  return base64;
214
219
  }
215
- async function _writeOneObject(objects, zip, rootId, filename, options, callback) {
216
- try {
217
- const bufferData = await zip.files[filename].async("nodebuffer");
218
- let data = { data: bufferData.toString(), id: filename };
219
- if (options.parse) {
220
- try {
221
- data = options.parse(data, options ? options.settings : null);
222
- } catch (e) {
223
- callback(new Error(`Cannot custom parse "${data.id}": ${e}`));
224
- return;
225
- }
226
- } else {
227
- data.id = (rootId ? `${rootId}.` : "") + data.id.replace(/\//g, ".").replace(/\.json$/, "");
228
- }
229
- if (data && typeof data.data !== "object") {
230
- try {
231
- data.data = JSON.parse(data.data);
232
- } catch (e) {
233
- callback(new Error(`Cannot parse "${data.id}": ${e.message}`));
234
- return;
235
- }
220
+ async function _writeOneObject(objects, zip, rootId, filename, options) {
221
+ const zipFile = zip.files[filename];
222
+ if (!zipFile) {
223
+ throw new Error(`Cannot write file "${filename}", because JSZip instance is incomplete`);
224
+ }
225
+ const bufferData = await zipFile.async("nodebuffer");
226
+ let data = { data: bufferData.toString(), id: filename };
227
+ if (options.parse) {
228
+ try {
229
+ data = options.parse(data, options ? options.settings : null);
230
+ } catch (e) {
231
+ throw new Error(`Cannot custom parse "${data.id}": ${e}`);
236
232
  }
237
- if (data && data.id && data.data) {
238
- options.ts = new Date().getTime();
239
- options.from = `system.host.${import_js_controller_common.tools.getHostName()}.cli`;
240
- objects.setObject(data.id, data.data, options, (err) => callback(err));
241
- } else {
242
- if (data?.error) {
243
- callback(data.error);
244
- } else {
245
- callback();
246
- }
233
+ } else {
234
+ data.id = (rootId ? `${rootId}.` : "") + data.id.replace(/\//g, ".").replace(/\.json$/, "");
235
+ }
236
+ if (data && typeof data.data !== "object") {
237
+ try {
238
+ data.data = JSON.parse(data.data);
239
+ } catch (e) {
240
+ throw new Error(`Cannot parse "${data.id}": ${e.message}`);
247
241
  }
248
- } catch (e) {
249
- callback(new Error(`Cannot parse unzip: ${e.message}`));
242
+ }
243
+ if (data && data.id && data.data) {
244
+ options.ts = new Date().getTime();
245
+ options.from = `system.host.${import_js_controller_common.tools.getHostName()}.cli`;
246
+ await objects.setObject(data.id, data.data, options);
247
+ return;
248
+ }
249
+ if (data?.error) {
250
+ throw data.error;
250
251
  }
251
252
  }
252
253
  async function writeObjectsAsZip(objects, rootId, adapter, data, options, callback) {
@@ -258,31 +259,24 @@ async function writeObjectsAsZip(objects, rootId, adapter, data, options, callba
258
259
  }
259
260
  }
260
261
  const zip = new import_jszip.default();
262
+ const error = [];
261
263
  try {
262
264
  await zip.loadAsync(data);
263
- let count = 0;
264
- const error = [];
265
265
  for (const filename of Object.keys(zip.files)) {
266
266
  if (filename[filename.length - 1] === "/") {
267
267
  continue;
268
268
  }
269
- count++;
270
- _writeOneObject(objects, zip, rootId, filename, options, (err) => {
271
- if (err) {
272
- error.push(err.toString());
273
- }
274
- if (!--count && callback) {
275
- callback(error.length ? new Error(error.join(", ")) : null);
276
- callback = null;
277
- }
278
- });
269
+ try {
270
+ await _writeOneObject(objects, zip, rootId, filename, options);
271
+ } catch (e) {
272
+ error.push(e.toString());
273
+ }
279
274
  }
280
275
  } catch (e) {
281
- if (callback) {
282
- callback(e.toString());
283
- callback = null;
284
- }
276
+ callback(e.toString());
277
+ return;
285
278
  }
279
+ callback(error.length ? new Error(error.join(", ")) : null);
286
280
  }
287
281
  // Annotate the CommonJS export names for ESM import in node:
288
282
  0 && (module.exports = {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/common/zipFiles.ts"],
4
- "sourcesContent": ["import { tools } from '@iobroker/js-controller-common';\nimport JSZip from 'jszip';\nimport type { Client as ObjectsClient } from '@iobroker/db-objects-redis';\n\nfunction _getAllFilesInDir(\n objects: ObjectsClient,\n id: string,\n name: string,\n options: any,\n callback: (errs: null | string[], res: string[]) => void,\n result?: string[],\n): void {\n objects.readDir(id, name, options, (err, files) => {\n result = result || [];\n\n let count = 0;\n const errors: string[] = [];\n if (files) {\n for (const file of files) {\n if (file.isDir) {\n count++;\n _getAllFilesInDir(\n objects,\n id,\n `${name}/${file.file}`,\n options,\n (errs, _result) => {\n errs && errors.push(...errs);\n if (!--count) {\n callback(errors.length ? errors : null, _result);\n }\n },\n result,\n );\n } else {\n result.push(`${name}/${file.file}`);\n }\n }\n }\n\n if (!count) {\n callback(null, result);\n }\n });\n}\n\nfunction _addFile(\n objects: ObjectsClient,\n id: string,\n name: string,\n options: any,\n zip: JSZip,\n callback: (err: Error | null | undefined) => void,\n): void {\n objects.readFile(id, name, options, (err, data, _mime) => {\n if (err) {\n console.log(err);\n callback(new Error(`Cannot read file \"${name}\": ${err.message}`));\n } else {\n // if handler installed\n if (options.stringify) {\n try {\n data = options.stringify(name, data, options ? options.settings : null);\n } catch (e) {\n console.error(`Cannot stringify file \"${name}\": ${e.message}`);\n if (!err) {\n err = new Error(`Cannot stringify file \"${name}\": ${e.message}`);\n }\n }\n }\n const parts = name.split('/');\n if (parts.length > 1) {\n parts.shift();\n name = parts.join('/');\n }\n\n zip.file(name, data!);\n setImmediate(() => callback(err));\n }\n });\n}\n\n// pack all files as zip and send it back\nexport async function readDirAsZip(\n objects: ObjectsClient,\n id: string,\n name: string,\n options: any,\n callback: (err?: Error | null, base64?: string) => void,\n): Promise<void> {\n if (typeof options === 'function') {\n callback = options;\n options = null;\n }\n if (name[0] === '/') {\n name = name.substring(1);\n }\n options = options || {};\n let adapter = id;\n if (adapter.indexOf('.') !== -1) {\n adapter = id.split('.')[0];\n }\n\n // try to load processor of adapter\n try {\n options.stringify = (await import(`${tools.appName.toLowerCase()}.${adapter}/lib/convert.js`)).stringify;\n } catch {\n // OK\n }\n\n _getAllFilesInDir(objects, id, name, options, (errs, files) => {\n let count = 0;\n if (files) {\n const zip = new JSZip();\n for (const file of files) {\n count++;\n _addFile(objects, id, file, options, zip, async err => {\n if (!--count) {\n try {\n const base64 = await zip.generateAsync({ type: 'base64' });\n callback(err, base64);\n } catch (e) {\n callback(e.message);\n }\n }\n });\n }\n }\n\n if (!count) {\n callback(errs?.length ? new Error(errs.join(', ')) : null);\n }\n });\n}\n\ninterface CheckDirOptions {\n objects: ObjectsClient;\n id: string;\n root: string;\n parts: string[];\n options: any;\n}\n\n/**\n * Check that directory exists recursive\n *\n * @param _options directory information and objects db\n */\nasync function _checkDir(_options: CheckDirOptions): Promise<void> {\n const { parts, id, options, objects } = _options;\n let { root } = _options;\n\n if (!parts?.length) {\n return;\n }\n\n root += `/${parts.shift()}`;\n\n try {\n await objects.readDirAsync(id, root, options);\n } catch (e) {\n if (e.message === tools.ERRORS.ERROR_NOT_FOUND) {\n await objects.mkdirAsync(id, root, options);\n }\n }\n\n return _checkDir({ id, objects, options, root, parts });\n}\n\nasync function _writeOneFile(\n objects: ObjectsClient,\n zip: JSZip,\n id: string,\n name: string,\n filename: string,\n options: any,\n): Promise<void> {\n let data = await zip.files[filename].async('nodebuffer');\n\n if (options.parse) {\n data = options.parse(name, filename, data, options ? options.settings : null);\n }\n const fName = name + filename;\n const parts = fName.split('/');\n parts.pop();\n\n await _checkDir({ objects, id, root: '', parts, options });\n return objects.writeFileAsync(id, name + filename, data, options);\n}\n\nexport async function writeDirAsZip(\n objects: ObjectsClient,\n id: string,\n name: string,\n data: Buffer,\n options: any,\n): Promise<void> {\n const zip = new JSZip();\n\n options = options || {};\n\n let adapter = id;\n if (adapter.includes('.')) {\n adapter = id.split('.')[0];\n }\n\n // try to load processor of adapter\n try {\n options.parse = (await import(`${tools.appName.toLowerCase()}.${adapter}/lib/convert.js`)).parse;\n } catch {\n // OK\n }\n\n await zip.loadAsync(data);\n const errors = [];\n if (name[name.length - 1] !== '/') {\n name += '/';\n }\n for (const filename of Object.keys(zip.files)) {\n if (!filename || filename[filename.length - 1] === '/') {\n continue;\n }\n try {\n await _writeOneFile(objects, zip, id, name, filename, options);\n } catch (error) {\n errors.push(`Cannot write file \"${filename}\": ${error.toString()}`);\n }\n }\n if (errors.length) {\n throw new Error(errors.join(', '));\n }\n}\n\n// pack all files as zip and send it back\nexport async function readObjectsAsZip(\n objects: ObjectsClient,\n rootId: string,\n adapter: string,\n options: any = {},\n): Promise<string> {\n if (adapter) {\n // try to load processor of adapter\n try {\n options.stringify = (await import(`${tools.appName.toLowerCase()}.${adapter}/lib/convert.js`)).stringify;\n } catch {\n // OK\n }\n }\n\n const keys = await objects.getKeysAsync(`${rootId}.*`, options);\n if (!keys) {\n throw new Error('No matching keys found');\n }\n\n const objs = await objects.getObjectsAsync(keys, options);\n const zip = new JSZip();\n\n for (let f = 0; f < objs.length; f++) {\n let data: Record<string, any> = { id: keys[f], data: objs[f] };\n\n if (options.stringify) {\n try {\n data = options.stringify(data, options ? options.settings : null);\n } catch {\n data.id = `${keys[f].replace(/\\./g, '/').substring(rootId.length + 1)}.json`;\n }\n } else {\n data.id = `${keys[f].replace(/\\./g, '/').substring(rootId.length + 1)}.json`;\n }\n if (typeof data.data === 'object') {\n data.data = JSON.stringify(data.data, null, 2);\n }\n\n zip.file(data.id, data.data);\n }\n\n const base64 = await zip.generateAsync({ type: 'base64' });\n return base64;\n}\n\nasync function _writeOneObject(\n objects: ObjectsClient,\n zip: JSZip,\n rootId: string,\n filename: string,\n options: any,\n callback: (err?: Error | null) => void,\n): Promise<void> {\n try {\n const bufferData = await zip.files[filename].async('nodebuffer');\n let data: Record<string, any> = { data: bufferData.toString(), id: filename };\n if (options.parse) {\n try {\n data = options.parse(data, options ? options.settings : null);\n } catch (e) {\n callback(new Error(`Cannot custom parse \"${data.id}\": ${e}`));\n return;\n }\n } else {\n data.id = (rootId ? `${rootId}.` : '') + data.id.replace(/\\//g, '.').replace(/\\.json$/, '');\n }\n if (data && typeof data.data !== 'object') {\n try {\n data.data = JSON.parse(data.data);\n } catch (e) {\n callback(new Error(`Cannot parse \"${data.id}\": ${e.message}`));\n return;\n }\n }\n if (data && data.id && data.data) {\n options.ts = new Date().getTime();\n options.from = `system.host.${tools.getHostName()}.cli`;\n objects.setObject(data.id, data.data, options, err => callback(err));\n } else {\n if (data?.error) {\n callback(data.error);\n } else {\n callback();\n }\n }\n } catch (e) {\n callback(new Error(`Cannot parse unzip: ${e.message}`));\n }\n}\n\nexport async function writeObjectsAsZip(\n objects: ObjectsClient,\n rootId: string,\n adapter: string,\n data: Buffer,\n options: any,\n callback: (err?: Error | null) => void,\n): Promise<void> {\n options = options || {};\n\n if (adapter) {\n // try to load processor of adapter\n try {\n options.parse = (await import(`${tools.appName.toLowerCase()}.${adapter}/lib/convert.js`)).parse;\n } catch {\n // OK\n }\n }\n\n const zip = new JSZip();\n try {\n await zip.loadAsync(data);\n let count = 0;\n const error: string[] = [];\n for (const filename of Object.keys(zip.files)) {\n if (filename[filename.length - 1] === '/') {\n continue;\n }\n count++;\n _writeOneObject(objects, zip, rootId, filename, options, err => {\n if (err) {\n error.push(err.toString());\n }\n if (!--count && callback) {\n callback(error.length ? new Error(error.join(', ')) : null);\n // @ts-expect-error promisify later on\n callback = null;\n }\n });\n }\n } catch (e) {\n if (callback) {\n callback(e.toString());\n // @ts-expect-error promisify later on\n callback = null;\n }\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { tools } from '@iobroker/js-controller-common';\nimport JSZip from 'jszip';\nimport type { Client as ObjectsClient } from '@iobroker/db-objects-redis';\n\nfunction _getAllFilesInDir(\n objects: ObjectsClient,\n id: string,\n name: string,\n options: any,\n callback: (errs: null | string[], res: string[]) => void,\n result?: string[],\n): void {\n objects.readDir(id, name, options, (err, files) => {\n result = result || [];\n\n let count = 0;\n const errors: string[] = [];\n if (files) {\n for (const file of files) {\n if (file.isDir) {\n count++;\n _getAllFilesInDir(\n objects,\n id,\n `${name}/${file.file}`,\n options,\n (errs, _result) => {\n errs && errors.push(...errs);\n if (!--count) {\n callback(errors.length ? errors : null, _result);\n }\n },\n result,\n );\n } else {\n result.push(`${name}/${file.file}`);\n }\n }\n }\n\n if (!count) {\n callback(null, result);\n }\n });\n}\n\nfunction _addFile(\n objects: ObjectsClient,\n id: string,\n name: string,\n options: any,\n zip: JSZip,\n callback: (err: Error | null | undefined) => void,\n): void {\n objects.readFile(id, name, options, (err, data, _mime) => {\n if (err) {\n console.log(err);\n callback(new Error(`Cannot read file \"${name}\": ${err.message}`));\n } else {\n // if handler installed\n if (options.stringify) {\n try {\n data = options.stringify(name, data, options ? options.settings : null);\n } catch (e) {\n console.error(`Cannot stringify file \"${name}\": ${e.message}`);\n if (!err) {\n err = new Error(`Cannot stringify file \"${name}\": ${e.message}`);\n }\n }\n }\n const parts = name.split('/');\n if (parts.length > 1) {\n parts.shift();\n name = parts.join('/');\n }\n\n zip.file(name, data!);\n setImmediate(() => callback(err));\n }\n });\n}\n\n// pack all files as zip and send it back\nexport async function readDirAsZip(\n objects: ObjectsClient,\n id: string,\n name: string,\n options: any,\n callback: (err?: Error | null, base64?: string) => void,\n): Promise<void> {\n if (typeof options === 'function') {\n callback = options;\n options = null;\n }\n if (name[0] === '/') {\n name = name.substring(1);\n }\n options = options || {};\n let adapter = id;\n if (adapter.includes('.')) {\n adapter = id.split('.')[0]!;\n }\n\n // try to load processor of adapter\n try {\n options.stringify = (await import(`${tools.appName.toLowerCase()}.${adapter}/lib/convert.js`)).stringify;\n } catch {\n // OK\n }\n\n _getAllFilesInDir(objects, id, name, options, (errs, files) => {\n let count = 0;\n if (files) {\n const zip = new JSZip();\n for (const file of files) {\n count++;\n _addFile(objects, id, file, options, zip, async err => {\n if (!--count) {\n try {\n const base64 = await zip.generateAsync({ type: 'base64' });\n callback(err, base64);\n } catch (e) {\n callback(e.message);\n }\n }\n });\n }\n }\n\n if (!count) {\n callback(errs?.length ? new Error(errs.join(', ')) : null);\n }\n });\n}\n\ninterface CheckDirOptions {\n objects: ObjectsClient;\n id: string;\n root: string;\n parts: string[];\n options: any;\n}\n\n/**\n * Check that directory exists recursive\n *\n * @param _options directory information and objects db\n */\nasync function _checkDir(_options: CheckDirOptions): Promise<void> {\n const { parts, id, options, objects } = _options;\n let { root } = _options;\n\n if (!parts?.length) {\n return;\n }\n\n root += `/${parts.shift()}`;\n\n try {\n await objects.readDirAsync(id, root, options);\n } catch (e) {\n if (e.message === tools.ERRORS.ERROR_NOT_FOUND) {\n await objects.mkdirAsync(id, root, options);\n }\n }\n\n return _checkDir({ id, objects, options, root, parts });\n}\n\nasync function _writeOneFile(\n objects: ObjectsClient,\n zip: JSZip,\n id: string,\n name: string,\n filename: string,\n options: any,\n): Promise<void> {\n const zipFile = zip.files[filename];\n\n if (!zipFile) {\n throw new Error(`Cannot write file \"${filename}\", because JSZip instance is incomplete`);\n }\n\n let data = await zipFile.async('nodebuffer');\n\n if (options.parse) {\n data = options.parse(name, filename, data, options ? options.settings : null);\n }\n const fName = name + filename;\n const parts = fName.split('/');\n parts.pop();\n\n await _checkDir({ objects, id, root: '', parts, options });\n return objects.writeFileAsync(id, name + filename, data, options);\n}\n\nexport async function writeDirAsZip(\n objects: ObjectsClient,\n id: string,\n name: string,\n data: Buffer,\n options: any,\n): Promise<void> {\n const zip = new JSZip();\n\n options = options || {};\n\n let adapter = id;\n if (adapter.includes('.')) {\n adapter = id.split('.')[0]!;\n }\n\n // try to load processor of adapter\n try {\n options.parse = (await import(`${tools.appName.toLowerCase()}.${adapter}/lib/convert.js`)).parse;\n } catch {\n // OK\n }\n\n await zip.loadAsync(data);\n const errors = [];\n if (name[name.length - 1] !== '/') {\n name += '/';\n }\n for (const filename of Object.keys(zip.files)) {\n if (!filename || filename[filename.length - 1] === '/') {\n continue;\n }\n try {\n await _writeOneFile(objects, zip, id, name, filename, options);\n } catch (e) {\n errors.push(`Cannot write file \"${filename}\": ${e.toString()}`);\n }\n }\n if (errors.length) {\n throw new Error(errors.join(', '));\n }\n}\n\n// pack all files as zip and send it back\nexport async function readObjectsAsZip(\n objects: ObjectsClient,\n rootId: string,\n adapter: string,\n options: any = {},\n): Promise<string> {\n if (adapter) {\n // try to load processor of adapter\n try {\n options.stringify = (await import(`${tools.appName.toLowerCase()}.${adapter}/lib/convert.js`)).stringify;\n } catch {\n // OK\n }\n }\n\n const keys = await objects.getKeysAsync(`${rootId}.*`, options);\n if (!keys) {\n throw new Error('No matching keys found');\n }\n\n const objs = await objects.getObjectsAsync(keys, options);\n const zip = new JSZip();\n\n for (const obj of objs) {\n const id = obj._id;\n\n let data: Record<string, any> = { id, data: obj };\n\n if (options.stringify) {\n try {\n data = options.stringify(data, options ? options.settings : null);\n } catch {\n data.id = `${id.replace(/\\./g, '/').substring(rootId.length + 1)}.json`;\n }\n } else {\n data.id = `${id.replace(/\\./g, '/').substring(rootId.length + 1)}.json`;\n }\n if (typeof data.data === 'object') {\n data.data = JSON.stringify(data.data, null, 2);\n }\n\n zip.file(data.id, data.data);\n }\n\n const base64 = await zip.generateAsync({ type: 'base64' });\n return base64;\n}\n\nasync function _writeOneObject(\n objects: ObjectsClient,\n zip: JSZip,\n rootId: string,\n filename: string,\n options: any,\n): Promise<void> {\n const zipFile = zip.files[filename];\n\n if (!zipFile) {\n throw new Error(`Cannot write file \"${filename}\", because JSZip instance is incomplete`);\n }\n\n const bufferData = await zipFile.async('nodebuffer');\n let data: Record<string, any> = { data: bufferData.toString(), id: filename };\n if (options.parse) {\n try {\n data = options.parse(data, options ? options.settings : null);\n } catch (e) {\n throw new Error(`Cannot custom parse \"${data.id}\": ${e}`);\n }\n } else {\n data.id = (rootId ? `${rootId}.` : '') + data.id.replace(/\\//g, '.').replace(/\\.json$/, '');\n }\n if (data && typeof data.data !== 'object') {\n try {\n data.data = JSON.parse(data.data);\n } catch (e) {\n throw new Error(`Cannot parse \"${data.id}\": ${e.message}`);\n }\n }\n if (data && data.id && data.data) {\n options.ts = new Date().getTime();\n options.from = `system.host.${tools.getHostName()}.cli`;\n await objects.setObject(data.id, data.data, options);\n return;\n }\n\n if (data?.error) {\n throw data.error;\n }\n}\n\nexport async function writeObjectsAsZip(\n objects: ObjectsClient,\n rootId: string,\n adapter: string,\n data: Buffer,\n options: any,\n callback: (err?: Error | null) => void,\n): Promise<void> {\n options = options || {};\n\n if (adapter) {\n // try to load processor of adapter\n try {\n options.parse = (await import(`${tools.appName.toLowerCase()}.${adapter}/lib/convert.js`)).parse;\n } catch {\n // OK\n }\n }\n\n const zip = new JSZip();\n const error: string[] = [];\n\n try {\n await zip.loadAsync(data);\n for (const filename of Object.keys(zip.files)) {\n if (filename[filename.length - 1] === '/') {\n continue;\n }\n\n try {\n await _writeOneObject(objects, zip, rootId, filename, options);\n } catch (e) {\n error.push(e.toString());\n }\n }\n } catch (e) {\n callback(e.toString());\n return;\n }\n\n callback(error.length ? new Error(error.join(', ')) : null);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["JSZip"]
7
7
  }
@@ -9,13 +9,20 @@ import type { Client as StatesInRedisClient } from '@iobroker/db-states-redis';
9
9
  import type { Client as ObjectsInRedisClient } from '@iobroker/db-objects-redis';
10
10
  import type Winston from 'winston';
11
11
  type MultilingualObject = Exclude<ioBroker.StringOrTranslated, string>;
12
+ /** Settings to configure an instance of NotificationHandler */
12
13
  export interface NotificationHandlerSettings {
14
+ /** Name of the host (not id - hence, without `system.host.` prefix) */
13
15
  host: string;
16
+ /** States DB instance */
14
17
  states: StatesInRedisClient;
18
+ /** Objects DB instance */
15
19
  objects: ObjectsInRedisClient;
20
+ /** Logger instance */
16
21
  log: Winston.Logger | Console;
22
+ /** Prefix for the log messages */
17
23
  logPrefix: string;
18
24
  }
25
+ /** A notification config entry represents the top level of the notification structure */
19
26
  export interface NotificationsConfigEntry {
20
27
  /** e.g. system */
21
28
  scope: string;
@@ -23,16 +30,23 @@ export interface NotificationsConfigEntry {
23
30
  name: MultilingualObject;
24
31
  /** multilingual description */
25
32
  description: MultilingualObject;
33
+ /** The notification categories inside this scope */
26
34
  categories: CategoryConfigEntry[];
27
35
  }
28
36
  export type Severity = 'info' | 'notify' | 'alert';
37
+ /** A notification category entry represents one of the categories of a scope */
29
38
  export interface CategoryConfigEntry {
39
+ /** Id of the category */
30
40
  category: string;
41
+ /** Name of the category */
31
42
  name: MultilingualObject;
32
43
  /** Allows defining the severity of the notification with `info` being the lowest, `notify` representing middle priority, `alert` representing high priority and often containing critical information */
33
44
  severity: Severity;
45
+ /** Description of the category */
34
46
  description: MultilingualObject;
47
+ /** Regex where `console.error` output is parsed against to check if a notification of this category should be generated */
35
48
  regex: string[];
49
+ /** Restrict the maximum number of messages for this category */
36
50
  limit: number;
37
51
  }
38
52
  interface NotificationMessageObject {
@@ -40,24 +54,27 @@ interface NotificationMessageObject {
40
54
  ts: number;
41
55
  contextData?: ioBroker.NotificationContextData;
42
56
  }
43
- export interface FilteredNotificationInformation {
44
- [scope: string]: {
45
- description: MultilingualObject;
46
- name: MultilingualObject;
47
- categories: {
48
- [category: string]: {
49
- description: MultilingualObject;
50
- name: MultilingualObject;
51
- severity: Severity;
52
- instances: {
53
- [instance: string]: {
54
- messages: NotificationMessageObject[];
55
- };
56
- };
57
- };
57
+ interface FilteredNotificationCategory {
58
+ description: MultilingualObject;
59
+ name: MultilingualObject;
60
+ severity: Severity;
61
+ instances: {
62
+ [instance: string]: {
63
+ messages: NotificationMessageObject[];
58
64
  };
59
65
  };
60
66
  }
67
+ interface FilteredNotificationScope {
68
+ description: MultilingualObject;
69
+ name: MultilingualObject;
70
+ categories: {
71
+ [category: string]: FilteredNotificationCategory;
72
+ };
73
+ }
74
+ /** The filtered information as a response for `getFilteredInformation` */
75
+ export interface FilteredNotificationInformation {
76
+ [scope: string]: FilteredNotificationScope;
77
+ }
61
78
  interface AddMessageOptions {
62
79
  /** Scope of the message */
63
80
  scope: string;
@@ -70,6 +87,9 @@ interface AddMessageOptions {
70
87
  /** Additional context for the notification which can be used by notification processing adapters */
71
88
  contextData?: ioBroker.NotificationContextData;
72
89
  }
90
+ /**
91
+ * The Notification handler class provides an interface to manage the ioBroker notification system
92
+ */
73
93
  export declare class NotificationHandler {
74
94
  private states;
75
95
  private objects;
@@ -79,6 +99,11 @@ export declare class NotificationHandler {
79
99
  private readonly setup;
80
100
  private readonly logPrefix;
81
101
  private readonly host;
102
+ /**
103
+ * Creates a new instance of the notification handler class
104
+ *
105
+ * @param settings settings to configure the handler instance
106
+ */
82
107
  constructor(settings: NotificationHandlerSettings);
83
108
  /**
84
109
  * Get all adapter instances on this host and store their notifications config - and clears up removed instances notifications - should be called once after init
@@ -1 +1 @@
1
- {"version":3,"file":"notificationHandler.d.ts","sourceRoot":"","sources":["../../../../src/lib/common/notificationHandler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"notificationHandler.d.ts","sourceRoot":"","sources":["../../../../src/lib/common/notificationHandler.ts"],"names":[],"mappings":"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"}