@ecobridge.xyz/devicemanager 3.0.2

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.
Files changed (137) hide show
  1. package/.gitea/workflows/default_nottags.yaml +66 -0
  2. package/.gitea/workflows/default_tags.yaml +124 -0
  3. package/.vscode/launch.json +11 -0
  4. package/.vscode/settings.json +26 -0
  5. package/changelog.md +91 -0
  6. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  7. package/dist_ts/00_commitinfo_data.js +9 -0
  8. package/dist_ts/device/device.classes.device.d.ts +205 -0
  9. package/dist_ts/device/device.classes.device.js +344 -0
  10. package/dist_ts/devicemanager.classes.devicemanager.d.ts +210 -0
  11. package/dist_ts/devicemanager.classes.devicemanager.js +835 -0
  12. package/dist_ts/discovery/discovery.classes.homeassistant.d.ts +101 -0
  13. package/dist_ts/discovery/discovery.classes.homeassistant.js +313 -0
  14. package/dist_ts/discovery/discovery.classes.mdns.d.ts +90 -0
  15. package/dist_ts/discovery/discovery.classes.mdns.js +291 -0
  16. package/dist_ts/discovery/discovery.classes.networkscanner.d.ts +64 -0
  17. package/dist_ts/discovery/discovery.classes.networkscanner.js +535 -0
  18. package/dist_ts/discovery/discovery.classes.ssdp.d.ts +112 -0
  19. package/dist_ts/discovery/discovery.classes.ssdp.js +255 -0
  20. package/dist_ts/factories/index.d.ts +190 -0
  21. package/dist_ts/factories/index.js +350 -0
  22. package/dist_ts/features/feature.abstract.d.ts +118 -0
  23. package/dist_ts/features/feature.abstract.js +172 -0
  24. package/dist_ts/features/feature.camera.d.ts +95 -0
  25. package/dist_ts/features/feature.camera.js +162 -0
  26. package/dist_ts/features/feature.climate.d.ts +174 -0
  27. package/dist_ts/features/feature.climate.js +328 -0
  28. package/dist_ts/features/feature.cover.d.ts +121 -0
  29. package/dist_ts/features/feature.cover.js +217 -0
  30. package/dist_ts/features/feature.fan.d.ts +127 -0
  31. package/dist_ts/features/feature.fan.js +235 -0
  32. package/dist_ts/features/feature.light.d.ts +156 -0
  33. package/dist_ts/features/feature.light.js +296 -0
  34. package/dist_ts/features/feature.lock.d.ts +103 -0
  35. package/dist_ts/features/feature.lock.js +170 -0
  36. package/dist_ts/features/feature.playback.d.ts +98 -0
  37. package/dist_ts/features/feature.playback.js +191 -0
  38. package/dist_ts/features/feature.power.d.ts +79 -0
  39. package/dist_ts/features/feature.power.js +173 -0
  40. package/dist_ts/features/feature.print.d.ts +78 -0
  41. package/dist_ts/features/feature.print.js +226 -0
  42. package/dist_ts/features/feature.scan.d.ts +79 -0
  43. package/dist_ts/features/feature.scan.js +315 -0
  44. package/dist_ts/features/feature.sensor.d.ts +95 -0
  45. package/dist_ts/features/feature.sensor.js +147 -0
  46. package/dist_ts/features/feature.snmp.d.ts +88 -0
  47. package/dist_ts/features/feature.snmp.js +175 -0
  48. package/dist_ts/features/feature.switch.d.ts +75 -0
  49. package/dist_ts/features/feature.switch.js +126 -0
  50. package/dist_ts/features/feature.volume.d.ts +104 -0
  51. package/dist_ts/features/feature.volume.js +186 -0
  52. package/dist_ts/features/index.d.ts +19 -0
  53. package/dist_ts/features/index.js +23 -0
  54. package/dist_ts/helpers/helpers.iprange.d.ts +35 -0
  55. package/dist_ts/helpers/helpers.iprange.js +151 -0
  56. package/dist_ts/helpers/helpers.retry.d.ts +25 -0
  57. package/dist_ts/helpers/helpers.retry.js +69 -0
  58. package/dist_ts/index.d.ts +15 -0
  59. package/dist_ts/index.js +40 -0
  60. package/dist_ts/interfaces/feature.interfaces.d.ts +255 -0
  61. package/dist_ts/interfaces/feature.interfaces.js +6 -0
  62. package/dist_ts/interfaces/homeassistant.interfaces.d.ts +550 -0
  63. package/dist_ts/interfaces/homeassistant.interfaces.js +111 -0
  64. package/dist_ts/interfaces/index.d.ts +330 -0
  65. package/dist_ts/interfaces/index.js +16 -0
  66. package/dist_ts/interfaces/smarthome.interfaces.d.ts +282 -0
  67. package/dist_ts/interfaces/smarthome.interfaces.js +7 -0
  68. package/dist_ts/paths.d.ts +1 -0
  69. package/dist_ts/paths.js +3 -0
  70. package/dist_ts/plugins.d.ts +23 -0
  71. package/dist_ts/plugins.js +30 -0
  72. package/dist_ts/protocols/index.d.ts +12 -0
  73. package/dist_ts/protocols/index.js +21 -0
  74. package/dist_ts/protocols/protocol.escl.d.ts +58 -0
  75. package/dist_ts/protocols/protocol.escl.js +364 -0
  76. package/dist_ts/protocols/protocol.homeassistant.d.ts +248 -0
  77. package/dist_ts/protocols/protocol.homeassistant.js +611 -0
  78. package/dist_ts/protocols/protocol.ipp.d.ts +45 -0
  79. package/dist_ts/protocols/protocol.ipp.js +284 -0
  80. package/dist_ts/protocols/protocol.nut.d.ts +160 -0
  81. package/dist_ts/protocols/protocol.nut.js +364 -0
  82. package/dist_ts/protocols/protocol.sane.d.ts +104 -0
  83. package/dist_ts/protocols/protocol.sane.js +597 -0
  84. package/dist_ts/protocols/protocol.snmp.d.ts +133 -0
  85. package/dist_ts/protocols/protocol.snmp.js +333 -0
  86. package/dist_ts/protocols/protocol.upnp.d.ts +207 -0
  87. package/dist_ts/protocols/protocol.upnp.js +442 -0
  88. package/dist_ts/protocols/protocol.upssnmp.d.ts +160 -0
  89. package/dist_ts/protocols/protocol.upssnmp.js +263 -0
  90. package/npmextra.json +24 -0
  91. package/package.json +39 -0
  92. package/readme.hints.md +115 -0
  93. package/readme.md +624 -0
  94. package/test/test.ts +261 -0
  95. package/ts/00_commitinfo_data.ts +8 -0
  96. package/ts/device/device.classes.device.ts +454 -0
  97. package/ts/devicemanager.classes.devicemanager.ts +1219 -0
  98. package/ts/discovery/discovery.classes.homeassistant.ts +376 -0
  99. package/ts/discovery/discovery.classes.mdns.ts +347 -0
  100. package/ts/discovery/discovery.classes.networkscanner.ts +648 -0
  101. package/ts/discovery/discovery.classes.ssdp.ts +357 -0
  102. package/ts/factories/index.ts +696 -0
  103. package/ts/features/feature.abstract.ts +251 -0
  104. package/ts/features/feature.camera.ts +214 -0
  105. package/ts/features/feature.climate.ts +407 -0
  106. package/ts/features/feature.cover.ts +278 -0
  107. package/ts/features/feature.fan.ts +296 -0
  108. package/ts/features/feature.light.ts +369 -0
  109. package/ts/features/feature.lock.ts +223 -0
  110. package/ts/features/feature.playback.ts +246 -0
  111. package/ts/features/feature.power.ts +231 -0
  112. package/ts/features/feature.print.ts +297 -0
  113. package/ts/features/feature.scan.ts +370 -0
  114. package/ts/features/feature.sensor.ts +202 -0
  115. package/ts/features/feature.snmp.ts +235 -0
  116. package/ts/features/feature.switch.ts +170 -0
  117. package/ts/features/feature.volume.ts +256 -0
  118. package/ts/features/index.ts +25 -0
  119. package/ts/helpers/helpers.iprange.ts +172 -0
  120. package/ts/helpers/helpers.retry.ts +100 -0
  121. package/ts/index.ts +165 -0
  122. package/ts/interfaces/feature.interfaces.ts +359 -0
  123. package/ts/interfaces/homeassistant.interfaces.ts +666 -0
  124. package/ts/interfaces/index.ts +421 -0
  125. package/ts/interfaces/smarthome.interfaces.ts +421 -0
  126. package/ts/paths.ts +5 -0
  127. package/ts/plugins.ts +41 -0
  128. package/ts/protocols/index.ts +59 -0
  129. package/ts/protocols/protocol.escl.ts +439 -0
  130. package/ts/protocols/protocol.homeassistant.ts +737 -0
  131. package/ts/protocols/protocol.ipp.ts +329 -0
  132. package/ts/protocols/protocol.nut.ts +471 -0
  133. package/ts/protocols/protocol.sane.ts +694 -0
  134. package/ts/protocols/protocol.snmp.ts +439 -0
  135. package/ts/protocols/protocol.upnp.ts +627 -0
  136. package/ts/protocols/protocol.upssnmp.ts +377 -0
  137. package/tsconfig.json +12 -0
