@iobroker/socket-classes 1.6.2 → 2.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.
@@ -0,0 +1,496 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SocketCommon = void 0;
4
+ const socketCommands_1 = require("./socketCommands");
5
+ // this class can manage 3 types of Socket.io
6
+ // - socket.io v2
7
+ // - socket.io v4
8
+ // - iobroker ws socket
9
+ class SocketCommon {
10
+ static COMMAND_RE_AUTHENTICATE = 'reauthenticate';
11
+ server = null;
12
+ serverMode = false;
13
+ settings;
14
+ adapter;
15
+ infoTimeout = null;
16
+ store = null; // will be set in __initAuthentication
17
+ // @ts-expect-error commands actually cannot be null
18
+ commands;
19
+ noDisconnect;
20
+ eventHandlers = {};
21
+ wsRoutes = {};
22
+ // Structure for socket.io 4
23
+ allNamespaces;
24
+ context;
25
+ initialized = false;
26
+ constructor(settings, adapter) {
27
+ this.settings = settings || {};
28
+ this.adapter = adapter;
29
+ this.noDisconnect = this.__getIsNoDisconnect();
30
+ this.settings.defaultUser = this.settings.defaultUser || 'system.user.admin';
31
+ if (!this.settings.defaultUser.match(/^system\.user\./)) {
32
+ this.settings.defaultUser = `system.user.${this.settings.defaultUser}`;
33
+ }
34
+ this.settings.ttl = parseInt(this.settings.ttl, 10) || 3600;
35
+ this.context = {
36
+ language: this.settings.language || 'en',
37
+ ratings: null,
38
+ ratingTimeout: null,
39
+ };
40
+ }
41
+ __getIsNoDisconnect() {
42
+ throw new Error('"__getIsNoDisconnect" must be implemented in SocketCommon!');
43
+ }
44
+ __initAuthentication(_authOptions) {
45
+ throw new Error('"__initAuthentication" must be implemented in SocketCommon!');
46
+ }
47
+ // Extract username from socket
48
+ __getUserFromSocket(_socket, _callback) {
49
+ throw new Error('"__getUserFromSocket" must be implemented in SocketCommon!');
50
+ }
51
+ __getClientAddress(_socket) {
52
+ throw new Error('"__getClientAddress" must be implemented in SocketCommon!');
53
+ }
54
+ // update session ID, but not ofter than 60 seconds
55
+ __updateSession(_socket) {
56
+ throw new Error('"__updateSession" must be implemented in SocketCommon!');
57
+ }
58
+ __getSessionID(_socket) {
59
+ throw new Error('"__getSessionID" must be implemented in SocketCommon!');
60
+ }
61
+ /** Install handler on connecting and disconnecting events */
62
+ addEventHandler(eventName, handler) {
63
+ this.eventHandlers[eventName] = handler;
64
+ }
65
+ /**
66
+ * Add a new route for the websocket
67
+ *
68
+ * @param path the path to listen for like "/cameras.0/*"
69
+ * @param handler Web socket custom handler
70
+ */
71
+ addWsRoute(path, handler) {
72
+ this.wsRoutes[path] = handler;
73
+ }
74
+ start(server, socketClass, authOptions, socketOptions) {
75
+ this.serverMode = !!socketClass;
76
+ this.commands ||= new socketCommands_1.SocketCommands(this.adapter, socket => this.__updateSession(socket), this.context);
77
+ if (!server) {
78
+ throw new Error('Server cannot be empty');
79
+ }
80
+ // it can be used as a client too for cloud
81
+ if (socketClass) {
82
+ if (!this.initialized) {
83
+ // @ts-expect-error socket.io v2 has listen function
84
+ if (typeof socketClass.listen === 'function') {
85
+ // old socket.io@2.x and ws
86
+ // @ts-expect-error socket.io v2 has the listen function
87
+ this.server = socketClass.listen(server, socketOptions);
88
+ }
89
+ else if (typeof socketClass.constructor === 'function') {
90
+ // iobroker socket
91
+ this.server = new socketClass(server);
92
+ }
93
+ else {
94
+ // socket.io 4.x
95
+ // @ts-expect-error socket.io v4 could be created without new
96
+ this.server = socketClass(server, socketOptions);
97
+ }
98
+ // @ts-expect-error socket.io v4 supports namespaces
99
+ if (typeof this.server.of === 'function') {
100
+ // @ts-expect-error socket.io v4 supports namespaces
101
+ this.allNamespaces = this.server.of(/.*/);
102
+ }
103
+ this.initialized = true;
104
+ this.adapter.log.info(`${this.settings.secure ? 'Secure ' : ''}socket.io server listening on port ${this.settings.port}`);
105
+ }
106
+ if (this.settings.auth && this.server) {
107
+ this.__initAuthentication(authOptions);
108
+ }
109
+ // Enable cross-domain access
110
+ // deprecated, because no more used in socket.io@4 only(in @2)
111
+ // @ts-expect-error socket.io v2 has "set" for options
112
+ if (this.settings.crossDomain && this.server.set) {
113
+ // @ts-expect-error socket.io v2 has "set" for options
114
+ this.server.set('origins', '*:*');
115
+ }
116
+ this.server.on('connection', (socket, cb) => {
117
+ // Support of handlers for web sockets by path
118
+ // Todo: support of wildcards like /cameras.0/*
119
+ if (socket.conn?.request?.pathname && this.wsRoutes[socket.conn.request.pathname]) {
120
+ this.wsRoutes[socket.conn.request.pathname](socket, cb);
121
+ return;
122
+ }
123
+ this.eventHandlers.connect?.(socket);
124
+ this._initSocket(socket, cb);
125
+ });
126
+ // support of dynamic namespaces (because of reverse proxy) for socket.io 4
127
+ this.allNamespaces?.on('connection', (socket, cb) => {
128
+ // Support of handlers for web sockets by path
129
+ // Todo: support of wildcards like /cameras.0/*
130
+ if (socket.conn?.request?.pathname && this.wsRoutes[socket.conn.request.pathname]) {
131
+ this.wsRoutes[socket.conn.request.pathname](socket, cb);
132
+ return;
133
+ }
134
+ this.eventHandlers.connect?.(socket);
135
+ this._initSocket(socket, cb);
136
+ });
137
+ }
138
+ this.server.on('error', (error, details) => {
139
+ // ignore "failed connection" as it already shown
140
+ if (!error?.message?.includes('failed connection')) {
141
+ if (error?.message?.includes('authentication failed') ||
142
+ details?.toString().includes('authentication failed')) {
143
+ this.adapter.log.debug(`Error: ${error?.message || JSON.stringify(error)}${details ? ` - ${!details || typeof details === 'object' ? JSON.stringify(details) : details.toString()}` : ''}`);
144
+ }
145
+ else {
146
+ this.adapter.log.error(`Error: ${error?.message || JSON.stringify(error)}${details ? ` - ${!details || typeof details === 'object' ? JSON.stringify(details) : details.toString()}` : ''}`);
147
+ }
148
+ }
149
+ });
150
+ // support of dynamic namespaces (because of reverse proxy)
151
+ this.allNamespaces?.on('error', (error, details) => {
152
+ // ignore "failed connection" as it already shown
153
+ if (!error?.message?.includes('failed connection')) {
154
+ if (error && error.message && error.message.includes('authentication failed')) {
155
+ this.adapter.log.debug(`Error: ${(error && error.message) || JSON.stringify(error)}${details ? ` - ${!details || typeof details === 'object' ? JSON.stringify(details) : details.toString()}` : ''}`);
156
+ }
157
+ else {
158
+ this.adapter.log.error(`Error: ${(error && error.message) || JSON.stringify(error)}${details ? ` - ${!details || typeof details === 'object' ? JSON.stringify(details) : details.toString()}` : ''}`);
159
+ }
160
+ }
161
+ });
162
+ this.#updateConnectedInfo();
163
+ }
164
+ _initSocket(socket, cb) {
165
+ this.commands.disableEventThreshold();
166
+ const address = this.__getClientAddress(socket);
167
+ if (!socket._acl) {
168
+ if (this.settings.auth) {
169
+ this.__getUserFromSocket(socket, (err, user) => {
170
+ if (err || !user) {
171
+ socket.emit(SocketCommon.COMMAND_RE_AUTHENTICATE);
172
+ this.adapter.log.error(`socket.io [init] ${err || 'No user found in cookies'}`);
173
+ // ws does not require disconnect
174
+ if (!this.noDisconnect) {
175
+ socket.close();
176
+ }
177
+ }
178
+ else {
179
+ socket._secure = true;
180
+ this.adapter.log.debug(`socket.io client ${user} connected`);
181
+ if (!user.startsWith('system.user.')) {
182
+ user = `system.user.${user}`;
183
+ }
184
+ void this.adapter.calculatePermissions(user, socketCommands_1.SocketCommands.COMMANDS_PERMISSIONS, (acl) => {
185
+ socket._acl = SocketCommon._mergeACLs(address.address, acl, this.settings.whiteListSettings);
186
+ this._socketEvents(socket, address.address, cb);
187
+ });
188
+ }
189
+ });
190
+ }
191
+ else {
192
+ void this.adapter.calculatePermissions(this.settings.defaultUser || '', socketCommands_1.SocketCommands.COMMANDS_PERMISSIONS, (acl) => {
193
+ socket._acl = SocketCommon._mergeACLs(address.address, acl, this.settings.whiteListSettings);
194
+ this._socketEvents(socket, address.address, cb);
195
+ });
196
+ }
197
+ }
198
+ else {
199
+ this._socketEvents(socket, address.address, cb);
200
+ }
201
+ }
202
+ unsubscribeSocket(socket, type) {
203
+ return this.commands.unsubscribeSocket(socket, type);
204
+ }
205
+ _unsubscribeAll() {
206
+ if (this.server?.ioBroker) {
207
+ // this could be an object or array
208
+ const sockets = this.getSocketsList();
209
+ // this could be an object or array: an array is ioBroker, object is socket.io
210
+ if (Array.isArray(sockets)) {
211
+ for (const socket of sockets) {
212
+ this.commands.unsubscribeSocket(socket);
213
+ }
214
+ }
215
+ else {
216
+ Object.values(sockets).forEach(socket => {
217
+ this.commands.unsubscribeSocket(socket);
218
+ });
219
+ }
220
+ }
221
+ else if (this.server?.sockets) {
222
+ // It is socket.io
223
+ for (const socket in this.server.sockets) {
224
+ if (Object.prototype.hasOwnProperty.call(this.server.sockets, socket)) {
225
+ // @ts-expect-error socket.io has own structure
226
+ this.commands.unsubscribeSocket(this.server.sockets[socket]);
227
+ }
228
+ }
229
+ }
230
+ }
231
+ static getWhiteListIpForAddress(address, whiteList) {
232
+ if (!whiteList) {
233
+ return null;
234
+ }
235
+ // check IPv6 or IPv4 direct match
236
+ if (Object.prototype.hasOwnProperty.call(whiteList, address)) {
237
+ return address;
238
+ }
239
+ // check if the address is IPv4
240
+ const addressParts = address.split('.');
241
+ if (addressParts.length !== 4) {
242
+ return null;
243
+ }
244
+ // do we have settings for wild-carded ips?
245
+ const wildCardIps = Object.keys(whiteList).filter(key => key.includes('*'));
246
+ if (!wildCardIps.length) {
247
+ // no wild-carded ips => no ip configured
248
+ return null;
249
+ }
250
+ wildCardIps.forEach(ip => {
251
+ const ipParts = ip.split('.');
252
+ if (ipParts.length === 4) {
253
+ for (let i = 0; i < 4; i++) {
254
+ if (ipParts[i] === '*' && i === 3) {
255
+ // match
256
+ return ip;
257
+ }
258
+ if (ipParts[i] !== addressParts[i]) {
259
+ break;
260
+ }
261
+ }
262
+ }
263
+ });
264
+ return null;
265
+ }
266
+ static _getPermissionsForIp(address, whiteList) {
267
+ return whiteList[SocketCommon.getWhiteListIpForAddress(address, whiteList) || 'default'];
268
+ }
269
+ static _mergeACLs(address, acl, whiteList) {
270
+ if (whiteList && address) {
271
+ const whiteListAcl = SocketCommon._getPermissionsForIp(address, whiteList);
272
+ if (whiteListAcl) {
273
+ if (acl.object && whiteListAcl.object) {
274
+ if (whiteListAcl.object.list !== undefined) {
275
+ acl.object.list = acl.object.list && whiteListAcl.object.list;
276
+ }
277
+ if (whiteListAcl.object.read !== undefined) {
278
+ acl.object.read = acl.object.read && whiteListAcl.object.read;
279
+ }
280
+ if (whiteListAcl.object.write !== undefined) {
281
+ acl.object.write = acl.object.write && whiteListAcl.object.write;
282
+ }
283
+ if (whiteListAcl.object.delete !== undefined) {
284
+ acl.object.delete = acl.object.delete && whiteListAcl.object.delete;
285
+ }
286
+ }
287
+ if (acl.state && whiteListAcl.state) {
288
+ if (whiteListAcl.state.list !== undefined) {
289
+ acl.state.list = acl.state.list && whiteListAcl.state.list;
290
+ }
291
+ if (whiteListAcl.state.read !== undefined) {
292
+ acl.state.read = acl.state.read && whiteListAcl.state.read;
293
+ }
294
+ if (whiteListAcl.state.write !== undefined) {
295
+ acl.state.write = acl.state.write && whiteListAcl.state.write;
296
+ }
297
+ if (whiteListAcl.state.create !== undefined) {
298
+ acl.state.create = acl.state.create && whiteListAcl.state.create;
299
+ }
300
+ if (whiteListAcl.state.delete !== undefined) {
301
+ acl.state.delete = acl.state.delete && whiteListAcl.state.delete;
302
+ }
303
+ }
304
+ if (acl.file && whiteListAcl.file) {
305
+ if (whiteListAcl.file.list !== undefined) {
306
+ acl.file.list = acl.file.list && whiteListAcl.file.list;
307
+ }
308
+ if (whiteListAcl.file.read !== undefined) {
309
+ acl.file.read = acl.file.read && whiteListAcl.file.read;
310
+ }
311
+ if (whiteListAcl.file.write !== undefined) {
312
+ acl.file.write = acl.file.write && whiteListAcl.file.write;
313
+ }
314
+ if (whiteListAcl.file.create !== undefined) {
315
+ acl.file.create = acl.file.create && whiteListAcl.file.create;
316
+ }
317
+ if (whiteListAcl.file.delete !== undefined) {
318
+ acl.file.delete = acl.file.delete && whiteListAcl.file.delete;
319
+ }
320
+ }
321
+ if (whiteListAcl.user !== 'auth') {
322
+ acl.user = `system.user.${whiteListAcl.user}`;
323
+ }
324
+ }
325
+ }
326
+ return acl;
327
+ }
328
+ // install event handlers on socket
329
+ _socketEvents(socket, address, cb) {
330
+ if (this.serverMode) {
331
+ this.adapter.log.info(`==> Connected ${socket._acl?.user} from ${address}`);
332
+ }
333
+ else {
334
+ this.adapter.log.info(`Trying to connect as ${socket._acl?.user} to ${address}`);
335
+ }
336
+ this.#updateConnectedInfo();
337
+ if (!this.commands.getCommandHandler('name')) {
338
+ // socket sends its name => update list of sockets
339
+ this.addCommandHandler('name', (_socket, name, cb) => {
340
+ this.adapter.log.debug(`Connection from "${name}"`);
341
+ if (_socket._name === undefined) {
342
+ _socket._name = name;
343
+ this.#updateConnectedInfo();
344
+ }
345
+ else if (_socket._name !== name) {
346
+ this.adapter.log.warn(`socket ${_socket.id} changed socket name from ${_socket._name} to ${name}`);
347
+ _socket._name = name;
348
+ this.#updateConnectedInfo();
349
+ }
350
+ if (typeof cb === 'function') {
351
+ cb();
352
+ }
353
+ });
354
+ }
355
+ this.commands.applyCommands(socket);
356
+ // disconnect
357
+ socket.on('disconnect', (error) => {
358
+ this.commands.unsubscribeSocket(socket);
359
+ this.#updateConnectedInfo();
360
+ // Disable logging if no one browser is connected
361
+ if (this.adapter.requireLog && this.commands && this.commands.isLogEnabled()) {
362
+ this.adapter.log.debug('Disable logging, because no one socket connected');
363
+ void this.adapter.requireLog(!!this.server?.engine?.clientsCount);
364
+ }
365
+ if (this.eventHandlers.disconnect) {
366
+ this.eventHandlers.disconnect(socket, error?.toString());
367
+ }
368
+ else {
369
+ this.adapter.log.info(`<== Disconnect ${socket._acl?.user} from ${this.__getClientAddress(socket).address} ${socket._name || ''}`);
370
+ }
371
+ });
372
+ if (typeof this.settings.extensions === 'function') {
373
+ this.settings.extensions(socket);
374
+ }
375
+ // if server mode
376
+ if (this.serverMode) {
377
+ const sessionId = this.__getSessionID(socket);
378
+ if (sessionId) {
379
+ socket._secure = true;
380
+ socket._sessionID = sessionId;
381
+ // Get user for session
382
+ this.store?.get(socket._sessionID, (err, obj) => {
383
+ if (!obj?.passport) {
384
+ if (socket._acl) {
385
+ socket._acl.user = '';
386
+ }
387
+ socket.emit(SocketCommon.COMMAND_RE_AUTHENTICATE);
388
+ // ws does not require disconnect
389
+ if (!this.noDisconnect) {
390
+ socket.close();
391
+ }
392
+ }
393
+ if (socket._authPending) {
394
+ socket._authPending(!!socket._acl?.user, true);
395
+ delete socket._authPending;
396
+ }
397
+ });
398
+ }
399
+ }
400
+ this.commands.subscribeSocket(socket);
401
+ cb && cb();
402
+ }
403
+ #updateConnectedInfo() {
404
+ // only in server mode
405
+ if (this.serverMode) {
406
+ if (this.infoTimeout) {
407
+ clearTimeout(this.infoTimeout);
408
+ this.infoTimeout = null;
409
+ }
410
+ this.infoTimeout = setTimeout(() => {
411
+ this.infoTimeout = null;
412
+ if (this.server) {
413
+ const clientsArray = [];
414
+ const sockets = this.getSocketsList();
415
+ // this could be an object or array: an array is ioBroker, object is socket.io
416
+ if (Array.isArray(sockets)) {
417
+ for (const socket of sockets) {
418
+ clientsArray.push(socket._name || 'noname');
419
+ }
420
+ }
421
+ else {
422
+ Object.values(sockets).forEach(socket => {
423
+ clientsArray.push(socket._name || 'noname');
424
+ });
425
+ }
426
+ const text = `[${clientsArray.length}]${clientsArray.join(', ')}`;
427
+ void this.adapter.setState('info.connected', text, true);
428
+ }
429
+ }, 1000);
430
+ }
431
+ }
432
+ checkPermissions(socket, command, callback, ...args) {
433
+ return this.commands._checkPermissions(socket, command, callback, args);
434
+ }
435
+ addCommandHandler(command, handler) {
436
+ this.commands.addCommandHandler(command, handler);
437
+ }
438
+ sendLog(obj) {
439
+ // TODO Build in some threshold
440
+ this.server?.sockets?.emit('log', obj);
441
+ }
442
+ publish(socket, type, id, obj) {
443
+ return this.commands.publish(socket, type, id, obj);
444
+ }
445
+ publishInstanceMessage(socket, sourceInstance, messageType, data) {
446
+ return this.commands.publishInstanceMessage(socket, sourceInstance, messageType, data);
447
+ }
448
+ publishFile(socket, id, fileName, size) {
449
+ return this.commands.publishFile(socket, id, fileName, size);
450
+ }
451
+ getSocketsList() {
452
+ if (this.server?.sockets) {
453
+ // this could be an object or array
454
+ return this.server.sockets.sockets || this.server.sockets.connected;
455
+ }
456
+ return null;
457
+ }
458
+ publishInstanceMessageAll(sourceInstance, messageType, sid, data) {
459
+ const sockets = this.getSocketsList();
460
+ if (sockets) {
461
+ // this could be an object or array: an array is ioBroker, an object is socket.io
462
+ if (Array.isArray(sockets)) {
463
+ for (const socket of sockets) {
464
+ if (socket.id === sid) {
465
+ this.publishInstanceMessage(socket, sourceInstance, messageType, data);
466
+ }
467
+ }
468
+ }
469
+ else {
470
+ Object.values(sockets).forEach(socket => {
471
+ if (socket.id === sid) {
472
+ this.publishInstanceMessage(socket, sourceInstance, messageType, data);
473
+ }
474
+ });
475
+ }
476
+ }
477
+ }
478
+ close() {
479
+ this._unsubscribeAll();
480
+ this.commands.destroy();
481
+ // IO server will be closed
482
+ try {
483
+ this.server?.close?.();
484
+ this.server = null;
485
+ }
486
+ catch {
487
+ // ignore
488
+ }
489
+ if (this.infoTimeout) {
490
+ clearTimeout(this.infoTimeout);
491
+ this.infoTimeout = null;
492
+ }
493
+ }
494
+ }
495
+ exports.SocketCommon = SocketCommon;
496
+ //# sourceMappingURL=socketCommon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socketCommon.js","sourceRoot":"","sources":["../../src/lib/socketCommon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ export type SocketOperation = 'read' | 'write' | 'list' | 'delete' | 'create' | 'http' | 'execute' | 'sendto' | '';
2
+
3
+ export type PermissionCommands =
4
+ | 'subscribe'
5
+ | 'unsubscribe'
6
+ | 'subscribeFiles'
7
+ | 'unsubscribeFiles'
8
+ | 'getStateHistory'
9
+ | 'httpGet'
10
+ | 'sendTo'
11
+ | 'cmdExec'
12
+ | 'sendToHost'
13
+ | 'authEnabled'
14
+ | 'getUserPermissions'
15
+ | 'getVersion'
16
+ | 'getAdapterName'
17
+ | 'readFile'
18
+ | 'readFile64'
19
+ | 'writeFile64'
20
+ | 'writeFile'
21
+ | 'unlink'
22
+ | 'rename'
23
+ | 'mkdir'
24
+ | 'readDir'
25
+ | 'chmodFile'
26
+ | 'chownFile'
27
+ | 'fileExists'
28
+ | 'getObject'
29
+ | 'setObject'
30
+ | 'getObjects'
31
+ | 'subscribeObjects'
32
+ | 'unsubscribeObjects'
33
+ | 'getStates'
34
+ | 'getState'
35
+ | 'setState'
36
+ | 'getObjectView'
37
+ | 'delObject'
38
+ | 'requireLog'
39
+ | 'createState'
40
+ | 'createFile'
41
+ | 'deleteFile'
42
+ | 'disconnect'
43
+ | 'listPermissions'
44
+
45
+ // admin
46
+ | 'getHostByIp'
47
+ | 'delGroup'
48
+ | 'addGroup'
49
+ | 'delUser'
50
+ | 'addUser'
51
+ | 'changePassword'
52
+ | 'readLogs'
53
+ | 'delState'
54
+ | 'extendObject';
55
+
56
+ export type SocketSubscribeTypes = 'fileChange' | 'stateChange' | 'objectChange' | 'log';
57
+
58
+ export interface CallOptions {
59
+ user?: string;
60
+ }
61
+
62
+ export type SocketCallback = (error: string | Error | null | undefined, ...args: any[]) => void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iobroker/socket-classes",
3
- "version": "1.6.2",
3
+ "version": "2.0.0",
4
4
  "description": "ioBroker server-side web sockets",
