@mp-consulting/homebridge-lg-thinq 1.0.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/.claude/settings.local.json +15 -0
- package/CHANGELOG.md +98 -0
- package/LICENSE +176 -0
- package/README.md +114 -0
- package/config.schema.json +399 -0
- package/dist/__tests__/baseDevice.spec.d.ts +1 -0
- package/dist/__tests__/baseDevice.spec.js +96 -0
- package/dist/__tests__/baseDevice.spec.js.map +1 -0
- package/dist/__tests__/deviceControl.coercion.spec.d.ts +1 -0
- package/dist/__tests__/deviceControl.coercion.spec.js +53 -0
- package/dist/__tests__/deviceControl.coercion.spec.js.map +1 -0
- package/dist/__tests__/helper.spec.d.ts +1 -0
- package/dist/__tests__/helper.spec.js +74 -0
- package/dist/__tests__/helper.spec.js.map +1 -0
- package/dist/baseDevice.d.ts +40 -0
- package/dist/baseDevice.js +85 -0
- package/dist/baseDevice.js.map +1 -0
- package/dist/baseDevice.spec.d.ts +1 -0
- package/dist/baseDevice.spec.js +107 -0
- package/dist/baseDevice.spec.js.map +1 -0
- package/dist/characteristics/TotalConsumption.d.ts +2 -0
- package/dist/characteristics/TotalConsumption.js +17 -0
- package/dist/characteristics/TotalConsumption.js.map +1 -0
- package/dist/characteristics/index.d.ts +2 -0
- package/dist/characteristics/index.js +7 -0
- package/dist/characteristics/index.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +89 -0
- package/dist/cli.js.map +1 -0
- package/dist/devices/AeroTower.d.ts +24 -0
- package/dist/devices/AeroTower.js +113 -0
- package/dist/devices/AeroTower.js.map +1 -0
- package/dist/devices/AirConditioner.d.ts +425 -0
- package/dist/devices/AirConditioner.js +1253 -0
- package/dist/devices/AirConditioner.js.map +1 -0
- package/dist/devices/AirPurifier.d.ts +50 -0
- package/dist/devices/AirPurifier.js +281 -0
- package/dist/devices/AirPurifier.js.map +1 -0
- package/dist/devices/Dehumidifier.d.ts +28 -0
- package/dist/devices/Dehumidifier.js +175 -0
- package/dist/devices/Dehumidifier.js.map +1 -0
- package/dist/devices/Dishwasher.d.ts +64 -0
- package/dist/devices/Dishwasher.js +740 -0
- package/dist/devices/Dishwasher.js.map +1 -0
- package/dist/devices/Microwave.d.ts +128 -0
- package/dist/devices/Microwave.js +1939 -0
- package/dist/devices/Microwave.js.map +1 -0
- package/dist/devices/Oven.d.ts +148 -0
- package/dist/devices/Oven.js +1850 -0
- package/dist/devices/Oven.js.map +1 -0
- package/dist/devices/RangeHood.d.ts +16 -0
- package/dist/devices/RangeHood.js +99 -0
- package/dist/devices/RangeHood.js.map +1 -0
- package/dist/devices/Refrigerator.d.ts +50 -0
- package/dist/devices/Refrigerator.js +325 -0
- package/dist/devices/Refrigerator.js.map +1 -0
- package/dist/devices/Styler.d.ts +27 -0
- package/dist/devices/Styler.js +76 -0
- package/dist/devices/Styler.js.map +1 -0
- package/dist/devices/WasherDryer.d.ts +39 -0
- package/dist/devices/WasherDryer.js +170 -0
- package/dist/devices/WasherDryer.js.map +1 -0
- package/dist/devices/WasherDryer2.d.ts +9 -0
- package/dist/devices/WasherDryer2.js +16 -0
- package/dist/devices/WasherDryer2.js.map +1 -0
- package/dist/errors/AuthenticationError.d.ts +2 -0
- package/dist/errors/AuthenticationError.js +3 -0
- package/dist/errors/AuthenticationError.js.map +1 -0
- package/dist/errors/ManualProcessNeeded.d.ts +3 -0
- package/dist/errors/ManualProcessNeeded.js +4 -0
- package/dist/errors/ManualProcessNeeded.js.map +1 -0
- package/dist/errors/MonitorError.d.ts +2 -0
- package/dist/errors/MonitorError.js +3 -0
- package/dist/errors/MonitorError.js.map +1 -0
- package/dist/errors/NotConnectedError.d.ts +3 -0
- package/dist/errors/NotConnectedError.js +4 -0
- package/dist/errors/NotConnectedError.js.map +1 -0
- package/dist/errors/TokenError.d.ts +2 -0
- package/dist/errors/TokenError.js +3 -0
- package/dist/errors/TokenError.js.map +1 -0
- package/dist/errors/TokenExpiredError.d.ts +3 -0
- package/dist/errors/TokenExpiredError.js +4 -0
- package/dist/errors/TokenExpiredError.js.map +1 -0
- package/dist/errors/index.d.ts +6 -0
- package/dist/errors/index.js +7 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/helper.d.ts +24 -0
- package/dist/helper.js +66 -0
- package/dist/helper.js.map +1 -0
- package/dist/helper.spec.d.ts +1 -0
- package/dist/helper.spec.js +74 -0
- package/dist/helper.spec.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/API.d.ts +141 -0
- package/dist/lib/API.js +362 -0
- package/dist/lib/API.js.map +1 -0
- package/dist/lib/API.spec.d.ts +1 -0
- package/dist/lib/API.spec.js +55 -0
- package/dist/lib/API.spec.js.map +1 -0
- package/dist/lib/Auth.d.ts +99 -0
- package/dist/lib/Auth.js +348 -0
- package/dist/lib/Auth.js.map +1 -0
- package/dist/lib/Auth.spec.d.ts +1 -0
- package/dist/lib/Auth.spec.js +111 -0
- package/dist/lib/Auth.spec.js.map +1 -0
- package/dist/lib/Device.d.ts +88 -0
- package/dist/lib/Device.js +95 -0
- package/dist/lib/Device.js.map +1 -0
- package/dist/lib/Device.spec.d.ts +1 -0
- package/dist/lib/Device.spec.js +53 -0
- package/dist/lib/Device.spec.js.map +1 -0
- package/dist/lib/DeviceModel.d.ts +164 -0
- package/dist/lib/DeviceModel.js +321 -0
- package/dist/lib/DeviceModel.js.map +1 -0
- package/dist/lib/DeviceModel.spec.d.ts +1 -0
- package/dist/lib/DeviceModel.spec.js +90 -0
- package/dist/lib/DeviceModel.spec.js.map +1 -0
- package/dist/lib/Gateway.d.ts +18 -0
- package/dist/lib/Gateway.js +25 -0
- package/dist/lib/Gateway.js.map +1 -0
- package/dist/lib/Gateway.spec.d.ts +1 -0
- package/dist/lib/Gateway.spec.js +35 -0
- package/dist/lib/Gateway.spec.js.map +1 -0
- package/dist/lib/Persist.d.ts +101 -0
- package/dist/lib/Persist.js +245 -0
- package/dist/lib/Persist.js.map +1 -0
- package/dist/lib/Persist.spec.d.ts +1 -0
- package/dist/lib/Persist.spec.js +90 -0
- package/dist/lib/Persist.spec.js.map +1 -0
- package/dist/lib/Session.d.ts +80 -0
- package/dist/lib/Session.js +100 -0
- package/dist/lib/Session.js.map +1 -0
- package/dist/lib/Session.spec.d.ts +1 -0
- package/dist/lib/Session.spec.js +43 -0
- package/dist/lib/Session.spec.js.map +1 -0
- package/dist/lib/ThinQ.d.ts +28 -0
- package/dist/lib/ThinQ.js +373 -0
- package/dist/lib/ThinQ.js.map +1 -0
- package/dist/lib/__tests__/API.spec.d.ts +1 -0
- package/dist/lib/__tests__/API.spec.js +55 -0
- package/dist/lib/__tests__/API.spec.js.map +1 -0
- package/dist/lib/__tests__/Auth.spec.d.ts +1 -0
- package/dist/lib/__tests__/Auth.spec.js +110 -0
- package/dist/lib/__tests__/Auth.spec.js.map +1 -0
- package/dist/lib/__tests__/Device.spec.d.ts +1 -0
- package/dist/lib/__tests__/Device.spec.js +53 -0
- package/dist/lib/__tests__/Device.spec.js.map +1 -0
- package/dist/lib/__tests__/DeviceModel.spec.d.ts +1 -0
- package/dist/lib/__tests__/DeviceModel.spec.js +90 -0
- package/dist/lib/__tests__/DeviceModel.spec.js.map +1 -0
- package/dist/lib/__tests__/Gateway.spec.d.ts +1 -0
- package/dist/lib/__tests__/Gateway.spec.js +35 -0
- package/dist/lib/__tests__/Gateway.spec.js.map +1 -0
- package/dist/lib/__tests__/Persist.spec.d.ts +1 -0
- package/dist/lib/__tests__/Persist.spec.js +90 -0
- package/dist/lib/__tests__/Persist.spec.js.map +1 -0
- package/dist/lib/__tests__/Session.spec.d.ts +1 -0
- package/dist/lib/__tests__/Session.spec.js +43 -0
- package/dist/lib/__tests__/Session.spec.js.map +1 -0
- package/dist/lib/constants.d.ts +95 -0
- package/dist/lib/constants.js +106 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/request.d.ts +2 -0
- package/dist/lib/request.js +66 -0
- package/dist/lib/request.js.map +1 -0
- package/dist/platform.d.ts +41 -0
- package/dist/platform.js +229 -0
- package/dist/platform.js.map +1 -0
- package/dist/settings.d.ts +8 -0
- package/dist/settings.js +9 -0
- package/dist/settings.js.map +1 -0
- package/dist/status/BaseStatus.d.ts +48 -0
- package/dist/status/BaseStatus.js +59 -0
- package/dist/status/BaseStatus.js.map +1 -0
- package/dist/types/snapshots.d.ts +142 -0
- package/dist/types/snapshots.js +6 -0
- package/dist/types/snapshots.js.map +1 -0
- package/dist/utils/__tests__/normalize.spec.d.ts +1 -0
- package/dist/utils/__tests__/normalize.spec.js +95 -0
- package/dist/utils/__tests__/normalize.spec.js.map +1 -0
- package/dist/utils/normalize.d.ts +22 -0
- package/dist/utils/normalize.js +51 -0
- package/dist/utils/normalize.js.map +1 -0
- package/dist/v1/__tests__/prepareControlData.spec.d.ts +1 -0
- package/dist/v1/__tests__/prepareControlData.spec.js +48 -0
- package/dist/v1/__tests__/prepareControlData.spec.js.map +1 -0
- package/dist/v1/devices/AC.d.ts +13 -0
- package/dist/v1/devices/AC.js +112 -0
- package/dist/v1/devices/AC.js.map +1 -0
- package/dist/v1/devices/AirPurifier.d.ts +15 -0
- package/dist/v1/devices/AirPurifier.js +57 -0
- package/dist/v1/devices/AirPurifier.js.map +1 -0
- package/dist/v1/devices/RangeHood.d.ts +6 -0
- package/dist/v1/devices/RangeHood.js +12 -0
- package/dist/v1/devices/RangeHood.js.map +1 -0
- package/dist/v1/devices/Refrigerator.d.ts +17 -0
- package/dist/v1/devices/Refrigerator.js +69 -0
- package/dist/v1/devices/Refrigerator.js.map +1 -0
- package/dist/v1/devices/Washer.d.ts +10 -0
- package/dist/v1/devices/Washer.js +23 -0
- package/dist/v1/devices/Washer.js.map +1 -0
- package/dist/v1/devices/index.d.ts +6 -0
- package/dist/v1/devices/index.js +7 -0
- package/dist/v1/devices/index.js.map +1 -0
- package/dist/v1/helper.d.ts +14 -0
- package/dist/v1/helper.js +111 -0
- package/dist/v1/helper.js.map +1 -0
- package/dist/v1/transforms/AirPurifierState.d.ts +2 -0
- package/dist/v1/transforms/AirPurifierState.js +9 -0
- package/dist/v1/transforms/AirPurifierState.js.map +1 -0
- package/dist/v1/transforms/AirState.d.ts +9 -0
- package/dist/v1/transforms/AirState.js +55 -0
- package/dist/v1/transforms/AirState.js.map +1 -0
- package/dist/v1/transforms/HoodState.d.ts +17 -0
- package/dist/v1/transforms/HoodState.js +20 -0
- package/dist/v1/transforms/HoodState.js.map +1 -0
- package/dist/v1/transforms/RefState.d.ts +6 -0
- package/dist/v1/transforms/RefState.js +29 -0
- package/dist/v1/transforms/RefState.js.map +1 -0
- package/dist/v1/transforms/WasherDryer.d.ts +49 -0
- package/dist/v1/transforms/WasherDryer.js +56 -0
- package/dist/v1/transforms/WasherDryer.js.map +1 -0
- package/docs/authorization.md +40 -0
- package/docs/device-configuration.md +68 -0
- package/homebridge-ui/public/index.html +120 -0
- package/homebridge-ui/public/js/app.js +300 -0
- package/homebridge-ui/public/js/countries.js +233 -0
- package/homebridge-ui/public/styles.css +185 -0
- package/homebridge-ui/server.js +103 -0
- package/jest.config.ts +39 -0
- package/package.json +83 -0
- package/sample/README.md +10 -0
- package/sample/airconditioner-model.json +3080 -0
- package/sample/airconditioner-snapshot.json +49 -0
- package/sample/airconditioner.json +157 -0
- package/sample/dishwasher-model.json +869 -0
- package/sample/dishwasher.json +125 -0
- package/sample/washer_dryer-model.json +1294 -0
- package/sample/washer_dryer.json +126 -0
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
export var ValueType;
|
|
2
|
+
(function (ValueType) {
|
|
3
|
+
ValueType["Bit"] = "Bit";
|
|
4
|
+
ValueType["Enum"] = "Enum";
|
|
5
|
+
ValueType["Range"] = "Range";
|
|
6
|
+
ValueType["Reference"] = "Reference";
|
|
7
|
+
ValueType["StringComment"] = "StringComment";
|
|
8
|
+
})(ValueType || (ValueType = {}));
|
|
9
|
+
/**
|
|
10
|
+
* Represents the model of a device, including its metadata, values, and monitoring data.
|
|
11
|
+
* This class provides methods to retrieve and decode device-specific information.
|
|
12
|
+
*/
|
|
13
|
+
export class DeviceModel {
|
|
14
|
+
data;
|
|
15
|
+
/**
|
|
16
|
+
* Creates a new `DeviceModel` instance.
|
|
17
|
+
*
|
|
18
|
+
* @param data - The raw model data for the device.
|
|
19
|
+
*/
|
|
20
|
+
constructor(data) {
|
|
21
|
+
this.data = data;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Retrieves the monitoring values defined in the device model.
|
|
25
|
+
*/
|
|
26
|
+
get monitoringValue() {
|
|
27
|
+
return this.data.MonitoringValue;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Retrieves the value definition for a given key in the device model.
|
|
31
|
+
* Supports ThinQ2 protocol mappings for monitoring values.
|
|
32
|
+
*
|
|
33
|
+
* @param name - The key to retrieve the value definition for.
|
|
34
|
+
* @returns The value definition or `null` if not found.
|
|
35
|
+
*/
|
|
36
|
+
value(name) {
|
|
37
|
+
if (this.data.Value === undefined) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
let data = this.data.Value[name];
|
|
41
|
+
// Handle ThinQ2 protocol mappings
|
|
42
|
+
if (data === undefined && this.data.Monitoring?.type === 'THINQ2') {
|
|
43
|
+
const protocol = this.data.Monitoring?.protocol;
|
|
44
|
+
/**
|
|
45
|
+
* sample: "protocol": {
|
|
46
|
+
* "state": "State",
|
|
47
|
+
* "process": "Process",
|
|
48
|
+
* "error": "Error",
|
|
49
|
+
* "initialTimeHour": "Initial_Time_H",
|
|
50
|
+
* "initialTimeMinute": "Initial_Time_M",
|
|
51
|
+
* "course": "Course",
|
|
52
|
+
* "courseType": "CourseType",
|
|
53
|
+
* "remainTimeHour": "Remain_Time_H",
|
|
54
|
+
* "remainTimeMinute": "Remain_Time_M",
|
|
55
|
+
* "reserveTimeHour": "Reserve_Time_H",
|
|
56
|
+
* "reserveTimeMinute": "Reserve_Time_M",
|
|
57
|
+
* "childLock": "ChildLock",
|
|
58
|
+
* "door": "Door",
|
|
59
|
+
* "rinseRefill": "RinseRefill",
|
|
60
|
+
* "saltRefill": "SaltRefill",
|
|
61
|
+
* "signalLevel": "SignalLevel",
|
|
62
|
+
* "mcReminderSetting": "MCReminderSetting",
|
|
63
|
+
* "cleanLReminder": "CleanLReminder",
|
|
64
|
+
* "nightDry": "NightDry",
|
|
65
|
+
* "delayStart": "DelayStart",
|
|
66
|
+
* "energySaver": "EnergySaver",
|
|
67
|
+
* "extraDry": "ExtraDry",
|
|
68
|
+
* "highTemp": "HighTemp",
|
|
69
|
+
* "dualZone": "DualZone",
|
|
70
|
+
* "halfLoad": "HalfLoad",
|
|
71
|
+
* "autoDoor": "AutoDoor",
|
|
72
|
+
* "preSteam": "PreSteam",
|
|
73
|
+
* "steam": "Steam",
|
|
74
|
+
* "rinseLevel": "RinseLevel",
|
|
75
|
+
* "softeningLevel": "SofteningLevel",
|
|
76
|
+
* "smartCourse": "SmartCourse",
|
|
77
|
+
* "currentDownloadCourse": "CurrentDownloadCourse",
|
|
78
|
+
* "tclCount": "TclCount"
|
|
79
|
+
* }
|
|
80
|
+
*/
|
|
81
|
+
if (protocol.constructor.name === 'Object' && protocol[name] !== undefined) {
|
|
82
|
+
data = this.data.Value[this.data.Monitoring?.protocol[name]];
|
|
83
|
+
/**
|
|
84
|
+
* sample: "protocol": [{
|
|
85
|
+
* "_comment": "Hood Operation State(1byte)",
|
|
86
|
+
* "superSet": "hoodState.hoodState",
|
|
87
|
+
* "value": "HoodState"
|
|
88
|
+
* },
|
|
89
|
+
* {
|
|
90
|
+
* "_comment": "VentState",
|
|
91
|
+
* "superSet": "hoodState.ventLevel",
|
|
92
|
+
* "value": "VentLevel"
|
|
93
|
+
* },
|
|
94
|
+
* {
|
|
95
|
+
* "_comment": "VentMode",
|
|
96
|
+
* "superSet": "hoodState.ventMode",
|
|
97
|
+
* "value": "VentMode"
|
|
98
|
+
* },
|
|
99
|
+
* {
|
|
100
|
+
* "_comment": "TimerMin",
|
|
101
|
+
* "superSet": "hoodState.remainTimeMinute",
|
|
102
|
+
* "value": "TimerMin"
|
|
103
|
+
* },
|
|
104
|
+
* {
|
|
105
|
+
* "_comment": "TimerSec",
|
|
106
|
+
* "superSet": "hoodState.remainTimeSecond",
|
|
107
|
+
* "value": "TimerSec"
|
|
108
|
+
* },
|
|
109
|
+
* {
|
|
110
|
+
* "_comment": "LightState",
|
|
111
|
+
* "superSet": "hoodState.lampLevel",
|
|
112
|
+
* "value": "LampLevel"
|
|
113
|
+
* },
|
|
114
|
+
* {
|
|
115
|
+
* "_comment": "Dummy-meaningless",
|
|
116
|
+
* "superSet": "hoodState.dummyData",
|
|
117
|
+
* "value": "Dummy"
|
|
118
|
+
* },
|
|
119
|
+
* {
|
|
120
|
+
* "_comment": "HoodStateInfo",
|
|
121
|
+
* "superSet": null,
|
|
122
|
+
* "value": "HoodStateInfo"
|
|
123
|
+
* },
|
|
124
|
+
* {
|
|
125
|
+
* "_comment": "WiFi Access Enable",
|
|
126
|
+
* "superSet": null,
|
|
127
|
+
* "value": "WiFiAccess"
|
|
128
|
+
* }
|
|
129
|
+
* ]
|
|
130
|
+
*/
|
|
131
|
+
}
|
|
132
|
+
else if (protocol.constructor.name === 'Array' && protocol.find((p) => p.superSet === name) !== undefined) {
|
|
133
|
+
data = this.data.Value[protocol.find((p) => p.superSet === name).value];
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (data === undefined) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
// Determine the type of the value and return the appropriate structure
|
|
140
|
+
const type = data.type || data.data_type;
|
|
141
|
+
switch (type.toLowerCase()) {
|
|
142
|
+
case 'enum':
|
|
143
|
+
return {
|
|
144
|
+
type: ValueType.Enum,
|
|
145
|
+
options: data.option || data.value_mapping,
|
|
146
|
+
};
|
|
147
|
+
case 'range':
|
|
148
|
+
return {
|
|
149
|
+
type: ValueType.Range,
|
|
150
|
+
min: (data.option || data.value_validation)?.min,
|
|
151
|
+
max: (data.option || data.value_validation)?.max,
|
|
152
|
+
step: (data.option || data.value_validation)?.step || 1,
|
|
153
|
+
};
|
|
154
|
+
case 'bit': {
|
|
155
|
+
const bitValues = Object.values(data.option).reduce((obj, value) => ({
|
|
156
|
+
...obj,
|
|
157
|
+
[value.startbit]: value.values,
|
|
158
|
+
}), {});
|
|
159
|
+
return { type: ValueType.Bit, options: bitValues };
|
|
160
|
+
}
|
|
161
|
+
case 'reference': {
|
|
162
|
+
const [ref] = data.option;
|
|
163
|
+
return { type: ValueType.Reference, reference: this.data[ref] };
|
|
164
|
+
}
|
|
165
|
+
case 'string':
|
|
166
|
+
if (typeof data._comment === 'string') {
|
|
167
|
+
return { type: ValueType.StringComment, comment: data._comment };
|
|
168
|
+
}
|
|
169
|
+
return null;
|
|
170
|
+
default:
|
|
171
|
+
throw new Error(`Unsupported value type: ${data.type}`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Retrieves the default value for a given key in the device model.
|
|
176
|
+
*
|
|
177
|
+
* @param name - The key to retrieve the default value for.
|
|
178
|
+
* @returns The default value or `undefined` if not found.
|
|
179
|
+
*/
|
|
180
|
+
default(name) {
|
|
181
|
+
return this.data?.Value[name]?.default;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Retrieves the enum value for a given key and name.
|
|
185
|
+
*
|
|
186
|
+
* @param key - The key to retrieve the enum value for.
|
|
187
|
+
* @param name - The name of the enum **value**.
|
|
188
|
+
* @returns The enum value or `undefined` if not found.
|
|
189
|
+
*/
|
|
190
|
+
enumValue(key, name) {
|
|
191
|
+
const value = this.value(key);
|
|
192
|
+
if (value?.type !== ValueType.Enum) {
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
const options = value.options;
|
|
196
|
+
// getting the key where value is equal to name
|
|
197
|
+
const keyByValue = Object.keys(options).find(k => options[k] === name);
|
|
198
|
+
return keyByValue || null;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Retrieves the enum name for a given key and value.
|
|
202
|
+
*
|
|
203
|
+
* @param key - The key to retrieve the enum name for.
|
|
204
|
+
* @param value - The value of the enum.
|
|
205
|
+
* @returns The enum name or `null` if not found.
|
|
206
|
+
*/
|
|
207
|
+
enumName(key, value) {
|
|
208
|
+
if (this.value(key)?.type !== ValueType.Enum) {
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
const options = this.value(key).options;
|
|
212
|
+
return options[value] || null;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Retrieves the monitoring value mapping for a given key.
|
|
216
|
+
*
|
|
217
|
+
* @param key - The key to retrieve the monitoring value mapping for.
|
|
218
|
+
* @returns The monitoring value mapping or `null` if not found.
|
|
219
|
+
*/
|
|
220
|
+
monitoringValueMapping(key) {
|
|
221
|
+
if (this.monitoringValue === undefined || !(key in this.monitoringValue)) {
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
return this.monitoringValue[key].valueMapping || null;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Looks up a monitor value based on a given key and name, with an optional default value.
|
|
228
|
+
*
|
|
229
|
+
* @param key - The key used to identify the monitoring value mapping.
|
|
230
|
+
* @param name - The name of the specific value to look up within the mapping.
|
|
231
|
+
* @param default_value - An optional default value to return if the lookup fails. Defaults to `null`.
|
|
232
|
+
* @returns The label of the monitoring value if found, or the `default_value` if not found.
|
|
233
|
+
*/
|
|
234
|
+
lookupMonitorValue(key, name) {
|
|
235
|
+
if (this.data.Value) {
|
|
236
|
+
return this.enumName(key, name);
|
|
237
|
+
}
|
|
238
|
+
const monitoringValue = this.monitoringValueMapping(key);
|
|
239
|
+
if (monitoringValue === null || !(name in monitoringValue)) {
|
|
240
|
+
return null;
|
|
241
|
+
}
|
|
242
|
+
return monitoringValue[name].label || null;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Looks up a monitor value based on a given key and name, with an optional default value.
|
|
246
|
+
*
|
|
247
|
+
* @param key - The key used to identify the monitoring value mapping.
|
|
248
|
+
* @param name - The name of the specific value to look up within the mapping.
|
|
249
|
+
* @param default_value - An optional default value to return if the lookup fails. Defaults to `null`.
|
|
250
|
+
* @returns The label of the monitoring value if found, or the `default_value` if not found.
|
|
251
|
+
*/
|
|
252
|
+
lookupMonitorValue2(key, name, default_value) {
|
|
253
|
+
if (this.data.Value) {
|
|
254
|
+
return this.enumName(key, name) || default_value;
|
|
255
|
+
}
|
|
256
|
+
const monitoringValue = this.monitoringValueMapping(key);
|
|
257
|
+
if (monitoringValue === null || !(name in monitoringValue)) {
|
|
258
|
+
return default_value;
|
|
259
|
+
}
|
|
260
|
+
return monitoringValue[name].label || default_value;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Looks up a monitor name based on a given key and label.
|
|
264
|
+
*
|
|
265
|
+
* @param key - The key used to identify the monitoring value mapping.
|
|
266
|
+
* @param label - The label of the specific value to look up within the mapping.
|
|
267
|
+
* @returns The name of the monitoring value if found, or `null` if not found.
|
|
268
|
+
*/
|
|
269
|
+
lookupMonitorName(key, label) {
|
|
270
|
+
if (this.data.Value) {
|
|
271
|
+
return this.enumValue(key, label);
|
|
272
|
+
}
|
|
273
|
+
if (this.monitoringValue === undefined || !(key in this.monitoringValue)) {
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
const getKeyByValue = (obj, value) => Object.keys(obj).find(k => obj[k].label === value);
|
|
277
|
+
return getKeyByValue(this.monitoringValue[key].valueMapping, label) || null;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Decodes the monitoring data for the device.
|
|
281
|
+
*
|
|
282
|
+
* @param data - The raw monitoring data to decode.
|
|
283
|
+
* @returns The decoded monitoring data.
|
|
284
|
+
*/
|
|
285
|
+
decodeMonitor(data) {
|
|
286
|
+
if (this.data.Monitoring?.type === 'BINARY(BYTE)') {
|
|
287
|
+
return this.decodeMonitorBinary(data);
|
|
288
|
+
}
|
|
289
|
+
else if (this.data.Monitoring?.type === 'BINARY(HEX)') {
|
|
290
|
+
return this.decodeMonitorBinary(data, 16);
|
|
291
|
+
}
|
|
292
|
+
try {
|
|
293
|
+
return JSON.parse(data.toString());
|
|
294
|
+
}
|
|
295
|
+
catch (err) {
|
|
296
|
+
return data;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Decodes binary monitoring data for the device.
|
|
301
|
+
*
|
|
302
|
+
* @param data - The raw binary monitoring data to decode.
|
|
303
|
+
* @param length - The length of each binary segment (default: 8).
|
|
304
|
+
* @returns The decoded monitoring data.
|
|
305
|
+
*/
|
|
306
|
+
decodeMonitorBinary(data, length = 8) {
|
|
307
|
+
const decoded = {};
|
|
308
|
+
for (const item of this.data.Monitoring.protocol) {
|
|
309
|
+
const key = item.value;
|
|
310
|
+
let value = 0;
|
|
311
|
+
// Decode binary data segment by segment
|
|
312
|
+
for (let i = item.startByte; i < item.startByte + item.length; i++) {
|
|
313
|
+
const v = data[i];
|
|
314
|
+
value = (value << length) + v;
|
|
315
|
+
decoded[key] = isNaN(value) ? null : String(value);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
return decoded;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=DeviceModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeviceModel.js","sourceRoot":"","sources":["../../src/lib/DeviceModel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { DeviceModel } from './DeviceModel.js';
|
|
2
|
+
import { describe, test, beforeEach, expect } from '@jest/globals';
|
|
3
|
+
import Fs from 'fs';
|
|
4
|
+
import Path from 'path';
|
|
5
|
+
const mockModelDataJson = JSON.parse(Fs.readFileSync(Path.resolve(process.cwd(), 'sample/airconditioner-model.json'), 'utf8'));
|
|
6
|
+
describe('DeviceModel', () => {
|
|
7
|
+
let deviceModel;
|
|
8
|
+
const mockModelData = mockModelDataJson;
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
deviceModel = new DeviceModel(mockModelData);
|
|
11
|
+
});
|
|
12
|
+
test('should retrieve monitoring values', () => {
|
|
13
|
+
const monitoringValues = deviceModel.monitoringValue;
|
|
14
|
+
expect(monitoringValues).toEqual(mockModelData.MonitoringValue);
|
|
15
|
+
});
|
|
16
|
+
test('should retrieve value definition for a given key', () => {
|
|
17
|
+
const value = deviceModel.value('temperature');
|
|
18
|
+
expect(value).toBeDefined();
|
|
19
|
+
});
|
|
20
|
+
test('should return null for undefined value key', () => {
|
|
21
|
+
const value = deviceModel.value('undefinedKey');
|
|
22
|
+
expect(value).toBeNull();
|
|
23
|
+
});
|
|
24
|
+
test('should retrieve default value for a given key', () => {
|
|
25
|
+
const mockModelDataWithDefault = {
|
|
26
|
+
...mockModelData,
|
|
27
|
+
Value: {
|
|
28
|
+
...mockModelData.Value,
|
|
29
|
+
temperature: {
|
|
30
|
+
...mockModelData.Value.temperature,
|
|
31
|
+
default: 350,
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
deviceModel = new DeviceModel(mockModelDataWithDefault);
|
|
36
|
+
const defaultValue = deviceModel.default('temperature');
|
|
37
|
+
expect(defaultValue).toBe(350);
|
|
38
|
+
});
|
|
39
|
+
test('should retrieve enum value for a given key and name', () => {
|
|
40
|
+
const enumValue = deviceModel.enumValue('mode', 'Bake');
|
|
41
|
+
expect(enumValue).toBeDefined();
|
|
42
|
+
});
|
|
43
|
+
test('should return null for invalid enum key or name', () => {
|
|
44
|
+
const invalidEnumValue = deviceModel.enumValue('mode', 'Invalid');
|
|
45
|
+
expect(invalidEnumValue).toBeNull();
|
|
46
|
+
});
|
|
47
|
+
test('should retrieve enum name for a given key and value', () => {
|
|
48
|
+
const enumName = deviceModel.enumName('mode', 'bake');
|
|
49
|
+
expect(enumName).toBeDefined();
|
|
50
|
+
});
|
|
51
|
+
test('should return null for invalid enum key or value', () => {
|
|
52
|
+
const invalidEnumName = deviceModel.enumName('mode', 'invalid');
|
|
53
|
+
expect(invalidEnumName).toBeNull();
|
|
54
|
+
});
|
|
55
|
+
test('should retrieve monitoring value mapping for a given key', () => {
|
|
56
|
+
const mapping = deviceModel.monitoringValueMapping('door');
|
|
57
|
+
expect(mapping).toBeDefined();
|
|
58
|
+
});
|
|
59
|
+
test('should return null for invalid monitoring value key', () => {
|
|
60
|
+
const invalidMapping = deviceModel.monitoringValueMapping('invalidKey');
|
|
61
|
+
expect(invalidMapping).toBeNull();
|
|
62
|
+
});
|
|
63
|
+
test('should lookup monitor value by key and name', () => {
|
|
64
|
+
const label = deviceModel.lookupMonitorValue('door', 'open');
|
|
65
|
+
expect(label).toBeDefined();
|
|
66
|
+
});
|
|
67
|
+
test('should return default value for invalid monitor value lookup', () => {
|
|
68
|
+
const defaultValue = deviceModel.lookupMonitorValue2('door', 'invalid', 'Default');
|
|
69
|
+
expect(defaultValue).toBe('Default');
|
|
70
|
+
});
|
|
71
|
+
test('should lookup monitor name by key and label', () => {
|
|
72
|
+
const name = deviceModel.lookupMonitorName('door', 'Open');
|
|
73
|
+
expect(name).toBeDefined();
|
|
74
|
+
});
|
|
75
|
+
test('should return null for invalid monitor name lookup', () => {
|
|
76
|
+
const invalidName = deviceModel.lookupMonitorName('door', 'Invalid');
|
|
77
|
+
expect(invalidName).toBeNull();
|
|
78
|
+
});
|
|
79
|
+
test('should decode monitoring data as JSON', () => {
|
|
80
|
+
const rawData = '{"key":"value"}';
|
|
81
|
+
const decodedData = deviceModel.decodeMonitor(rawData);
|
|
82
|
+
expect(decodedData).toEqual({ key: 'value' });
|
|
83
|
+
});
|
|
84
|
+
test('should return raw data if JSON decoding fails', () => {
|
|
85
|
+
const rawData = 'invalidJSON';
|
|
86
|
+
const decodedData = deviceModel.decodeMonitor(rawData);
|
|
87
|
+
expect(decodedData).toBe(rawData);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=DeviceModel.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeviceModel.spec.js","sourceRoot":"","sources":["../../src/lib/DeviceModel.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface GatewayData {
|
|
2
|
+
empTermsUri: string;
|
|
3
|
+
empSpxUri: string;
|
|
4
|
+
thinq2Uri: string;
|
|
5
|
+
thinq1Uri: string;
|
|
6
|
+
countryCode: string;
|
|
7
|
+
languageCode: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class Gateway {
|
|
10
|
+
data: GatewayData;
|
|
11
|
+
constructor(data: GatewayData);
|
|
12
|
+
get emp_base_url(): string;
|
|
13
|
+
get login_base_url(): string;
|
|
14
|
+
get thinq2_url(): string;
|
|
15
|
+
get thinq1_url(): string;
|
|
16
|
+
get country_code(): string;
|
|
17
|
+
get language_code(): string;
|
|
18
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export class Gateway {
|
|
2
|
+
data;
|
|
3
|
+
constructor(data) {
|
|
4
|
+
this.data = data;
|
|
5
|
+
}
|
|
6
|
+
get emp_base_url() {
|
|
7
|
+
return this.data.empTermsUri + '/';
|
|
8
|
+
}
|
|
9
|
+
get login_base_url() {
|
|
10
|
+
return this.data.empSpxUri + '/';
|
|
11
|
+
}
|
|
12
|
+
get thinq2_url() {
|
|
13
|
+
return this.data.thinq2Uri + '/';
|
|
14
|
+
}
|
|
15
|
+
get thinq1_url() {
|
|
16
|
+
return this.data.thinq1Uri + '/';
|
|
17
|
+
}
|
|
18
|
+
get country_code() {
|
|
19
|
+
return this.data.countryCode;
|
|
20
|
+
}
|
|
21
|
+
get language_code() {
|
|
22
|
+
return this.data.languageCode;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=Gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Gateway.js","sourceRoot":"","sources":["../../src/lib/Gateway.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,OAAO;IACC;IAAnB,YAAmB,IAAiB;QAAjB,SAAI,GAAJ,IAAI,CAAa;IAAG,CAAC;IAExC,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;IACrC,CAAC;IAED,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;IACnC,CAAC;IAED,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;IACnC,CAAC;IAED,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;IACnC,CAAC;IAED,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;IAC/B,CAAC;IAED,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;IAChC,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Gateway } from './Gateway.js';
|
|
2
|
+
import { describe, test, expect, beforeEach } from '@jest/globals';
|
|
3
|
+
describe('Gateway', () => {
|
|
4
|
+
const mockData = {
|
|
5
|
+
empTermsUri: 'https://example.com/terms',
|
|
6
|
+
empSpxUri: 'https://example.com/login',
|
|
7
|
+
thinq2Uri: 'https://example.com/thinq2',
|
|
8
|
+
thinq1Uri: 'https://example.com/thinq1',
|
|
9
|
+
countryCode: 'US',
|
|
10
|
+
languageCode: 'en-US',
|
|
11
|
+
};
|
|
12
|
+
let gateway;
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
gateway = new Gateway(mockData);
|
|
15
|
+
});
|
|
16
|
+
test('should return the correct emp_base_url', () => {
|
|
17
|
+
expect(gateway.emp_base_url).toBe('https://example.com/terms/');
|
|
18
|
+
});
|
|
19
|
+
test('should return the correct login_base_url', () => {
|
|
20
|
+
expect(gateway.login_base_url).toBe('https://example.com/login/');
|
|
21
|
+
});
|
|
22
|
+
test('should return the correct thinq2_url', () => {
|
|
23
|
+
expect(gateway.thinq2_url).toBe('https://example.com/thinq2/');
|
|
24
|
+
});
|
|
25
|
+
test('should return the correct thinq1_url', () => {
|
|
26
|
+
expect(gateway.thinq1_url).toBe('https://example.com/thinq1/');
|
|
27
|
+
});
|
|
28
|
+
test('should return the correct country_code', () => {
|
|
29
|
+
expect(gateway.country_code).toBe('US');
|
|
30
|
+
});
|
|
31
|
+
test('should return the correct language_code', () => {
|
|
32
|
+
expect(gateway.language_code).toBe('en-US');
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
//# sourceMappingURL=Gateway.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Gateway.spec.js","sourceRoot":"","sources":["../../src/lib/Gateway.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEnE,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,MAAM,QAAQ,GAAgB;QAC5B,WAAW,EAAE,2BAA2B;QACxC,SAAS,EAAE,2BAA2B;QACtC,SAAS,EAAE,4BAA4B;QACvC,SAAS,EAAE,4BAA4B;QACvC,WAAW,EAAE,IAAI;QACjB,YAAY,EAAE,OAAO;KACtB,CAAC;IAEF,IAAI,OAAgB,CAAC;IAErB,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A utility class for managing persistent storage using `node-persist`.
|
|
3
|
+
* This class provides methods for storing, retrieving, and caching data with optional expiration.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```typescript
|
|
7
|
+
* const persist = new Persist('./storage');
|
|
8
|
+
* await persist.init();
|
|
9
|
+
* await persist.setItem('key', 'value');
|
|
10
|
+
* const value = await persist.getItem('key');
|
|
11
|
+
* console.log(value); // Output: 'value'
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export default class Persist {
|
|
15
|
+
/**
|
|
16
|
+
* The `node-persist` instance used for managing storage.
|
|
17
|
+
*/
|
|
18
|
+
protected persist: any | null;
|
|
19
|
+
protected dir: string;
|
|
20
|
+
/**
|
|
21
|
+
* Creates a new `Persist` instance.
|
|
22
|
+
*
|
|
23
|
+
* @param dir - The directory where the persistent storage files will be stored.
|
|
24
|
+
*/
|
|
25
|
+
constructor(dir: string);
|
|
26
|
+
/**
|
|
27
|
+
* Generates a SHA-256 hash of the given input string.
|
|
28
|
+
*
|
|
29
|
+
* @param input - The input string to hash.
|
|
30
|
+
* @returns The SHA-256 hash of the input string.
|
|
31
|
+
*/
|
|
32
|
+
protected sha256(input: string): string;
|
|
33
|
+
/**
|
|
34
|
+
* Detect and migrate legacy plain JSON files in the storage directory.
|
|
35
|
+
* Legacy files are assumed to be named by the original key (not sha256(key))
|
|
36
|
+
* and contain raw JSON for the value. Migrated files are written as
|
|
37
|
+
* JSON datum { key, value, ttl } into filename sha256(key).
|
|
38
|
+
*/
|
|
39
|
+
protected migrateLegacyFiles(): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Initializes the persistent storage.
|
|
42
|
+
*
|
|
43
|
+
* @returns A promise that resolves when the storage is initialized.
|
|
44
|
+
*/
|
|
45
|
+
init(): Promise<any>;
|
|
46
|
+
/**
|
|
47
|
+
* Retrieves an item from storage by its key.
|
|
48
|
+
*
|
|
49
|
+
* @param key - The key of the item to retrieve.
|
|
50
|
+
* @returns A promise that resolves with the value of the item, or `null` if the item does not exist.
|
|
51
|
+
*/
|
|
52
|
+
getItem(key: string): Promise<any>;
|
|
53
|
+
/**
|
|
54
|
+
* Stores an item in storage with the specified key and value.
|
|
55
|
+
*
|
|
56
|
+
* @param key - The key to associate with the item.
|
|
57
|
+
* @param value - The value to store.
|
|
58
|
+
* @returns A promise that resolves when the item is stored.
|
|
59
|
+
*/
|
|
60
|
+
setItem(key: string, value: any): Promise<any>;
|
|
61
|
+
/**
|
|
62
|
+
* Caches a value indefinitely. If the value does not exist in storage, it is retrieved using the provided callable function.
|
|
63
|
+
*
|
|
64
|
+
* @param key - The key to associate with the cached value.
|
|
65
|
+
* @param callable - A function that returns a promise resolving to the value to cache.
|
|
66
|
+
* @returns A promise that resolves with the cached value.
|
|
67
|
+
*/
|
|
68
|
+
cacheForever(key: string, callable: () => Promise<any>): Promise<any>;
|
|
69
|
+
/**
|
|
70
|
+
* Caches a value with a time-to-live (TTL). If the value does not exist or is expired, it is retrieved using the provided callable function.
|
|
71
|
+
*
|
|
72
|
+
* @param key - The key to associate with the cached value.
|
|
73
|
+
* @param ttl - The time-to-live for the cached value, in milliseconds.
|
|
74
|
+
* @param callable - A function that returns a promise resolving to the value to cache.
|
|
75
|
+
* @returns A promise that resolves with the cached value.
|
|
76
|
+
*/
|
|
77
|
+
cache(key: string, ttl: number, callable: () => Promise<any>): Promise<any>;
|
|
78
|
+
/**
|
|
79
|
+
* Stores an item in storage with an expiration time.
|
|
80
|
+
*
|
|
81
|
+
* @param key - The key to associate with the item.
|
|
82
|
+
* @param value - The value to store.
|
|
83
|
+
* @param ttl - The time-to-live for the item, in milliseconds.
|
|
84
|
+
* @returns A promise that resolves when the item is stored.
|
|
85
|
+
*/
|
|
86
|
+
setWithExpiry(key: string, value: any, ttl: number): Promise<void>;
|
|
87
|
+
/**
|
|
88
|
+
* Retrieves an item from storage by its key, considering its expiration time.
|
|
89
|
+
*
|
|
90
|
+
* @param key - The key of the item to retrieve.
|
|
91
|
+
* @returns A promise that resolves with the value of the item, or `null` if the item does not exist or is expired.
|
|
92
|
+
*/
|
|
93
|
+
getWithExpiry(key: string): Promise<any>;
|
|
94
|
+
/**
|
|
95
|
+
* Removes an item from storage by its key.
|
|
96
|
+
*
|
|
97
|
+
* @param key - The key of the item to remove.
|
|
98
|
+
* @returns A promise that resolves when the item is removed.
|
|
99
|
+
*/
|
|
100
|
+
removeItem(key: string): Promise<any>;
|
|
101
|
+
}
|