@@ -0,0 +1,442 @@
1
+ import * as plugins from '../plugins.js';
2
+ /**
3
+ * UPnP service types for DLNA
4
+ */
5
+ export const UPNP_SERVICE_TYPES = {
6
+ AVTransport: 'urn:schemas-upnp-org:service:AVTransport:1',
7
+ RenderingControl: 'urn:schemas-upnp-org:service:RenderingControl:1',
8
+ ConnectionManager: 'urn:schemas-upnp-org:service:ConnectionManager:1',
9
+ ContentDirectory: 'urn:schemas-upnp-org:service:ContentDirectory:1',
10
+ };
11
+ /**
12
+ * UPnP device types for DLNA
13
+ */
14
+ export const UPNP_DEVICE_TYPES = {
15
+ MediaRenderer: 'urn:schemas-upnp-org:device:MediaRenderer:1',
16
+ MediaServer: 'urn:schemas-upnp-org:device:MediaServer:1',
17
+ };
18
+ /**
19
+ * UPnP SOAP client for DLNA operations
20
+ */
21
+ export class UpnpSoapClient {
22
+ baseUrl;
23
+ constructor(baseUrl) {
24
+ this.baseUrl = baseUrl.replace(/\/$/, '');
25
+ }
26
+ /**
27
+ * Make a SOAP request to a UPnP service
28
+ */
29
+ async soapAction(controlUrl, serviceType, action, args = {}) {
30
+ // Build SOAP body
31
+ let argsXml = '';
32
+ for (const [key, value] of Object.entries(args)) {
33
+ const escapedValue = this.escapeXml(String(value));
34
+ argsXml += `<${key}>${escapedValue}</${key}>`;
35
+ }
36
+ const soapBody = `<?xml version="1.0" encoding="utf-8"?>
37
+ <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
38
+ <s:Body>
39
+ <u:${action} xmlns:u="${serviceType}">
40
+ ${argsXml}
41
+ </u:${action}>
42
+ </s:Body>
43
+ </s:Envelope>`;
44
+ const fullUrl = controlUrl.startsWith('http') ? controlUrl : `${this.baseUrl}${controlUrl}`;
45
+ const response = await fetch(fullUrl, {
46
+ method: 'POST',
47
+ headers: {
48
+ 'Content-Type': 'text/xml; charset=utf-8',
49
+ 'SOAPACTION': `"${serviceType}#${action}"`,
50
+ },
51
+ body: soapBody,
52
+ signal: AbortSignal.timeout(10000),
53
+ });
54
+ if (!response.ok) {
55
+ const text = await response.text();
56
+ throw new Error(`SOAP request failed (${response.status}): ${text}`);
57
+ }
58
+ return response.text();
59
+ }
60
+ /**
61
+ * Escape XML special characters
62
+ */
63
+ escapeXml(str) {
64
+ return str
65
+ .replace(/&/g, '&amp;')
66
+ .replace(/</g, '&lt;')
67
+ .replace(/>/g, '&gt;')
68
+ .replace(/"/g, '&quot;')
69
+ .replace(/'/g, '&apos;');
70
+ }
71
+ /**
72
+ * Unescape XML special characters
73
+ */
74
+ unescapeXml(str) {
75
+ return str
76
+ .replace(/&lt;/g, '<')
77
+ .replace(/&gt;/g, '>')
78
+ .replace(/&quot;/g, '"')
79
+ .replace(/&apos;/g, "'")
80
+ .replace(/&amp;/g, '&');
81
+ }
82
+ /**
83
+ * Extract value from SOAP response
84
+ */
85
+ extractValue(xml, tag) {
86
+ const regex = new RegExp(`<${tag}[^>]*>([\\s\\S]*?)</${tag}>`, 'i');
87
+ const match = xml.match(regex);
88
+ return match ? match[1].trim() : '';
89
+ }
90
+ /**
91
+ * Extract multiple values from SOAP response
92
+ */
93
+ extractValues(xml, tags) {
94
+ const result = {};
95
+ for (const tag of tags) {
96
+ result[tag] = this.extractValue(xml, tag);
97
+ }
98
+ return result;
99
+ }
100
+ // ============================================================================
101
+ // AVTransport Actions
102
+ // ============================================================================
103
+ /**
104
+ * Set the URI to play
105
+ */
106
+ async setAVTransportURI(controlUrl, uri, metadata = '') {
107
+ await this.soapAction(controlUrl, UPNP_SERVICE_TYPES.AVTransport, 'SetAVTransportURI', {
108
+ InstanceID: 0,
109
+ CurrentURI: uri,
110
+ CurrentURIMetaData: metadata,
111
+ });
112
+ }
113
+ /**
114
+ * Set next URI to play
115
+ */
116
+ async setNextAVTransportURI(controlUrl, uri, metadata = '') {
117
+ await this.soapAction(controlUrl, UPNP_SERVICE_TYPES.AVTransport, 'SetNextAVTransportURI', {
118
+ InstanceID: 0,
119
+ NextURI: uri,
120
+ NextURIMetaData: metadata,
121
+ });
122
+ }
123
+ /**
124
+ * Play
125
+ */
126
+ async play(controlUrl, speed = '1') {
127
+ await this.soapAction(controlUrl, UPNP_SERVICE_TYPES.AVTransport, 'Play', {
128
+ InstanceID: 0,
129
+ Speed: speed,
130
+ });
131
+ }
132
+ /**
133
+ * Pause
134
+ */
135
+ async pause(controlUrl) {
136
+ await this.soapAction(controlUrl, UPNP_SERVICE_TYPES.AVTransport, 'Pause', {
137
+ InstanceID: 0,
138
+ });
139
+ }
140
+ /**
141
+ * Stop
142
+ */
143
+ async stop(controlUrl) {
144
+ await this.soapAction(controlUrl, UPNP_SERVICE_TYPES.AVTransport, 'Stop', {
145
+ InstanceID: 0,
146
+ });
147
+ }
148
+ /**
149
+ * Seek
150
+ */
151
+ async seek(controlUrl, target, unit = 'REL_TIME') {
152
+ await this.soapAction(controlUrl, UPNP_SERVICE_TYPES.AVTransport, 'Seek', {
153
+ InstanceID: 0,
154
+ Unit: unit,
155
+ Target: target,
156
+ });
157
+ }
158
+ /**
159
+ * Next track
160
+ */
161
+ async next(controlUrl) {
162
+ await this.soapAction(controlUrl, UPNP_SERVICE_TYPES.AVTransport, 'Next', {
163
+ InstanceID: 0,
164
+ });
165
+ }
166
+ /**
167
+ * Previous track
168
+ */
169
+ async previous(controlUrl) {
170
+ await this.soapAction(controlUrl, UPNP_SERVICE_TYPES.AVTransport, 'Previous', {
171
+ InstanceID: 0,
172
+ });
173
+ }
174
+ /**
175
+ * Get position info
176
+ */
177
+ async getPositionInfo(controlUrl) {
178
+ const response = await this.soapAction(controlUrl, UPNP_SERVICE_TYPES.AVTransport, 'GetPositionInfo', {
179
+ InstanceID: 0,
180
+ });
181
+ const values = this.extractValues(response, [
182
+ 'Track', 'TrackDuration', 'TrackMetaData', 'TrackURI',
183
+ 'RelTime', 'AbsTime', 'RelCount', 'AbsCount',
184
+ ]);
185
+ return {
186
+ track: parseInt(values['Track']) || 0,
187
+ trackDuration: values['TrackDuration'] || '0:00:00',
188
+ trackMetadata: this.unescapeXml(values['TrackMetaData'] || ''),
189
+ trackUri: values['TrackURI'] || '',
190
+ relativeTime: values['RelTime'] || '0:00:00',
191
+ absoluteTime: values['AbsTime'] || 'NOT_IMPLEMENTED',
192
+ relativeCount: parseInt(values['RelCount']) || 0,
193
+ absoluteCount: parseInt(values['AbsCount']) || 0,
194
+ };
195
+ }
196
+ /**
197
+ * Get transport info
198
+ */
199
+ async getTransportInfo(controlUrl) {
200
+ const response = await this.soapAction(controlUrl, UPNP_SERVICE_TYPES.AVTransport, 'GetTransportInfo', {
201
+ InstanceID: 0,
202
+ });
203
+ const values = this.extractValues(response, [
204
+ 'CurrentTransportState', 'CurrentTransportStatus', 'CurrentSpeed',
205
+ ]);
206
+ return {
207
+ state: (values['CurrentTransportState'] || 'STOPPED'),
208
+ status: (values['CurrentTransportStatus'] || 'OK'),
209
+ speed: values['CurrentSpeed'] || '1',
210
+ };
211
+ }
212
+ /**
213
+ * Get media info
214
+ */
215
+ async getMediaInfo(controlUrl) {
216
+ const response = await this.soapAction(controlUrl, UPNP_SERVICE_TYPES.AVTransport, 'GetMediaInfo', {
217
+ InstanceID: 0,
218
+ });
219
+ const values = this.extractValues(response, [
220
+ 'NrTracks', 'MediaDuration', 'CurrentURI', 'CurrentURIMetaData',
221
+ 'NextURI', 'NextURIMetaData', 'PlayMedium', 'RecordMedium', 'WriteStatus',
222
+ ]);
223
+ return {
224
+ nrTracks: parseInt(values['NrTracks']) || 0,
225
+ mediaDuration: values['MediaDuration'] || '0:00:00',
226
+ currentUri: values['CurrentURI'] || '',
227
+ currentUriMetadata: this.unescapeXml(values['CurrentURIMetaData'] || ''),
228
+ nextUri: values['NextURI'] || '',
229
+ nextUriMetadata: this.unescapeXml(values['NextURIMetaData'] || ''),
230
+ playMedium: values['PlayMedium'] || 'NONE',
231
+ recordMedium: values['RecordMedium'] || 'NOT_IMPLEMENTED',
232
+ writeStatus: values['WriteStatus'] || 'NOT_IMPLEMENTED',
233
+ };
234
+ }
235
+ // ============================================================================
236
+ // RenderingControl Actions
237
+ // ============================================================================
238
+ /**
239
+ * Get volume
240
+ */
241
+ async getVolume(controlUrl, channel = 'Master') {
242
+ const response = await this.soapAction(controlUrl, UPNP_SERVICE_TYPES.RenderingControl, 'GetVolume', {
243
+ InstanceID: 0,
244
+ Channel: channel,
245
+ });
246
+ const volume = this.extractValue(response, 'CurrentVolume');
247
+ return parseInt(volume) || 0;
248
+ }
249
+ /**
250
+ * Set volume
251
+ */
252
+ async setVolume(controlUrl, volume, channel = 'Master') {
253
+ await this.soapAction(controlUrl, UPNP_SERVICE_TYPES.RenderingControl, 'SetVolume', {
254
+ InstanceID: 0,
255
+ Channel: channel,
256
+ DesiredVolume: Math.max(0, Math.min(100, volume)),
257
+ });
258
+ }
259
+ /**
260
+ * Get mute state
261
+ */
262
+ async getMute(controlUrl, channel = 'Master') {
263
+ const response = await this.soapAction(controlUrl, UPNP_SERVICE_TYPES.RenderingControl, 'GetMute', {
264
+ InstanceID: 0,
265
+ Channel: channel,
266
+ });
267
+ const mute = this.extractValue(response, 'CurrentMute');
268
+ return mute === '1' || mute.toLowerCase() === 'true';
269
+ }
270
+ /**
271
+ * Set mute state
272
+ */
273
+ async setMute(controlUrl, muted, channel = 'Master') {
274
+ await this.soapAction(controlUrl, UPNP_SERVICE_TYPES.RenderingControl, 'SetMute', {
275
+ InstanceID: 0,
276
+ Channel: channel,
277
+ DesiredMute: muted ? 1 : 0,
278
+ });
279
+ }
280
+ // ============================================================================
281
+ // ContentDirectory Actions
282
+ // ============================================================================
283
+ /**
284
+ * Browse content directory
285
+ */
286
+ async browse(controlUrl, objectId = '0', browseFlag = 'BrowseDirectChildren', filter = '*', startIndex = 0, requestCount = 100, sortCriteria = '') {
287
+ const response = await this.soapAction(controlUrl, UPNP_SERVICE_TYPES.ContentDirectory, 'Browse', {
288
+ ObjectID: objectId,
289
+ BrowseFlag: browseFlag,
290
+ Filter: filter,
291
+ StartingIndex: startIndex,
292
+ RequestedCount: requestCount,
293
+ SortCriteria: sortCriteria,
294
+ });
295
+ const values = this.extractValues(response, ['Result', 'NumberReturned', 'TotalMatches', 'UpdateID']);
296
+ const resultXml = this.unescapeXml(values['Result'] || '');
297
+ const items = this.parseDidlResult(resultXml);
298
+ return {
299
+ items,
300
+ numberReturned: parseInt(values['NumberReturned']) || items.length,
301
+ totalMatches: parseInt(values['TotalMatches']) || items.length,
302
+ updateId: parseInt(values['UpdateID']) || 0,
303
+ };
304
+ }
305
+ /**
306
+ * Search content directory
307
+ */
308
+ async search(controlUrl, containerId, searchCriteria, filter = '*', startIndex = 0, requestCount = 100, sortCriteria = '') {
309
+ const response = await this.soapAction(controlUrl, UPNP_SERVICE_TYPES.ContentDirectory, 'Search', {
310
+ ContainerID: containerId,
311
+ SearchCriteria: searchCriteria,
312
+ Filter: filter,
313
+ StartingIndex: startIndex,
314
+ RequestedCount: requestCount,
315
+ SortCriteria: sortCriteria,
316
+ });
317
+ const values = this.extractValues(response, ['Result', 'NumberReturned', 'TotalMatches', 'UpdateID']);
318
+ const resultXml = this.unescapeXml(values['Result'] || '');
319
+ const items = this.parseDidlResult(resultXml);
320
+ return {
321
+ items,
322
+ numberReturned: parseInt(values['NumberReturned']) || items.length,
323
+ totalMatches: parseInt(values['TotalMatches']) || items.length,
324
+ updateId: parseInt(values['UpdateID']) || 0,
325
+ };
326
+ }
327
+ /**
328
+ * Parse DIDL-Lite result XML
329
+ */
330
+ parseDidlResult(xml) {
331
+ const items = [];
332
+ // Match container and item elements
333
+ const elementRegex = /<(container|item)[^>]*>([\s\S]*?)<\/\1>/gi;
334
+ let match;
335
+ while ((match = elementRegex.exec(xml)) !== null) {
336
+ const elementXml = match[0];
337
+ const elementType = match[1];
338
+ // Extract attributes
339
+ const idMatch = elementXml.match(/id="([^"]*)"/);
340
+ const parentIdMatch = elementXml.match(/parentID="([^"]*)"/);
341
+ const restrictedMatch = elementXml.match(/restricted="([^"]*)"/);
342
+ const childCountMatch = elementXml.match(/childCount="([^"]*)"/);
343
+ const item = {
344
+ id: idMatch?.[1] || '',
345
+ parentId: parentIdMatch?.[1] || '',
346
+ title: this.extractTagContent(elementXml, 'dc:title'),
347
+ class: this.extractTagContent(elementXml, 'upnp:class'),
348
+ restricted: restrictedMatch?.[1] !== '0',
349
+ childCount: childCountMatch ? parseInt(childCountMatch[1]) : undefined,
350
+ };
351
+ // Extract resources
352
+ const resMatches = elementXml.match(/<res[^>]*>([^<]*)<\/res>/gi);
353
+ if (resMatches) {
354
+ item.res = resMatches.map((resXml) => {
355
+ const protocolInfo = resXml.match(/protocolInfo="([^"]*)"/)?.[1] || '';
356
+ const size = resXml.match(/size="([^"]*)"/)?.[1];
357
+ const duration = resXml.match(/duration="([^"]*)"/)?.[1];
358
+ const resolution = resXml.match(/resolution="([^"]*)"/)?.[1];
359
+ const bitrate = resXml.match(/bitrate="([^"]*)"/)?.[1];
360
+ const urlMatch = resXml.match(/>([^<]+)</);
361
+ return {
362
+ url: urlMatch?.[1] || '',
363
+ protocolInfo,
364
+ size: size ? parseInt(size) : undefined,
365
+ duration,
366
+ resolution,
367
+ bitrate: bitrate ? parseInt(bitrate) : undefined,
368
+ };
369
+ });
370
+ }
371
+ // Extract optional metadata
372
+ const albumArt = this.extractTagContent(elementXml, 'upnp:albumArtURI');
373
+ if (albumArt)
374
+ item.albumArtUri = albumArt;
375
+ const artist = this.extractTagContent(elementXml, 'dc:creator') ||
376
+ this.extractTagContent(elementXml, 'upnp:artist');
377
+ if (artist)
378
+ item.artist = artist;
379
+ const album = this.extractTagContent(elementXml, 'upnp:album');
380
+ if (album)
381
+ item.album = album;
382
+ const genre = this.extractTagContent(elementXml, 'upnp:genre');
383
+ if (genre)
384
+ item.genre = genre;
385
+ const date = this.extractTagContent(elementXml, 'dc:date');
386
+ if (date)
387
+ item.date = date;
388
+ items.push(item);
389
+ }
390
+ return items;
391
+ }
392
+ /**
393
+ * Extract content from XML tag (handles namespaced tags)
394
+ */
395
+ extractTagContent(xml, tag) {
396
+ // Handle both with and without namespace prefix
397
+ const tagName = tag.includes(':') ? tag.split(':')[1] : tag;
398
+ const regex = new RegExp(`<(?:[^:]*:)?${tagName}[^>]*>([^<]*)<\/(?:[^:]*:)?${tagName}>`, 'i');
399
+ const match = xml.match(regex);
400
+ return match ? match[1].trim() : '';
401
+ }
402
+ // ============================================================================
403
+ // Utility Methods
404
+ // ============================================================================
405
+ /**
406
+ * Generate DIDL-Lite metadata for a media URL
407
+ */
408
+ generateDidlMetadata(title, url, mimeType = 'video/mp4') {
409
+ const protocolInfo = `http-get:*:${mimeType}:*`;
410
+ return `<DIDL-Lite xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/">
411
+ <item id="0" parentID="-1" restricted="1">
412
+ <dc:title>${this.escapeXml(title)}</dc:title>
413
+ <upnp:class>object.item.videoItem</upnp:class>
414
+ <res protocolInfo="${protocolInfo}">${this.escapeXml(url)}</res>
415
+ </item>
416
+ </DIDL-Lite>`;
417
+ }
418
+ /**
419
+ * Convert duration string to seconds
420
+ */
421
+ durationToSeconds(duration) {
422
+ if (!duration || duration === 'NOT_IMPLEMENTED')
423
+ return 0;
424
+ const parts = duration.split(':');
425
+ if (parts.length !== 3)
426
+ return 0;
427
+ const hours = parseInt(parts[0]) || 0;
428
+ const minutes = parseInt(parts[1]) || 0;
429
+ const seconds = parseFloat(parts[2]) || 0;
430
+ return hours * 3600 + minutes * 60 + seconds;
431
+ }
432
+ /**
433
+ * Convert seconds to duration string
434
+ */
435
+ secondsToDuration(seconds) {
436
+ const hours = Math.floor(seconds / 3600);
437
+ const minutes = Math.floor((seconds % 3600) / 60);
438
+ const secs = Math.floor(seconds % 60);
439
+ return `${hours}:${String(minutes).padStart(2, '0')}:${String(secs).padStart(2, '0')}`;
440
+ }
441
+ }
442
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdG9jb2wudXBucC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3Byb3RvY29scy9wcm90b2NvbC51cG5wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBRXpDOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUc7SUFDaEMsV0FBVyxFQUFFLDRDQUE0QztJQUN6RCxnQkFBZ0IsRUFBRSxpREFBaUQ7SUFDbkUsaUJBQWlCLEVBQUUsa0RBQWtEO0lBQ3JFLGdCQUFnQixFQUFFLGlEQUFpRDtDQUNwRSxDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRztJQUMvQixhQUFhLEVBQUUsNkNBQTZDO0lBQzVELFdBQVcsRUFBRSwyQ0FBMkM7Q0FDekQsQ0FBQztBQTBGRjs7R0FFRztBQUNILE1BQU0sT0FBTyxjQUFjO0lBQ2pCLE9BQU8sQ0FBUztJQUV4QixZQUFZLE9BQWU7UUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsVUFBVSxDQUNyQixVQUFrQixFQUNsQixXQUFtQixFQUNuQixNQUFjLEVBQ2QsT0FBd0MsRUFBRTtRQUUxQyxrQkFBa0I7UUFDbEIsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDaEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNuRCxPQUFPLElBQUksSUFBSSxHQUFHLElBQUksWUFBWSxLQUFLLEdBQUcsR0FBRyxDQUFD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
@@ -0,0 +1,160 @@
1
+ import { type ISnmpOptions } from '../protocols/index.js';
2
+ /**
3
+ * Extended UPS-MIB OIDs (RFC 1628)
4
+ */
5
+ export declare const UPS_SNMP_OIDS: {
6
+ upsIdentManufacturer: string;
7
+ upsIdentModel: string;
8
+ upsIdentUPSSoftwareVersion: string;
9
+ upsIdentAgentSoftwareVersion: string;
10
+ upsIdentName: string;
11
+ upsIdentAttachedDevices: string;
12
+ upsBatteryStatus: string;
13
+ upsSecondsOnBattery: string;
14
+ upsEstimatedMinutesRemaining: string;
15
+ upsEstimatedChargeRemaining: string;
16
+ upsBatteryVoltage: string;
17
+ upsBatteryCurrent: string;
18
+ upsBatteryTemperature: string;
19
+ upsInputLineBads: string;
20
+ upsInputNumLines: string;
21
+ upsInputLineIndex: string;
22
+ upsInputFrequency: string;
23
+ upsInputVoltage: string;
24
+ upsInputCurrent: string;
25
+ upsInputTruePower: string;
26
+ upsOutputSource: string;
27
+ upsOutputFrequency: string;
28
+ upsOutputNumLines: string;
29
+ upsOutputLineIndex: string;
30
+ upsOutputVoltage: string;
31
+ upsOutputCurrent: string;
32
+ upsOutputPower: string;
33
+ upsOutputPercentLoad: string;
34
+ upsBypassFrequency: string;
35
+ upsBypassNumLines: string;
36
+ upsAlarmsPresent: string;
37
+ upsTestId: string;
38
+ upsTestSpinLock: string;
39
+ upsTestResultsSummary: string;
40
+ upsTestResultsDetail: string;
41
+ upsTestStartTime: string;
42
+ upsTestElapsedTime: string;
43
+ upsShutdownType: string;
44
+ upsShutdownAfterDelay: string;
45
+ upsStartupAfterDelay: string;
46
+ upsRebootWithDuration: string;
47
+ upsAutoRestart: string;
48
+ upsConfigInputVoltage: string;
49
+ upsConfigInputFreq: string;
50
+ upsConfigOutputVoltage: string;
51
+ upsConfigOutputFreq: string;
52
+ upsConfigOutputVA: string;
53
+ upsConfigOutputPower: string;
54
+ upsConfigLowBattTime: string;
55
+ upsConfigAudibleStatus: string;
56
+ upsConfigLowVoltageTransferPoint: string;
57
+ upsConfigHighVoltageTransferPoint: string;
58
+ };
59
+ /**
60
+ * Battery status values from UPS-MIB
61
+ */
62
+ export type TUpsBatteryStatus = 'unknown' | 'batteryNormal' | 'batteryLow' | 'batteryDepleted';
63
+ /**
64
+ * Output source values from UPS-MIB
65
+ */
66
+ export type TUpsOutputSource = 'other' | 'none' | 'normal' | 'bypass' | 'battery' | 'booster' | 'reducer';
67
+ /**
68
+ * Test results summary from UPS-MIB
69
+ */
70
+ export type TUpsTestResult = 'donePass' | 'doneWarning' | 'doneError' | 'aborted' | 'inProgress' | 'noTestsInitiated';
71
+ /**
72
+ * SNMP-based UPS status interface
73
+ */
74
+ export interface IUpsSnmpStatus {
75
+ batteryStatus: TUpsBatteryStatus;
76
+ secondsOnBattery: number;
77
+ estimatedMinutesRemaining: number;
78
+ estimatedChargeRemaining: number;
79
+ batteryVoltage: number;
80
+ batteryTemperature: number;
81
+ outputSource: TUpsOutputSource;
82
+ outputFrequency: number;
83
+ outputVoltage: number;
84
+ outputCurrent: number;
85
+ outputPower: number;
86
+ outputPercentLoad: number;
87
+ inputFrequency: number;
88
+ inputVoltage: number;
89
+ alarmsPresent: number;
90
+ }
91
+ /**
92
+ * UPS SNMP handler for querying UPS devices via SNMP
93
+ */
94
+ export declare class UpsSnmpHandler {
95
+ private protocol;
96
+ constructor(address: string, options?: ISnmpOptions);
97
+ /**
98
+ * Close SNMP session
99
+ */
100
+ close(): void;
101
+ /**
102
+ * Get UPS identity information
103
+ */
104
+ getIdentity(): Promise<{
105
+ manufacturer: string;
106
+ model: string;
107
+ softwareVersion: string;
108
+ name: string;
109
+ }>;
110
+ /**
111
+ * Get battery status
112
+ */
113
+ getBatteryStatus(): Promise<{
114
+ status: TUpsBatteryStatus;
115
+ secondsOnBattery: number;
116
+ estimatedMinutesRemaining: number;
117
+ estimatedChargeRemaining: number;
118
+ voltage: number;
119
+ temperature: number;
120
+ }>;
121
+ /**
122
+ * Get input status
123
+ */
124
+ getInputStatus(): Promise<{
125
+ frequency: number;
126
+ voltage: number;
127
+ lineBads: number;
128
+ }>;
129
+ /**
130
+ * Get output status
131
+ */
132
+ getOutputStatus(): Promise<{
133
+ source: TUpsOutputSource;
134
+ frequency: number;
135
+ voltage: number;
136
+ current: number;
137
+ power: number;
138
+ percentLoad: number;
139
+ }>;
140
+ /**
141
+ * Get full UPS status
142
+ */
143
+ getFullStatus(): Promise<IUpsSnmpStatus>;
144
+ /**
145
+ * Check if UPS-MIB is supported on device
146
+ */
147
+ isUpsDevice(): Promise<boolean>;
148
+ /**
149
+ * Get configuration info
150
+ */
151
+ getConfiguration(): Promise<{
152
+ inputVoltage: number;
153
+ inputFrequency: number;
154
+ outputVoltage: number;
155
+ outputFrequency: number;
156
+ outputVA: number;
157
+ outputPower: number;
158
+ lowBatteryTime: number;
159
+ }>;
160
+ }