5
5
  "author": {
6
6
  "name": "bluefox",
@@ -21,41 +21,47 @@
21
21
  "url": "https://github.com/ioBroker/ioBroker.socket-classes"
22
22
  },
23
23
  "dependencies": {
24
- "@iobroker/adapter-core": "^3.2.2",
25
- "axios": "^1.7.8",
24
+ "@iobroker/adapter-core": "^3.2.3",
25
+ "axios": "^1.7.9",
26
26
  "cookie-parser": "^1.4.7",
27
27
  "passport": "^0.7.0"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@alcalzone/release-script": "^3.8.0",
31
31
  "@alcalzone/release-script-plugin-license": "^3.7.0",
32
- "@foxriver76/eslint-config": "^1.0.5",
32
+ "@iobroker/eslint-config": "^1.0.0",
33
+ "@iobroker/js-controller-common-db": "^7.0.6",
34
+ "@iobroker/ws-server": "^4.2.2",
35
+ "@iobroker/types": "^7.0.6",
36
+ "@types/axios": "^0.14.4",
37
+ "@types/cookie-parser": "^1.4.8",
38
+ "@types/node": "^22.13.1",
39
+ "@types/passport": "^1.0.17",
33
40
  "chai": "^4.5.0",
34
- "gulp": "^4.0.2",
35
- "iobroker.js-controller": "^6.0.11",
36
- "mocha": "^10.8.2"
41
+ "iobroker.js-controller": "^7.0.6",
42
+ "mocha": "^11.1.0",
43
+ "typescript": "^5.7.3"
37
44
  },
