iobroker.eusec 1.2.0 → 1.3.0

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/lib/log.js CHANGED
@@ -22,6 +22,7 @@ __export(log_exports, {
22
22
  });
23
23
  module.exports = __toCommonJS(log_exports);
24
24
  class ioBrokerLogger {
25
+ log;
25
26
  constructor(log) {
26
27
  this.log = log;
27
28
  }
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/lib/log.ts"],
4
4
  "sourcesContent": ["import { Logger } from \"ts-log\";\r\n\r\nexport class ioBrokerLogger implements Logger {\r\n\r\n private readonly log: ioBroker.Logger;\r\n\r\n public constructor(log: ioBroker.Logger) {\r\n this.log = log;\r\n }\r\n\r\n private _getStack(): any {\r\n const _prepareStackTrace = Error.prepareStackTrace;\r\n Error.prepareStackTrace = (_, stack) => stack;\r\n const stack = new Error().stack?.slice(3);\r\n Error.prepareStackTrace = _prepareStackTrace;\r\n return stack;\r\n }\r\n\r\n private _getMessage(message?: string, hideTag = false, optionalParams?: any[]): string {\r\n const msg = message ? message : \"\";\r\n const stack = this._getStack();\r\n const typeName = stack[0].getTypeName() !== null ? stack[0].getTypeName() : \"\";\r\n const functionName = stack[0].getFunctionName() !== null ? `${stack[0].getFunctionName()}` : \"\";\r\n let tag = \"\";\r\n if (typeName !== \"\" && !hideTag) {\r\n tag = `[${typeName}`;\r\n if (functionName !== \"\") {\r\n tag = `${tag}.${functionName}] `;\r\n } else {\r\n tag = `${tag}] `;\r\n }\r\n }\r\n\r\n if (optionalParams && optionalParams.length > 0) {\r\n return `${tag}${msg} ${JSON.stringify(optionalParams)}`;\r\n }\r\n return `${tag}${msg}`;\r\n }\r\n\r\n public trace(message?: string, ...optionalParams: any[]): void {\r\n this.log.silly(this._getMessage(message, false, optionalParams));\r\n }\r\n\r\n public debug(message?: string, ...optionalParams: any[]): void {\r\n this.log.debug(this._getMessage(message, false, optionalParams));\r\n }\r\n\r\n public info(message?: string, ...optionalParams: any[]): void {\r\n this.log.info(this._getMessage(message, true, optionalParams));\r\n }\r\n\r\n public warn(message?: string, ...optionalParams: any[]): void {\r\n this.log.warn(this._getMessage(message, true, optionalParams));\r\n }\r\n\r\n public error(message?: string, ...optionalParams: any[]): void {\r\n this.log.error(this._getMessage(message, true, optionalParams));\r\n }\r\n\r\n}"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,MAAM,eAAiC;AAAA,EAInC,YAAY,KAAsB;AACrC,SAAK,MAAM;AAAA,EACf;AAAA,EAEQ,YAAiB;AAV7B;AAWQ,UAAM,qBAAqB,MAAM;AACjC,UAAM,oBAAoB,CAAC,GAAGA,WAAUA;AACxC,UAAM,SAAQ,SAAI,MAAM,EAAE,UAAZ,mBAAmB,MAAM;AACvC,UAAM,oBAAoB;AAC1B,WAAO;AAAA,EACX;AAAA,EAEQ,YAAY,SAAkB,UAAU,OAAO,gBAAgC;AACnF,UAAM,MAAM,UAAU,UAAU;AAChC,UAAM,QAAQ,KAAK,UAAU;AAC7B,UAAM,WAAW,MAAM,GAAG,YAAY,MAAM,OAAO,MAAM,GAAG,YAAY,IAAI;AAC5E,UAAM,eAAe,MAAM,GAAG,gBAAgB,MAAM,OAAO,GAAG,MAAM,GAAG,gBAAgB,MAAM;AAC7F,QAAI,MAAM;AACV,QAAI,aAAa,MAAM,CAAC,SAAS;AAC7B,YAAM,IAAI;AACV,UAAI,iBAAiB,IAAI;AACrB,cAAM,GAAG,OAAO;AAAA,MACpB,OAAO;AACH,cAAM,GAAG;AAAA,MACb;AAAA,IACJ;AAEA,QAAI,kBAAkB,eAAe,SAAS,GAAG;AAC7C,aAAO,GAAG,MAAM,OAAO,KAAK,UAAU,cAAc;AAAA,IACxD;AACA,WAAO,GAAG,MAAM;AAAA,EACpB;AAAA,EAEO,MAAM,YAAqB,gBAA6B;AAC3D,SAAK,IAAI,MAAM,KAAK,YAAY,SAAS,OAAO,cAAc,CAAC;AAAA,EACnE;AAAA,EAEO,MAAM,YAAqB,gBAA6B;AAC3D,SAAK,IAAI,MAAM,KAAK,YAAY,SAAS,OAAO,cAAc,CAAC;AAAA,EACnE;AAAA,EAEO,KAAK,YAAqB,gBAA6B;AAC1D,SAAK,IAAI,KAAK,KAAK,YAAY,SAAS,MAAM,cAAc,CAAC;AAAA,EACjE;AAAA,EAEO,KAAK,YAAqB,gBAA6B;AAC1D,SAAK,IAAI,KAAK,KAAK,YAAY,SAAS,MAAM,cAAc,CAAC;AAAA,EACjE;AAAA,EAEO,MAAM,YAAqB,gBAA6B;AAC3D,SAAK,IAAI,MAAM,KAAK,YAAY,SAAS,MAAM,cAAc,CAAC;AAAA,EAClE;AAEJ;",
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,MAAM,eAAiC;AAAA,EAEzB;AAAA,EAEV,YAAY,KAAsB;AACrC,SAAK,MAAM;AAAA,EACf;AAAA,EAEQ,YAAiB;AAV7B;AAWQ,UAAM,qBAAqB,MAAM;AACjC,UAAM,oBAAoB,CAAC,GAAGA,WAAUA;AACxC,UAAM,SAAQ,SAAI,MAAM,EAAE,UAAZ,mBAAmB,MAAM;AACvC,UAAM,oBAAoB;AAC1B,WAAO;AAAA,EACX;AAAA,EAEQ,YAAY,SAAkB,UAAU,OAAO,gBAAgC;AACnF,UAAM,MAAM,UAAU,UAAU;AAChC,UAAM,QAAQ,KAAK,UAAU;AAC7B,UAAM,WAAW,MAAM,CAAC,EAAE,YAAY,MAAM,OAAO,MAAM,CAAC,EAAE,YAAY,IAAI;AAC5E,UAAM,eAAe,MAAM,CAAC,EAAE,gBAAgB,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,gBAAgB,CAAC,KAAK;AAC7F,QAAI,MAAM;AACV,QAAI,aAAa,MAAM,CAAC,SAAS;AAC7B,YAAM,IAAI,QAAQ;AAClB,UAAI,iBAAiB,IAAI;AACrB,cAAM,GAAG,GAAG,IAAI,YAAY;AAAA,MAChC,OAAO;AACH,cAAM,GAAG,GAAG;AAAA,MAChB;AAAA,IACJ;AAEA,QAAI,kBAAkB,eAAe,SAAS,GAAG;AAC7C,aAAO,GAAG,GAAG,GAAG,GAAG,IAAI,KAAK,UAAU,cAAc,CAAC;AAAA,IACzD;AACA,WAAO,GAAG,GAAG,GAAG,GAAG;AAAA,EACvB;AAAA,EAEO,MAAM,YAAqB,gBAA6B;AAC3D,SAAK,IAAI,MAAM,KAAK,YAAY,SAAS,OAAO,cAAc,CAAC;AAAA,EACnE;AAAA,EAEO,MAAM,YAAqB,gBAA6B;AAC3D,SAAK,IAAI,MAAM,KAAK,YAAY,SAAS,OAAO,cAAc,CAAC;AAAA,EACnE;AAAA,EAEO,KAAK,YAAqB,gBAA6B;AAC1D,SAAK,IAAI,KAAK,KAAK,YAAY,SAAS,MAAM,cAAc,CAAC;AAAA,EACjE;AAAA,EAEO,KAAK,YAAqB,gBAA6B;AAC1D,SAAK,IAAI,KAAK,KAAK,YAAY,SAAS,MAAM,cAAc,CAAC;AAAA,EACjE;AAAA,EAEO,MAAM,YAAqB,gBAA6B;AAC3D,SAAK,IAAI,MAAM,KAAK,YAAY,SAAS,MAAM,cAAc,CAAC;AAAA,EAClE;AAEJ;",
6
6
  "names": ["stack"]
7
7
  }
@@ -28,10 +28,7 @@ __export(types_exports, {
28
28
  module.exports = __toCommonJS(types_exports);
29
29
  var import_eufy_security_client = require("eufy-security-client");
30
30
  const DataLocation = {
31
- LIVESTREAM: "live",
32
- LAST_LIVESTREAM: "last_live",
33
- LAST_EVENT: "last_event",
34
- TEMP: "tmp"
31
+ LAST_EVENT: "last_event"
35
32
  };
36
33
  const STREAM_FILE_NAME_EXT = ".m3u8";
37
34
  const IMAGE_FILE_JPEG_EXT = ".jpg";
@@ -60,6 +57,9 @@ const RoleMapping = {
60
57
  [import_eufy_security_client.PropertyName.DeviceChargingStatus]: "info.status"
61
58
  };
62
59
  const DeviceStateID = {
60
+ /*LAST_EVENT_PIC_URL: "last_event_pic_url",
61
+ LAST_EVENT_PIC_HTML: "last_event_pic_html",
62
+ LAST_EVENT_VIDEO_URL: "last_event_video_url",*/
63
63
  LIVESTREAM: "livestream",
64
64
  START_STREAM: "start_stream",
65
65
  STOP_STREAM: "stop_stream",
@@ -77,7 +77,8 @@ const DeviceStateID = {
77
77
  SET_DEFAULT_ANGLE: "set_default_angle",
78
78
  SET_PRIVACY_ANGLE: "set_privacy_angle",
79
79
  CALIBRATE: "calibrate",
80
- UNLOCK: "unlock"
80
+ UNLOCK: "unlock",
81
+ OPEN_BOX: "open_box"
81
82
  };
82
83
  const StationStateID = {
83
84
  REBOOT: "reboot",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/lib/types.ts"],
4
- "sourcesContent": ["import { PropertyName } from \"eufy-security-client\";\r\n\r\nimport { IRoleMapping } from \"./interfaces\";\r\n\r\nexport const DataLocation = {\r\n LIVESTREAM: \"live\",\r\n LAST_LIVESTREAM: \"last_live\",\r\n LAST_EVENT: \"last_event\",\r\n TEMP: \"tmp\"\r\n}\r\n\r\nexport const STREAM_FILE_NAME_EXT = \".m3u8\";\r\nexport const IMAGE_FILE_JPEG_EXT = \".jpg\";\r\n\r\nexport const RoleMapping: IRoleMapping = {\r\n [PropertyName.Name]: \"info.name\",\r\n [PropertyName.StationMacAddress]: \"info.mac\",\r\n [PropertyName.StationLANIpAddress]: \"info.ip\",\r\n [PropertyName.DeviceState]: \"info.status\",\r\n [PropertyName.DeviceBattery]: \"value.battery\",\r\n [PropertyName.DeviceBatteryTemp]: \"value.temperature\",\r\n [PropertyName.DeviceMotionDetected]: \"sensor.motion\",\r\n [PropertyName.DevicePersonDetected]: \"sensor.motion\",\r\n [PropertyName.DeviceRinging]: \"sensor\",\r\n [PropertyName.DeviceCryingDetected]: \"sensor.noise\",\r\n [PropertyName.DeviceSoundDetected]: \"sensor.noise\",\r\n [PropertyName.DevicePetDetected]: \"sensor\",\r\n [PropertyName.DeviceSensorOpen]: \"sensor\",\r\n [PropertyName.DeviceBatteryLow]: \"indicator.lowbat\",\r\n [PropertyName.DeviceLockStatus]: \"info.status\",\r\n [PropertyName.DeviceDogLickDetected]: \"sensor\",\r\n [PropertyName.DeviceDogPoopDetected]: \"sensor\",\r\n [PropertyName.DeviceVehicleDetected]: \"sensor\",\r\n [PropertyName.DeviceRadarMotionDetected]: \"sensor.motion\",\r\n [PropertyName.DeviceStrangerPersonDetected]: \"sensor.motion\",\r\n [PropertyName.DeviceIdentityPersonDetected]: \"sensor.motion\",\r\n [PropertyName.DeviceChargingStatus]: \"info.status\",\r\n}\r\n\r\nexport const DeviceStateID = {\r\n /*LAST_EVENT_PIC_URL: \"last_event_pic_url\",\r\n LAST_EVENT_PIC_HTML: \"last_event_pic_html\",\r\n LAST_EVENT_VIDEO_URL: \"last_event_video_url\",*/\r\n LIVESTREAM: \"livestream\",\r\n START_STREAM: \"start_stream\",\r\n STOP_STREAM: \"stop_stream\",\r\n RTSP_STREAM_URL: \"rtsp_stream_url\",\r\n TRIGGER_ALARM_SOUND: \"trigger_alarm_sound\",\r\n RESET_ALARM_SOUND: \"reset_alarm_sound\",\r\n PICTURE_URL: \"picture_url\",\r\n PICTURE_HTML: \"picture_html\",\r\n LIVESTREAM_RTSP: \"livestream_rtsp\",\r\n PAN_LEFT: \"pan_left\",\r\n PAN_RIGHT: \"pan_right\",\r\n TILT_UP: \"tilt_up\",\r\n TILT_DOWN: \"titl_down\",\r\n ROTATE_360: \"rotate_360\",\r\n SET_DEFAULT_ANGLE: \"set_default_angle\",\r\n SET_PRIVACY_ANGLE: \"set_privacy_angle\",\r\n CALIBRATE: \"calibrate\",\r\n UNLOCK: \"unlock\",\r\n}\r\n\r\nexport const StationStateID = {\r\n REBOOT: \"reboot\",\r\n CONNECTION: \"connection\",\r\n TRIGGER_ALARM_SOUND: \"trigger_alarm_sound\",\r\n RESET_ALARM_SOUND: \"reset_alarm_sound\",\r\n}"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAA6B;AAItB,MAAM,eAAe;AAAA,EACxB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,MAAM;AACV;AAEO,MAAM,uBAAuB;AAC7B,MAAM,sBAAsB;AAE5B,MAAM,cAA4B;AAAA,EACrC,CAAC,yCAAa,OAAO;AAAA,EACrB,CAAC,yCAAa,oBAAoB;AAAA,EAClC,CAAC,yCAAa,sBAAsB;AAAA,EACpC,CAAC,yCAAa,cAAc;AAAA,EAC5B,CAAC,yCAAa,gBAAgB;AAAA,EAC9B,CAAC,yCAAa,oBAAoB;AAAA,EAClC,CAAC,yCAAa,uBAAuB;AAAA,EACrC,CAAC,yCAAa,uBAAuB;AAAA,EACrC,CAAC,yCAAa,gBAAgB;AAAA,EAC9B,CAAC,yCAAa,uBAAuB;AAAA,EACrC,CAAC,yCAAa,sBAAsB;AAAA,EACpC,CAAC,yCAAa,oBAAoB;AAAA,EAClC,CAAC,yCAAa,mBAAmB;AAAA,EACjC,CAAC,yCAAa,mBAAmB;AAAA,EACjC,CAAC,yCAAa,mBAAmB;AAAA,EACjC,CAAC,yCAAa,wBAAwB;AAAA,EACtC,CAAC,yCAAa,wBAAwB;AAAA,EACtC,CAAC,yCAAa,wBAAwB;AAAA,EACtC,CAAC,yCAAa,4BAA4B;AAAA,EAC1C,CAAC,yCAAa,+BAA+B;AAAA,EAC7C,CAAC,yCAAa,+BAA+B;AAAA,EAC7C,CAAC,yCAAa,uBAAuB;AACzC;AAEO,MAAM,gBAAgB;AAAA,EAIzB,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,WAAW;AAAA,EACX,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,WAAW;AAAA,EACX,QAAQ;AACZ;AAEO,MAAM,iBAAiB;AAAA,EAC1B,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,qBAAqB;AAAA,EACrB,mBAAmB;AACvB;",
4
+ "sourcesContent": ["import { PropertyName } from \"eufy-security-client\";\r\n\r\nimport { IRoleMapping } from \"./interfaces\";\r\n\r\nexport const DataLocation = {\r\n LAST_EVENT: \"last_event\",\r\n}\r\n\r\nexport const STREAM_FILE_NAME_EXT = \".m3u8\";\r\nexport const IMAGE_FILE_JPEG_EXT = \".jpg\";\r\n\r\nexport const RoleMapping: IRoleMapping = {\r\n [PropertyName.Name]: \"info.name\",\r\n [PropertyName.StationMacAddress]: \"info.mac\",\r\n [PropertyName.StationLANIpAddress]: \"info.ip\",\r\n [PropertyName.DeviceState]: \"info.status\",\r\n [PropertyName.DeviceBattery]: \"value.battery\",\r\n [PropertyName.DeviceBatteryTemp]: \"value.temperature\",\r\n [PropertyName.DeviceMotionDetected]: \"sensor.motion\",\r\n [PropertyName.DevicePersonDetected]: \"sensor.motion\",\r\n [PropertyName.DeviceRinging]: \"sensor\",\r\n [PropertyName.DeviceCryingDetected]: \"sensor.noise\",\r\n [PropertyName.DeviceSoundDetected]: \"sensor.noise\",\r\n [PropertyName.DevicePetDetected]: \"sensor\",\r\n [PropertyName.DeviceSensorOpen]: \"sensor\",\r\n [PropertyName.DeviceBatteryLow]: \"indicator.lowbat\",\r\n [PropertyName.DeviceLockStatus]: \"info.status\",\r\n [PropertyName.DeviceDogLickDetected]: \"sensor\",\r\n [PropertyName.DeviceDogPoopDetected]: \"sensor\",\r\n [PropertyName.DeviceVehicleDetected]: \"sensor\",\r\n [PropertyName.DeviceRadarMotionDetected]: \"sensor.motion\",\r\n [PropertyName.DeviceStrangerPersonDetected]: \"sensor.motion\",\r\n [PropertyName.DeviceIdentityPersonDetected]: \"sensor.motion\",\r\n [PropertyName.DeviceChargingStatus]: \"info.status\",\r\n}\r\n\r\nexport const DeviceStateID = {\r\n /*LAST_EVENT_PIC_URL: \"last_event_pic_url\",\r\n LAST_EVENT_PIC_HTML: \"last_event_pic_html\",\r\n LAST_EVENT_VIDEO_URL: \"last_event_video_url\",*/\r\n LIVESTREAM: \"livestream\",\r\n START_STREAM: \"start_stream\",\r\n STOP_STREAM: \"stop_stream\",\r\n RTSP_STREAM_URL: \"rtsp_stream_url\",\r\n TRIGGER_ALARM_SOUND: \"trigger_alarm_sound\",\r\n RESET_ALARM_SOUND: \"reset_alarm_sound\",\r\n PICTURE_URL: \"picture_url\",\r\n PICTURE_HTML: \"picture_html\",\r\n LIVESTREAM_RTSP: \"livestream_rtsp\",\r\n PAN_LEFT: \"pan_left\",\r\n PAN_RIGHT: \"pan_right\",\r\n TILT_UP: \"tilt_up\",\r\n TILT_DOWN: \"titl_down\",\r\n ROTATE_360: \"rotate_360\",\r\n SET_DEFAULT_ANGLE: \"set_default_angle\",\r\n SET_PRIVACY_ANGLE: \"set_privacy_angle\",\r\n CALIBRATE: \"calibrate\",\r\n UNLOCK: \"unlock\",\r\n OPEN_BOX: \"open_box\",\r\n}\r\n\r\nexport const StationStateID = {\r\n REBOOT: \"reboot\",\r\n CONNECTION: \"connection\",\r\n TRIGGER_ALARM_SOUND: \"trigger_alarm_sound\",\r\n RESET_ALARM_SOUND: \"reset_alarm_sound\",\r\n}"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAA6B;AAItB,MAAM,eAAe;AAAA,EACxB,YAAY;AAChB;AAEO,MAAM,uBAAuB;AAC7B,MAAM,sBAAsB;AAE5B,MAAM,cAA4B;AAAA,EACrC,CAAC,yCAAa,IAAI,GAAG;AAAA,EACrB,CAAC,yCAAa,iBAAiB,GAAG;AAAA,EAClC,CAAC,yCAAa,mBAAmB,GAAG;AAAA,EACpC,CAAC,yCAAa,WAAW,GAAG;AAAA,EAC5B,CAAC,yCAAa,aAAa,GAAG;AAAA,EAC9B,CAAC,yCAAa,iBAAiB,GAAG;AAAA,EAClC,CAAC,yCAAa,oBAAoB,GAAG;AAAA,EACrC,CAAC,yCAAa,oBAAoB,GAAG;AAAA,EACrC,CAAC,yCAAa,aAAa,GAAG;AAAA,EAC9B,CAAC,yCAAa,oBAAoB,GAAG;AAAA,EACrC,CAAC,yCAAa,mBAAmB,GAAG;AAAA,EACpC,CAAC,yCAAa,iBAAiB,GAAG;AAAA,EAClC,CAAC,yCAAa,gBAAgB,GAAG;AAAA,EACjC,CAAC,yCAAa,gBAAgB,GAAG;AAAA,EACjC,CAAC,yCAAa,gBAAgB,GAAG;AAAA,EACjC,CAAC,yCAAa,qBAAqB,GAAG;AAAA,EACtC,CAAC,yCAAa,qBAAqB,GAAG;AAAA,EACtC,CAAC,yCAAa,qBAAqB,GAAG;AAAA,EACtC,CAAC,yCAAa,yBAAyB,GAAG;AAAA,EAC1C,CAAC,yCAAa,4BAA4B,GAAG;AAAA,EAC7C,CAAC,yCAAa,4BAA4B,GAAG;AAAA,EAC7C,CAAC,yCAAa,oBAAoB,GAAG;AACzC;AAEO,MAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA,EAIzB,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,WAAW;AAAA,EACX,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AACd;AAEO,MAAM,iBAAiB;AAAA,EAC1B,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,qBAAqB;AAAA,EACrB,mBAAmB;AACvB;",
6
6
  "names": []
7
7
  }
@@ -18,6 +18,10 @@ var __copyProps = (to, from, except, desc) => {
18
18
  return to;
19
19
  };
20
20
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
21
25
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
26
  mod
23
27
  ));
@@ -27,13 +31,12 @@ __export(utils_exports, {
27
31
  changeRole: () => changeRole,
28
32
  convertCamelCaseToSnakeCase: () => convertCamelCaseToSnakeCase,
29
33
  deleteStates: () => deleteStates,
30
- getDataFilePath: () => getDataFilePath,
31
34
  getImageAsHTML: () => getImageAsHTML,
35
+ getShortUrl: () => getShortUrl,
32
36
  getVideoClipLength: () => getVideoClipLength,
33
37
  handleUpdate: () => handleUpdate,
34
38
  isEmpty: () => isEmpty,
35
39
  lowestUnusedNumber: () => lowestUnusedNumber,
36
- moveFiles: () => moveFiles,
37
40
  removeFiles: () => removeFiles,
38
41
  removeLastChar: () => removeLastChar,
39
42
  setStateAsync: () => setStateAsync,
@@ -61,13 +64,6 @@ const getImageAsHTML = function(data, mime = "image/jpg") {
61
64
  return `<img src="data:${mime};base64,${data.toString("base64")}" style="width: auto ;height: 100%;" />`;
62
65
  return "";
63
66
  };
64
- const getDataFilePath = function(adapter, stationSerial, folderName, fileName) {
65
- const dir_path = import_path.default.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, folderName);
66
- if (!import_fs_extra.default.existsSync(dir_path)) {
67
- import_fs_extra.default.mkdirSync(dir_path, { mode: 509, recursive: true });
68
- }
69
- return import_path.default.join(dir_path, fileName);
70
- };
71
67
  const setStateAsync = async function(adapter, state_id, common_name, value, role = "text", type = "string") {
72
68
  await adapter.setObjectNotExistsAsync(state_id, {
73
69
  type: "state",
@@ -83,34 +79,13 @@ const setStateAsync = async function(adapter, state_id, common_name, value, role
83
79
  await adapter.setStateAsync(state_id, { val: value, ack: true });
84
80
  };
85
81
  const removeFiles = function(adapter, stationSerial, folderName, device_sn) {
86
- return new Promise((resolve, reject) => {
87
- try {
88
- const dir_path = import_path.default.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, folderName);
89
- if (import_fs_extra.default.existsSync(dir_path)) {
90
- const files = import_fs_extra.default.readdirSync(dir_path).filter((fn) => fn.startsWith(device_sn));
91
- try {
92
- files.map((filename) => import_fs_extra.default.removeSync(import_path.default.join(dir_path, filename)));
93
- } catch (error) {
94
- }
95
- }
96
- resolve();
97
- } catch (error) {
98
- reject(error);
99
- }
100
- });
101
- };
102
- const moveFiles = function(adapter, stationSerial, device_sn, srcFolderName, dstFolderName) {
103
- return new Promise((resolve, reject) => {
82
+ return new Promise(async (resolve, reject) => {
104
83
  try {
105
- const dirSrcPath = import_path.default.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, srcFolderName);
106
- const dirDstPath = import_path.default.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, dstFolderName);
107
- if (!import_fs_extra.default.existsSync(dirDstPath)) {
108
- import_fs_extra.default.mkdirSync(dirDstPath, { mode: 509, recursive: true });
109
- }
110
- if (import_fs_extra.default.existsSync(dirSrcPath)) {
111
- const files = import_fs_extra.default.readdirSync(dirSrcPath).filter((fn) => fn.startsWith(device_sn));
84
+ const dir_path = import_path.default.join(stationSerial, folderName);
85
+ if (await adapter.fileExistsAsync(adapter.namespace, dir_path)) {
86
+ const files = (await adapter.readDirAsync(adapter.namespace, dir_path)).filter((fn) => fn.file.startsWith(device_sn));
112
87
  try {
113
- files.map((filename) => import_fs_extra.default.moveSync(import_path.default.join(dirSrcPath, filename), import_path.default.join(dirDstPath, filename)));
88
+ files.map((filename) => adapter.delFileAsync(adapter.namespace, import_path.default.join(dir_path, filename.file)));
114
89
  } catch (error) {
115
90
  }
116
91
  }
@@ -189,8 +164,8 @@ const deleteStates = async function(adapter, property) {
189
164
  await adapter.delObjectAsync(id).catch();
190
165
  });
191
166
  };
192
- const handleUpdate = async function(adapter, log, old_version) {
193
- if (old_version <= 0.61) {
167
+ const handleUpdate = async function(adapter, log, oldVersion, newVersion) {
168
+ if (oldVersion != 0 && oldVersion <= 0.61) {
194
169
  try {
195
170
  const all = await adapter.getStatesAsync("T*");
196
171
  if (all) {
@@ -216,7 +191,7 @@ const handleUpdate = async function(adapter, log, old_version) {
216
191
  log.error("Version 0.6.1: Error:", error);
217
192
  }
218
193
  }
219
- if (old_version <= 0.74) {
194
+ if (oldVersion != 0 && oldVersion <= 0.74) {
220
195
  try {
221
196
  await adapter.setObjectAsync("verify_code", {
222
197
  type: "state",
@@ -233,7 +208,7 @@ const handleUpdate = async function(adapter, log, old_version) {
233
208
  log.error("Version 0.7.4: Error:", error);
234
209
  }
235
210
  }
236
- if (old_version <= 1) {
211
+ if (oldVersion != 0 && oldVersion <= 1) {
237
212
  for (const state of ["last_event_pic_url", "last_event_pic_html", "last_event_video_url"]) {
238
213
  try {
239
214
  await deleteStates(adapter, state);
@@ -242,24 +217,59 @@ const handleUpdate = async function(adapter, log, old_version) {
242
217
  }
243
218
  }
244
219
  }
220
+ if (oldVersion == 0 && newVersion == 1.3) {
221
+ const data_dir = utils.getAbsoluteInstanceDataDir(adapter);
222
+ try {
223
+ const file = import_path.default.join(data_dir, "adapter.json");
224
+ if (import_fs_extra.default.statSync(file).isFile()) {
225
+ const fileContent = import_fs_extra.default.readFileSync(file, "utf8");
226
+ await adapter.writeFileAsync(adapter.namespace, "adapter.json", fileContent);
227
+ }
228
+ } catch (error) {
229
+ }
230
+ try {
231
+ const file = import_path.default.join(data_dir, "persistent.json");
232
+ if (import_fs_extra.default.statSync(file).isFile()) {
233
+ const fileContent = import_fs_extra.default.readFileSync(file, "utf8");
234
+ await adapter.writeFileAsync(adapter.namespace, "driver.json", fileContent);
235
+ }
236
+ } catch (error) {
237
+ }
238
+ try {
239
+ import_fs_extra.default.removeSync(data_dir);
240
+ } catch (error) {
241
+ }
242
+ adapter.log.warn("Migrated configuration files to new location (needs restart). Restart of the adapter initiated.");
243
+ adapter.restartAdapter();
244
+ }
245
245
  };
246
246
  const convertCamelCaseToSnakeCase = function(value) {
247
247
  return value.replace(/[A-Z]/g, (letter, index) => {
248
248
  return index == 0 ? letter.toLowerCase() : "_" + letter.toLowerCase();
249
249
  });
250
250
  };
251
+ function getShortUrl(url, prefixUrl) {
252
+ if (url.password) {
253
+ url = new URL(url.toString());
254
+ url.password = "[redacted]";
255
+ }
256
+ let shortUrl = url.toString();
257
+ if (prefixUrl && shortUrl.startsWith(prefixUrl)) {
258
+ shortUrl = shortUrl.slice(prefixUrl.length);
259
+ }
260
+ return shortUrl;
261
+ }
251
262
  // Annotate the CommonJS export names for ESM import in node:
252
263
  0 && (module.exports = {
253
264
  changeRole,
254
265
  convertCamelCaseToSnakeCase,
255
266
  deleteStates,
256
- getDataFilePath,
257
267
  getImageAsHTML,
268
+ getShortUrl,
258
269
  getVideoClipLength,
259
270
  handleUpdate,
260
271
  isEmpty,
261
272
  lowestUnusedNumber,
262
- moveFiles,
263
273
  removeFiles,
264
274
  removeLastChar,
265
275
  setStateAsync,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/lib/utils.ts"],
4
- "sourcesContent": ["import { CommandType, Device } from \"eufy-security-client\";\r\nimport path from \"path\";\r\nimport fse from \"fs-extra\";\r\nimport * as utils from \"@iobroker/adapter-core\";\r\n\r\nimport { ioBrokerLogger } from \"./log\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\r\nexport const setStateChangedAsync = async function(adapter: ioBroker.Adapter, id: string, value: any): ioBroker.SetStateChangedPromise {\r\n return await adapter.setStateChangedAsync(id, value === undefined || value === null ? null : { val: value, ack: true }).catch();\r\n};\r\n\r\nexport const isEmpty = function(str: string | null | undefined): boolean {\r\n if (str) {\r\n if (str.length > 0)\r\n return false;\r\n return true;\r\n }\r\n return true;\r\n};\r\n\r\nexport const getImageAsHTML = function(data: Buffer, mime = \"image/jpg\"): string {\r\n if (data && data.length > 0)\r\n return `<img src=\"data:${mime};base64,${data.toString(\"base64\")}\" style=\"width: auto ;height: 100%;\" />`;\r\n return \"\";\r\n}\r\n\r\nexport const getDataFilePath = function(adapter: ioBroker.Adapter, stationSerial: string, folderName: string, fileName: string): string {\r\n const dir_path = path.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, folderName);\r\n if (!fse.existsSync(dir_path)) {\r\n fse.mkdirSync(dir_path, {mode: 0o775, recursive: true});\r\n }\r\n return path.join(dir_path, fileName);\r\n}\r\n\r\nexport const setStateAsync = async function(adapter: ioBroker.Adapter, state_id: string, common_name: string, value: string, role = \"text\", type: \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\" | \"mixed\" | \"file\" | undefined = \"string\"): Promise<void> {\r\n await adapter.setObjectNotExistsAsync(state_id, {\r\n type: \"state\",\r\n common: {\r\n name: common_name,\r\n type: type,\r\n role: role,\r\n read: true,\r\n write: false,\r\n },\r\n native: {\r\n },\r\n });\r\n await adapter.setStateAsync(state_id, { val: value, ack: true });\r\n}\r\n\r\nexport const removeFiles = function(adapter: ioBroker.Adapter, stationSerial: string, folderName: string, device_sn: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const dir_path = path.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, folderName);\r\n if (fse.existsSync(dir_path)) {\r\n const files = fse.readdirSync(dir_path).filter(fn => fn.startsWith(device_sn));\r\n try {\r\n files.map(filename => fse.removeSync(path.join(dir_path, filename)));\r\n } catch (error) {\r\n }\r\n }\r\n resolve();\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n}\r\n\r\nexport const moveFiles = function(adapter: ioBroker.Adapter, stationSerial: string, device_sn: string, srcFolderName: string, dstFolderName: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const dirSrcPath = path.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, srcFolderName);\r\n const dirDstPath = path.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, dstFolderName);\r\n if (!fse.existsSync(dirDstPath)) {\r\n fse.mkdirSync(dirDstPath, {mode: 0o775, recursive: true});\r\n }\r\n if (fse.existsSync(dirSrcPath)) {\r\n const files = fse.readdirSync(dirSrcPath).filter(fn => fn.startsWith(device_sn));\r\n try {\r\n files.map(filename => fse.moveSync(path.join(dirSrcPath, filename), path.join(dirDstPath, filename)));\r\n } catch (error) {\r\n }\r\n }\r\n resolve();\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n}\r\n\r\nexport const lowestUnusedNumber = function (sequence: number[], startingFrom: number): number {\r\n const arr = sequence.slice(0);\r\n arr.sort((a, b) => a - b);\r\n return arr.reduce((lowest, num, i) => {\r\n const seqIndex = i + startingFrom;\r\n return num !== seqIndex && seqIndex < lowest ? seqIndex : lowest\r\n }, arr.length + startingFrom);\r\n}\r\n\r\nexport const sleep = async (ms: number): Promise<void> => {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n};\r\n\r\nexport const getVideoClipLength = (device: Device): number => {\r\n let length = 60;\r\n const workingMode = device.getRawProperty(CommandType.CMD_SET_PIR_POWERMODE);\r\n if (workingMode !== undefined) {\r\n switch(workingMode) {\r\n case \"0\":\r\n if (device.isCamera2Product() || device.isIndoorCamera() || device.isSoloCameras())\r\n length = 20;\r\n else if (device.isBatteryDoorbell() || device.isBatteryDoorbell2())\r\n length = 30;\r\n break;\r\n case \"1\":\r\n // Corrisponds to 60 seconds\r\n break;\r\n case \"2\":\r\n const customValue = device.getRawProperty(CommandType.CMD_DEV_RECORD_TIMEOUT);\r\n if (customValue !== undefined) {\r\n try {\r\n length = Number.parseInt(customValue);\r\n } catch(error) {\r\n }\r\n }\r\n break;\r\n case \"3\":\r\n // Corrisponds to 60 seconds?? (this mode exists only for battery doorbells; mode: Optimal Battery Life)\r\n break;\r\n }\r\n }\r\n return length;\r\n};\r\n\r\nexport const removeLastChar = function(text: string, char: string): string {\r\n const strArr = [...text];\r\n strArr.splice(text.lastIndexOf(char), 1);\r\n return strArr.join(\"\");\r\n}\r\n\r\nexport const changeRole = async function(adapter: ioBroker.Adapter, log: ioBrokerLogger, state: string, role: string): Promise<void> {\r\n try {\r\n const states = await adapter.getStatesAsync(`*.${state}`);\r\n if (states)\r\n Object.keys(states).forEach(async id => {\r\n await adapter.extendObjectAsync(id, {\r\n type: \"state\",\r\n common: {\r\n role: role\r\n }\r\n }, {}).catch();\r\n });\r\n } catch (error) {\r\n log.error(`state: ${state} role: ${role} - Error:`, error);\r\n }\r\n};\r\n\r\nexport const deleteStates = async function(adapter: ioBroker.Adapter, property: string): Promise<void> {\r\n const states = await adapter.getStatesAsync(`*.${property}`);\r\n if (states)\r\n Object.keys(states).forEach(async id => {\r\n await adapter.delObjectAsync(id).catch();\r\n });\r\n};\r\n\r\nexport const handleUpdate = async function(adapter: ioBroker.Adapter, log: ioBrokerLogger, old_version: number): Promise<void> {\r\n if (old_version <= 0.61) {\r\n try {\r\n const all = await adapter.getStatesAsync(\"T*\");\r\n if (all) {\r\n Object.keys(all).forEach(async id => {\r\n await adapter.delObjectAsync(id, { recursive: false }).catch();\r\n });\r\n }\r\n const channels = await adapter.getChannelsOfAsync();\r\n if (channels) {\r\n Object.values(channels).forEach(async channel => {\r\n if (channel.common.name !== \"info\") {\r\n await adapter.delObjectAsync(channel._id, {recursive: false}).catch();\r\n }\r\n });\r\n }\r\n const devices = await adapter.getDevicesAsync();\r\n if (devices) {\r\n Object.values(devices).forEach(async device => {\r\n await adapter.delObjectAsync(device._id, {recursive: false}).catch();\r\n });\r\n }\r\n } catch (error) {\r\n log.error(\"Version 0.6.1: Error:\", error);\r\n }\r\n }\r\n if (old_version <= 0.74) {\r\n try {\r\n await adapter.setObjectAsync(\"verify_code\", {\r\n type: \"state\",\r\n common: {\r\n name: \"2FA verification code\",\r\n type: \"string\",\r\n role: \"state\",\r\n read: true,\r\n write: true,\r\n },\r\n native: {},\r\n });\r\n } catch (error) {\r\n log.error(\"Version 0.7.4: Error:\", error);\r\n }\r\n }\r\n if (old_version <= 1) {\r\n for (const state of [\"last_event_pic_url\", \"last_event_pic_html\", \"last_event_video_url\"]) {\r\n try {\r\n await deleteStates(adapter, state);\r\n } catch (error) {\r\n log.error(`Version 1.0.0 - ${state}: Error:`, error);\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const convertCamelCaseToSnakeCase = function (value: string): string {\r\n return value.replace(/[A-Z]/g, (letter, index) => {\r\n return index == 0 ? letter.toLowerCase() : \"_\" + letter.toLowerCase();\r\n });\r\n};"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { CommandType, Device } from \"eufy-security-client\";\r\nimport path from \"path\";\r\nimport fse from \"fs-extra\";\r\nimport * as utils from \"@iobroker/adapter-core\";\r\n\r\nimport { ioBrokerLogger } from \"./log\";\r\nimport { euSec } from \"../main\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\r\nexport const setStateChangedAsync = async function(adapter: ioBroker.Adapter, id: string, value: any): ioBroker.SetStateChangedPromise {\r\n return await adapter.setStateChangedAsync(id, value === undefined || value === null ? null : { val: value, ack: true }).catch();\r\n};\r\n\r\nexport const isEmpty = function(str: string | null | undefined): boolean {\r\n if (str) {\r\n if (str.length > 0)\r\n return false;\r\n return true;\r\n }\r\n return true;\r\n};\r\n\r\nexport const getImageAsHTML = function(data: Buffer, mime = \"image/jpg\"): string {\r\n if (data && data.length > 0)\r\n return `<img src=\"data:${mime};base64,${data.toString(\"base64\")}\" style=\"width: auto ;height: 100%;\" />`;\r\n return \"\";\r\n}\r\n\r\n/*export const getDataFilePath = function(adapter: ioBroker.Adapter, stationSerial: string, folderName: string, fileName: string): string {\r\n const dir_path = path.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, folderName);\r\n if (!fse.existsSync(dir_path)) {\r\n fse.mkdirSync(dir_path, {mode: 0o775, recursive: true});\r\n }\r\n return path.join(dir_path, fileName);\r\n}*/\r\n\r\nexport const setStateAsync = async function(adapter: ioBroker.Adapter, state_id: string, common_name: string, value: string, role = \"text\", type: \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\" | \"mixed\" | undefined = \"string\"): Promise<void> {\r\n await adapter.setObjectNotExistsAsync(state_id, {\r\n type: \"state\",\r\n common: {\r\n name: common_name,\r\n type: type,\r\n role: role,\r\n read: true,\r\n write: false,\r\n },\r\n native: {\r\n },\r\n });\r\n await adapter.setStateAsync(state_id, { val: value, ack: true });\r\n}\r\n\r\nexport const removeFiles = function(adapter: ioBroker.Adapter, stationSerial: string, folderName: string, device_sn: string): Promise<void> {\r\n return new Promise(async (resolve, reject) => {\r\n try {\r\n const dir_path = path.join(stationSerial, folderName);\r\n if (await adapter.fileExistsAsync(adapter.namespace, dir_path)) {\r\n const files = (await adapter.readDirAsync(adapter.namespace, dir_path)).filter(fn => fn.file.startsWith(device_sn));\r\n try {\r\n files.map(filename => adapter.delFileAsync(adapter.namespace, path.join(dir_path, filename.file)));\r\n } catch (error) {\r\n }\r\n }\r\n resolve();\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n}\r\n\r\n/*export const moveFiles = function(adapter: ioBroker.Adapter, stationSerial: string, device_sn: string, srcFolderName: string, dstFolderName: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const dirSrcPath = path.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, srcFolderName);\r\n const dirDstPath = path.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, dstFolderName);\r\n if (!fse.existsSync(dirDstPath)) {\r\n fse.mkdirSync(dirDstPath, {mode: 0o775, recursive: true});\r\n }\r\n if (fse.existsSync(dirSrcPath)) {\r\n const files = fse.readdirSync(dirSrcPath).filter(fn => fn.startsWith(device_sn));\r\n try {\r\n files.map(filename => fse.moveSync(path.join(dirSrcPath, filename), path.join(dirDstPath, filename)));\r\n } catch (error) {\r\n }\r\n }\r\n resolve();\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n}*/\r\n\r\nexport const lowestUnusedNumber = function (sequence: number[], startingFrom: number): number {\r\n const arr = sequence.slice(0);\r\n arr.sort((a, b) => a - b);\r\n return arr.reduce((lowest, num, i) => {\r\n const seqIndex = i + startingFrom;\r\n return num !== seqIndex && seqIndex < lowest ? seqIndex : lowest\r\n }, arr.length + startingFrom);\r\n}\r\n\r\nexport const sleep = async (ms: number): Promise<void> => {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n};\r\n\r\nexport const getVideoClipLength = (device: Device): number => {\r\n let length = 60;\r\n const workingMode = device.getRawProperty(CommandType.CMD_SET_PIR_POWERMODE);\r\n if (workingMode !== undefined) {\r\n switch(workingMode) {\r\n case \"0\":\r\n if (device.isCamera2Product() || device.isIndoorCamera() || device.isSoloCameras())\r\n length = 20;\r\n else if (device.isBatteryDoorbell() || device.isBatteryDoorbell2())\r\n length = 30;\r\n break;\r\n case \"1\":\r\n // Corrisponds to 60 seconds\r\n break;\r\n case \"2\":\r\n const customValue = device.getRawProperty(CommandType.CMD_DEV_RECORD_TIMEOUT);\r\n if (customValue !== undefined) {\r\n try {\r\n length = Number.parseInt(customValue);\r\n } catch(error) {\r\n }\r\n }\r\n break;\r\n case \"3\":\r\n // Corrisponds to 60 seconds?? (this mode exists only for battery doorbells; mode: Optimal Battery Life)\r\n break;\r\n }\r\n }\r\n return length;\r\n};\r\n\r\nexport const removeLastChar = function(text: string, char: string): string {\r\n const strArr = [...text];\r\n strArr.splice(text.lastIndexOf(char), 1);\r\n return strArr.join(\"\");\r\n}\r\n\r\nexport const changeRole = async function(adapter: ioBroker.Adapter, log: ioBrokerLogger, state: string, role: string): Promise<void> {\r\n try {\r\n const states = await adapter.getStatesAsync(`*.${state}`);\r\n if (states)\r\n Object.keys(states).forEach(async id => {\r\n await adapter.extendObjectAsync(id, {\r\n type: \"state\",\r\n common: {\r\n role: role\r\n }\r\n }, {}).catch();\r\n });\r\n } catch (error) {\r\n log.error(`state: ${state} role: ${role} - Error:`, error);\r\n }\r\n};\r\n\r\nexport const deleteStates = async function(adapter: ioBroker.Adapter, property: string): Promise<void> {\r\n const states = await adapter.getStatesAsync(`*.${property}`);\r\n if (states)\r\n Object.keys(states).forEach(async id => {\r\n await adapter.delObjectAsync(id).catch();\r\n });\r\n};\r\n\r\nexport const handleUpdate = async function(adapter: euSec, log: ioBrokerLogger, oldVersion: number, newVersion: number): Promise<void> {\r\n if (oldVersion != 0 && oldVersion <= 0.61) {\r\n try {\r\n const all = await adapter.getStatesAsync(\"T*\");\r\n if (all) {\r\n Object.keys(all).forEach(async id => {\r\n await adapter.delObjectAsync(id, { recursive: false }).catch();\r\n });\r\n }\r\n const channels = await adapter.getChannelsOfAsync();\r\n if (channels) {\r\n Object.values(channels).forEach(async channel => {\r\n if (channel.common.name !== \"info\") {\r\n await adapter.delObjectAsync(channel._id, {recursive: false}).catch();\r\n }\r\n });\r\n }\r\n const devices = await adapter.getDevicesAsync();\r\n if (devices) {\r\n Object.values(devices).forEach(async device => {\r\n await adapter.delObjectAsync(device._id, {recursive: false}).catch();\r\n });\r\n }\r\n } catch (error) {\r\n log.error(\"Version 0.6.1: Error:\", error);\r\n }\r\n }\r\n if (oldVersion != 0 && oldVersion <= 0.74) {\r\n try {\r\n await adapter.setObjectAsync(\"verify_code\", {\r\n type: \"state\",\r\n common: {\r\n name: \"2FA verification code\",\r\n type: \"string\",\r\n role: \"state\",\r\n read: true,\r\n write: true,\r\n },\r\n native: {},\r\n });\r\n } catch (error) {\r\n log.error(\"Version 0.7.4: Error:\", error);\r\n }\r\n }\r\n if (oldVersion != 0 && oldVersion <= 1) {\r\n for (const state of [\"last_event_pic_url\", \"last_event_pic_html\", \"last_event_video_url\"]) {\r\n try {\r\n await deleteStates(adapter, state);\r\n } catch (error) {\r\n log.error(`Version 1.0.0 - ${state}: Error:`, error);\r\n }\r\n }\r\n }\r\n if (oldVersion == 0 && newVersion == 1.3) {\r\n const data_dir = utils.getAbsoluteInstanceDataDir(adapter);\r\n try {\r\n const file = path.join(data_dir, \"adapter.json\");\r\n if (fse.statSync(file).isFile()) {\r\n const fileContent = fse.readFileSync(file, \"utf8\");\r\n await adapter.writeFileAsync(adapter.namespace, \"adapter.json\", fileContent);\r\n }\r\n } catch (error) {\r\n //log.error(`Version 3.0.0: Error:`, error);\r\n }\r\n try {\r\n const file = path.join(data_dir, \"persistent.json\");\r\n if (fse.statSync(file).isFile()) {\r\n const fileContent = fse.readFileSync(file, \"utf8\");\r\n await adapter.writeFileAsync(adapter.namespace, \"driver.json\", fileContent);\r\n }\r\n } catch (error) {\r\n //log.error(`Version 3.0.0: Error:`, error);\r\n }\r\n try {\r\n fse.removeSync(data_dir);\r\n } catch (error) {\r\n //log.error(`Version 3.0.0: Error:`, error);\r\n }\r\n adapter.log.warn(\"Migrated configuration files to new location (needs restart). Restart of the adapter initiated.\")\r\n adapter.restartAdapter();\r\n }\r\n};\r\n\r\nexport const convertCamelCaseToSnakeCase = function (value: string): string {\r\n return value.replace(/[A-Z]/g, (letter, index) => {\r\n return index == 0 ? letter.toLowerCase() : \"_\" + letter.toLowerCase();\r\n });\r\n};\r\n\r\nexport function getShortUrl(url: URL, prefixUrl?: string): string {\r\n if (url.password) {\r\n url = new URL(url.toString()); // prevent original url mutation\r\n url.password = \"[redacted]\";\r\n }\r\n let shortUrl = url.toString();\r\n if (prefixUrl && shortUrl.startsWith(prefixUrl)) {\r\n shortUrl = shortUrl.slice(prefixUrl.length);\r\n }\r\n\r\n return shortUrl;\r\n}"],
5
+ "mappings": "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",
6
6
  "names": ["path", "fse"]
7
7
  }
@@ -18,6 +18,10 @@ var __copyProps = (to, from, except, desc) => {
18
18
  return to;
19
19
  };
20
20
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
21
25
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
26
  mod
23
27
  ));
@@ -28,22 +32,29 @@ __export(video_exports, {
28
32
  StreamOutput: () => StreamOutput,
29
33
  ffmpegPreviewImage: () => ffmpegPreviewImage,
30
34
  ffmpegStreamToGo2rtc: () => ffmpegStreamToGo2rtc,
31
- ffmpegStreamToHls: () => ffmpegStreamToHls
35
+ ffmpegStreamToHls: () => ffmpegStreamToHls,
36
+ streamToGo2rtc: () => streamToGo2rtc
32
37
  });
33
38
  module.exports = __toCommonJS(video_exports);
34
39
  var import_net = __toESM(require("net"));
35
40
  var import_path = __toESM(require("path"));
36
41
  var import_fluent_ffmpeg = __toESM(require("@bropat/fluent-ffmpeg"));
37
- var import_ffmpeg_static = __toESM(require("ffmpeg-static"));
42
+ var import_ffmpeg_for_homebridge = __toESM(require("ffmpeg-for-homebridge"));
38
43
  var import_eufy_security_client = require("eufy-security-client");
39
44
  var import_os = require("os");
40
45
  var import_fs_extra = __toESM(require("fs-extra"));
46
+ var import_node_stream = __toESM(require("node:stream"));
47
+ var import_promises = require("node:stream/promises");
41
48
  var import_utils = require("./utils");
42
- const _UniversalStream = class {
49
+ class UniversalStream {
50
+ url;
51
+ static socks = /* @__PURE__ */ new Set();
52
+ server;
53
+ sock_id;
43
54
  constructor(namespace, onSocket) {
44
55
  let sockpath = "";
45
- const unique_sock_id = (0, import_utils.lowestUnusedNumber)([..._UniversalStream.socks], 1);
46
- _UniversalStream.socks.add(unique_sock_id);
56
+ const unique_sock_id = (0, import_utils.lowestUnusedNumber)([...UniversalStream.socks], 1);
57
+ UniversalStream.socks.add(unique_sock_id);
47
58
  this.sock_id = unique_sock_id;
48
59
  if (process.platform === "win32") {
49
60
  const pipePrefix = "\\\\.\\pipe\\";
@@ -68,22 +79,22 @@ const _UniversalStream = class {
68
79
  close() {
69
80
  if (this.server)
70
81
  this.server.close();
71
- _UniversalStream.socks.delete(this.sock_id);
82
+ UniversalStream.socks.delete(this.sock_id);
72
83
  }
84
+ }
85
+ const StreamInput = function(namespace, stream2) {
86
+ return new UniversalStream(namespace, (socket) => stream2.pipe(socket, { end: true }).on("error", (_error) => {
87
+ }));
73
88
  };
74
- let UniversalStream = _UniversalStream;
75
- UniversalStream.socks = /* @__PURE__ */ new Set();
76
- const StreamInput = function(namespace, stream) {
77
- return new UniversalStream(namespace, (socket) => stream.pipe(socket, { end: true }));
78
- };
79
- const StreamOutput = function(namespace, stream) {
80
- return new UniversalStream(namespace, (socket) => socket.pipe(stream, { end: true }));
89
+ const StreamOutput = function(namespace, stream2) {
90
+ return new UniversalStream(namespace, (socket) => socket.pipe(stream2, { end: true }).on("error", (_error) => {
91
+ }));
81
92
  };
82
93
  const ffmpegPreviewImage = (config, input, output, log, skip_seconds = 2) => {
83
94
  return new Promise((resolve, reject) => {
84
95
  try {
85
- if (import_ffmpeg_static.default) {
86
- import_fluent_ffmpeg.default.setFfmpegPath(import_ffmpeg_static.default);
96
+ if (import_ffmpeg_for_homebridge.default) {
97
+ import_fluent_ffmpeg.default.setFfmpegPath(import_ffmpeg_for_homebridge.default);
87
98
  (0, import_fluent_ffmpeg.default)().withProcessOptions({
88
99
  detached: true
89
100
  }).addOptions([
@@ -112,8 +123,8 @@ ${stderr}`);
112
123
  const ffmpegStreamToHls = (config, namespace, metadata, videoStream, audioStream, output, log) => {
113
124
  return new Promise((resolve, reject) => {
114
125
  try {
115
- if (import_ffmpeg_static.default) {
116
- import_fluent_ffmpeg.default.setFfmpegPath(import_ffmpeg_static.default);
126
+ if (import_ffmpeg_for_homebridge.default) {
127
+ import_fluent_ffmpeg.default.setFfmpegPath(import_ffmpeg_for_homebridge.default);
117
128
  videoStream.on("error", (error) => {
118
129
  log.error("ffmpegStreamToHls(): Videostream Error", error);
119
130
  });
@@ -128,10 +139,13 @@ const ffmpegStreamToHls = (config, namespace, metadata, videoStream, audioStream
128
139
  "-hls_init_time 0",
129
140
  "-hls_time 2",
130
141
  "-hls_segment_type mpegts",
142
+ //"-start_number 1",
131
143
  "-sc_threshold 0",
132
144
  `-g ${metadata.videoFPS}`,
133
145
  "-fflags genpts+nobuffer+flush_packets",
146
+ //"-flush_packets 1",
134
147
  "-hls_playlist_type event"
148
+ //"-hls_flags split_by_time"
135
149
  ];
136
150
  switch (metadata.videoCodec) {
137
151
  case import_eufy_security_client.VideoCodec.H264:
@@ -183,8 +197,8 @@ ${stderr}`);
183
197
  const ffmpegStreamToGo2rtc = (config, namespace, camera, metadata, videoStream, audioStream, log) => {
184
198
  return new Promise((resolve, reject) => {
185
199
  try {
186
- if (import_ffmpeg_static.default) {
187
- import_fluent_ffmpeg.default.setFfmpegPath(import_ffmpeg_static.default);
200
+ if (import_ffmpeg_for_homebridge.default) {
201
+ import_fluent_ffmpeg.default.setFfmpegPath(import_ffmpeg_for_homebridge.default);
188
202
  videoStream.on("error", (error) => {
189
203
  log.error("ffmpegStreamToGo2rtc(): Videostream Error", error);
190
204
  });
@@ -199,6 +213,7 @@ const ffmpegStreamToGo2rtc = (config, namespace, camera, metadata, videoStream,
199
213
  "-rtsp_transport tcp",
200
214
  "-sc_threshold 0",
201
215
  "-fflags genpts+nobuffer+flush_packets"
216
+ //"-rtpflags latm",
202
217
  ];
203
218
  switch (metadata.videoCodec) {
204
219
  case import_eufy_security_client.VideoCodec.H264:
@@ -253,12 +268,125 @@ ${stderr}`);
253
268
  }
254
269
  });
255
270
  };
271
+ const streamToGo2rtc = async (camera, videoStream, audioStream, log, config, namespace, metadata) => {
272
+ const { default: got } = await import("got");
273
+ const api = got.extend({
274
+ hooks: {
275
+ beforeError: [
276
+ (error) => {
277
+ const { response, options } = error;
278
+ const { method, url, prefixUrl } = options;
279
+ const shortUrl = (0, import_utils.getShortUrl)(typeof url === "string" ? new URL(url) : url === void 0 ? new URL("") : url, typeof prefixUrl === "string" ? prefixUrl : prefixUrl.toString());
280
+ const body = (response == null ? void 0 : response.body) ? response.body : error.message;
281
+ error.message = `${error.message} | method: ${method} url: ${shortUrl}`;
282
+ if (response == null ? void 0 : response.body) {
283
+ error.message = `${error.message} body: ${body}`;
284
+ }
285
+ return error;
286
+ }
287
+ ]
288
+ }
289
+ });
290
+ videoStream.on("error", (error) => {
291
+ log.error("streamToGo2rtc(): Videostream Error", error);
292
+ });
293
+ audioStream.on("error", (error) => {
294
+ log.error("streamToGo2rtc(): Audiostream Error", error);
295
+ });
296
+ return Promise.allSettled([
297
+ (0, import_promises.pipeline)(
298
+ videoStream,
299
+ api.stream.post(`http://localhost:1984/api/stream?dst=${camera}`).on("error", (error) => {
300
+ var _a, _b;
301
+ if (!((_b = (_a = error.response) == null ? void 0 : _a.body) == null ? void 0 : _b.startsWith("EOF"))) {
302
+ log.error(`streamToGo2rtc(): Got Videostream Error: ${error.message}`);
303
+ }
304
+ }),
305
+ new import_node_stream.default.PassThrough()
306
+ ),
307
+ (0, import_promises.pipeline)(
308
+ audioStream,
309
+ api.stream.post(`http://localhost:1984/api/stream?dst=${camera}`).on("error", (error) => {
310
+ var _a, _b;
311
+ if (!((_b = (_a = error.response) == null ? void 0 : _a.body) == null ? void 0 : _b.startsWith("EOF"))) {
312
+ log.error(`streamToGo2rtc(): Got Audiostream Error: ${error.message}`);
313
+ }
314
+ }),
315
+ new import_node_stream.default.PassThrough()
316
+ )
317
+ // Alternative implementation in case of go2rtc audio bitstream isn't working (<= 1.8.5)
318
+ /*new Promise<void>((resolve, reject) => {
319
+ try {
320
+ if (pathToFfmpeg) {
321
+ ffmpeg.setFfmpegPath(pathToFfmpeg);
322
+
323
+ const uAudioStream = StreamInput(namespace, audioStream);
324
+
325
+ let audioFormat = "";
326
+ const options: string[] = [
327
+ "-rtsp_transport tcp",
328
+ "-fflags genpts+nobuffer+flush_packets",
329
+ //"-rtpflags latm",
330
+ //"-compression_level 5",
331
+ "-application lowdelay",
332
+ ];
333
+
334
+ switch(metadata.audioCodec) {
335
+ case AudioCodec.AAC:
336
+ audioFormat = "aac";
337
+ break;
338
+ }
339
+
340
+ const command = ffmpeg()
341
+ .withProcessOptions({
342
+ detached: true
343
+ });
344
+
345
+ if (audioFormat !== "") {
346
+ command.input(uAudioStream.url)
347
+ .inputFormat(audioFormat)
348
+ .audioCodec("opus");
349
+ } else {
350
+ log.warn(`streamToGo2rtc(): ffmpeg - Not support audio codec or unknown audio codec (${AudioCodec[metadata.audioCodec]})`);
351
+ }
352
+ command.output(`rtsp://localhost:${config.go2rtc_rtsp_port}/${camera}`)
353
+ .outputFormat("rtsp")
354
+ .addOptions(options)
355
+ .on("start", (commandline) => {
356
+ log.debug(`streamToGo2rtc(): ffmpeg - commandline: ${commandline}`);
357
+ })
358
+ .on("error", function(err, stdout, stderr) {
359
+ log.error(`streamToGo2rtc(): ffmpeg - An error occurred: ${err.message}`);
360
+ log.error(`streamToGo2rtc(): ffmpeg output:\n${stdout}`);
361
+ log.error(`streamToGo2rtc(): ffmpeg stderr:\n${stderr}`);
362
+ uAudioStream.close();
363
+ reject(err);
364
+ })
365
+ .on("end", (stdout, stderr) => {
366
+ log.debug(`streamToGo2rtc(): ffmpeg output:\n${stdout}`);
367
+ log.debug(`streamToGo2rtc(): ffmpeg stderr:\n${stderr}`);
368
+ log.debug("streamToGo2rtc(): Processing finished!");
369
+ uAudioStream.close();
370
+ resolve();
371
+ });
372
+ command.run();
373
+ } else {
374
+ reject(new Error("ffmpeg binary not found"));
375
+ }
376
+ } catch (error) {
377
+ log.error(`streamToGo2rtc(): Audio Error: ${error}`);
378
+ reject(error);
379
+ }
380
+ })*/
381
+ ]);
382
+ };
256
383
  // Annotate the CommonJS export names for ESM import in node:
257
384
  0 && (module.exports = {
258
385
  StreamInput,
259
386
  StreamOutput,
260
387
  ffmpegPreviewImage,
261
388
  ffmpegStreamToGo2rtc,
262
- ffmpegStreamToHls
389
+ ffmpegStreamToHls,
390
+ streamToGo2rtc
263
391
  });
264
392
  //# sourceMappingURL=video.js.map