38
45
  "bugs": {
39
46
  "url": "https://github.com/ioBroker/ioBroker.web/issues"
40
47
  },
41
- "main": "index.js",
48
+ "main": "dist/index.js",
42
49
  "files": [
43
50
  "LICENSE",
44
- "lib/",
45
- "index.js",
46
- "lib/socketCommon.js",
47
- "lib/socketAdmin.js"
51
+ "dist/"
48
52
  ],
49
53
  "scripts": {
50
- "lint": "eslint .",
51
- "test": "node node_modules/mocha/bin/mocha --exit",
54
+ "lint": "eslint -c eslint.config.mjs",
55
+ "test": "mocha --exit",
56
+ "build": "npm run build-backend && npm run docs",
57
+ "build-backend": "tsc -p tsconfig.build.json && node tasks --prebuild",
52
58
  "release": "release-script",
53
59
  "release-patch": "release-script patch --no-update-lockfile --yes",
54
60
  "release-minor": "release-script minor --no-update-lockfile --yes",
55
61
  "release-major": "release-script major --no-update-lockfile --yes",
56
- "update-packages": "ncu --upgrade",
57
- "npm": "npm install --ignore-script",
58
- "docs": "gulp"
62
+ "update-packages": "npx -y npm-check-updates --upgrade",
63
+ "docs": "node tasks",
64
+ "npm": "npm i -f"
59
65
  },
60
66
  "license": "MIT",
61
67
  "maintainers": [