@prestizni-software/server-dem 0.2.4 → 0.2.6
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/AutoUpdateManagerClass.ts +71 -71
- package/AutoUpdateServerManagerClass.ts +4 -4
- package/AutoUpdatedClientObjectClass.ts +2 -2
- package/AutoUpdatedServerObjectClass.ts +107 -107
- package/CHANGELOG.md +4 -0
- package/CommonTypes.ts +2 -2
- package/package.json +1 -1
- package/server.ts +5 -5
|
@@ -1,71 +1,71 @@
|
|
|
1
|
-
import { AutoUpdated } from "./AutoUpdatedClientObjectClass.
|
|
2
|
-
import { Constructor, IsData, LoggersType, SocketType } from "./CommonTypes.
|
|
3
|
-
|
|
4
|
-
export abstract class AutoUpdateManager<T extends Constructor<any>> {
|
|
5
|
-
protected classes: { [_id: string]: AutoUpdated<T> } = {};
|
|
6
|
-
public socket: SocketType;
|
|
7
|
-
protected classParam: T;
|
|
8
|
-
protected properties: (keyof T)[];
|
|
9
|
-
protected classers: Record<string, AutoUpdateManager<any>>;
|
|
10
|
-
protected loggers: LoggersType = {
|
|
11
|
-
info: () => {},
|
|
12
|
-
debug: () => {},
|
|
13
|
-
error: () => {},
|
|
14
|
-
warn: () => {},
|
|
15
|
-
};
|
|
16
|
-
protected classesAsArray: AutoUpdated<T>[] = [];
|
|
17
|
-
constructor(
|
|
18
|
-
classParam: T,
|
|
19
|
-
socket: SocketType,
|
|
20
|
-
loggers: LoggersType,
|
|
21
|
-
classers: Record<string, AutoUpdateManager<any>>
|
|
22
|
-
) {
|
|
23
|
-
this.classers = classers;
|
|
24
|
-
this.socket = socket;
|
|
25
|
-
this.classParam = classParam;
|
|
26
|
-
this.properties = Reflect.getMetadata(
|
|
27
|
-
"props",
|
|
28
|
-
Object.getPrototypeOf(classParam)
|
|
29
|
-
);
|
|
30
|
-
loggers.warn = loggers.warn ?? loggers.info;
|
|
31
|
-
this.loggers = loggers;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
public getObject(
|
|
36
|
-
_id: string
|
|
37
|
-
): AutoUpdated<T> | null {
|
|
38
|
-
return this.classes[_id];
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
public async deleteObject(_id: string): Promise<void> {
|
|
42
|
-
if (typeof this.classes[_id] === "string")
|
|
43
|
-
this.classes[_id] = await this.handleGetMissingObject(this.classes[_id]);
|
|
44
|
-
(this.classes[_id]).destroy();
|
|
45
|
-
this.classesAsArray.splice(this.classesAsArray.indexOf(this.classes[_id]), 1);
|
|
46
|
-
delete this.classes[_id];
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
public get objectIDs(): string[] {
|
|
50
|
-
return Object.keys(this.classes);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
public get objects(): { [_id: string]: AutoUpdated<T> | string } {
|
|
54
|
-
return this.classes;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
public get objectsAsArray(): AutoUpdated<T>[] {
|
|
58
|
-
return this.classesAsArray;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
public get className(): string {
|
|
62
|
-
return this.classParam.name;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
protected abstract handleGetMissingObject(
|
|
66
|
-
_id: string
|
|
67
|
-
): Promise<AutoUpdated<T>>;
|
|
68
|
-
public abstract createObject(
|
|
69
|
-
data: IsData<InstanceType<T>>
|
|
70
|
-
): Promise<AutoUpdated<T>>;
|
|
71
|
-
}
|
|
1
|
+
import { AutoUpdated } from "./AutoUpdatedClientObjectClass.ts";
|
|
2
|
+
import { Constructor, IsData, LoggersType, SocketType } from "./CommonTypes.ts";
|
|
3
|
+
|
|
4
|
+
export abstract class AutoUpdateManager<T extends Constructor<any>> {
|
|
5
|
+
protected classes: { [_id: string]: AutoUpdated<T> } = {};
|
|
6
|
+
public socket: SocketType;
|
|
7
|
+
protected classParam: T;
|
|
8
|
+
protected properties: (keyof T)[];
|
|
9
|
+
protected classers: Record<string, AutoUpdateManager<any>>;
|
|
10
|
+
protected loggers: LoggersType = {
|
|
11
|
+
info: () => {},
|
|
12
|
+
debug: () => {},
|
|
13
|
+
error: () => {},
|
|
14
|
+
warn: () => {},
|
|
15
|
+
};
|
|
16
|
+
protected classesAsArray: AutoUpdated<T>[] = [];
|
|
17
|
+
constructor(
|
|
18
|
+
classParam: T,
|
|
19
|
+
socket: SocketType,
|
|
20
|
+
loggers: LoggersType,
|
|
21
|
+
classers: Record<string, AutoUpdateManager<any>>
|
|
22
|
+
) {
|
|
23
|
+
this.classers = classers;
|
|
24
|
+
this.socket = socket;
|
|
25
|
+
this.classParam = classParam;
|
|
26
|
+
this.properties = Reflect.getMetadata(
|
|
27
|
+
"props",
|
|
28
|
+
Object.getPrototypeOf(classParam)
|
|
29
|
+
);
|
|
30
|
+
loggers.warn = loggers.warn ?? loggers.info;
|
|
31
|
+
this.loggers = loggers;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
public getObject(
|
|
36
|
+
_id: string
|
|
37
|
+
): AutoUpdated<T> | null {
|
|
38
|
+
return this.classes[_id];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
public async deleteObject(_id: string): Promise<void> {
|
|
42
|
+
if (typeof this.classes[_id] === "string")
|
|
43
|
+
this.classes[_id] = await this.handleGetMissingObject(this.classes[_id]);
|
|
44
|
+
(this.classes[_id]).destroy();
|
|
45
|
+
this.classesAsArray.splice(this.classesAsArray.indexOf(this.classes[_id]), 1);
|
|
46
|
+
delete this.classes[_id];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
public get objectIDs(): string[] {
|
|
50
|
+
return Object.keys(this.classes);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
public get objects(): { [_id: string]: AutoUpdated<T> | string } {
|
|
54
|
+
return this.classes;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
public get objectsAsArray(): AutoUpdated<T>[] {
|
|
58
|
+
return this.classesAsArray;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
public get className(): string {
|
|
62
|
+
return this.classParam.name;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
protected abstract handleGetMissingObject(
|
|
66
|
+
_id: string
|
|
67
|
+
): Promise<AutoUpdated<T>>;
|
|
68
|
+
public abstract createObject(
|
|
69
|
+
data: IsData<InstanceType<T>>
|
|
70
|
+
): Promise<AutoUpdated<T>>;
|
|
71
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Server, Socket } from "socket.io";
|
|
2
|
-
import { AutoUpdateManager } from "./AutoUpdateManagerClass.
|
|
3
|
-
import { createAutoUpdatedClass } from "./AutoUpdatedServerObjectClass.
|
|
2
|
+
import { AutoUpdateManager } from "./AutoUpdateManagerClass.ts";
|
|
3
|
+
import { createAutoUpdatedClass } from "./AutoUpdatedServerObjectClass.ts";
|
|
4
4
|
import {
|
|
5
5
|
Constructor,
|
|
6
6
|
IsData,
|
|
@@ -8,8 +8,8 @@ import {
|
|
|
8
8
|
Paths,
|
|
9
9
|
ServerResponse,
|
|
10
10
|
ServerUpdateRequest,
|
|
11
|
-
} from "./CommonTypes.
|
|
12
|
-
import { BeAnObject, ReturnModelType } from "@typegoose/typegoose/lib/types.
|
|
11
|
+
} from "./CommonTypes.ts";
|
|
12
|
+
import { BeAnObject, ReturnModelType } from "@typegoose/typegoose/lib/types.ts";
|
|
13
13
|
import { getModelForClass } from "@typegoose/typegoose";
|
|
14
14
|
export type WrappedInstances<T extends Record<string, Constructor<any>>> = {
|
|
15
15
|
[K in keyof T]: AutoUpdateServerManager<T[K]>;
|
|
@@ -12,8 +12,8 @@ import {
|
|
|
12
12
|
ServerResponse,
|
|
13
13
|
ServerUpdateRequest,
|
|
14
14
|
SocketType,
|
|
15
|
-
} from "./CommonTypes.
|
|
16
|
-
import { AutoUpdateManager } from "./AutoUpdateManagerClass.
|
|
15
|
+
} from "./CommonTypes.ts";
|
|
16
|
+
import { AutoUpdateManager } from "./AutoUpdateManagerClass.ts";
|
|
17
17
|
import { ObjectId } from "bson";
|
|
18
18
|
|
|
19
19
|
export type AutoUpdated<T extends Constructor<any>> =
|
|
@@ -1,107 +1,107 @@
|
|
|
1
|
-
import { IObjectWithTypegooseFunction } from "@typegoose/typegoose/lib/types.
|
|
2
|
-
import { Types, Document } from "mongoose";
|
|
3
|
-
import { AutoUpdatedClientObject } from "./AutoUpdatedClientObjectClass.
|
|
4
|
-
import {
|
|
5
|
-
AutoProps,
|
|
6
|
-
Constructor,
|
|
7
|
-
DeRef,
|
|
8
|
-
IsData,
|
|
9
|
-
LoggersType,
|
|
10
|
-
ServerUpdateRequest,
|
|
11
|
-
SocketType,
|
|
12
|
-
UnboxConstructor,
|
|
13
|
-
} from "./CommonTypes.
|
|
14
|
-
import { AutoUpdateManager } from "./AutoUpdateManagerClass.
|
|
15
|
-
import { AutoUpdateServerManager } from "./AutoUpdateServerManagerClass.
|
|
16
|
-
import "reflect-metadata";
|
|
17
|
-
|
|
18
|
-
export type AutoUpdated<T extends Constructor<any>> = AutoUpdatedServerObject<T> & UnboxConstructor<T>;
|
|
19
|
-
|
|
20
|
-
export async function createAutoUpdatedClass<C extends Constructor<any>>(
|
|
21
|
-
classParam: C,
|
|
22
|
-
socket: SocketType,
|
|
23
|
-
data: DocWithProps<InstanceType<C>>,
|
|
24
|
-
loggers: LoggersType,
|
|
25
|
-
autoClassers: Record<string, AutoUpdateManager<any>>
|
|
26
|
-
): Promise<AutoProps<C> & AutoUpdated<InstanceType<C>> & DeRef<InstanceType<C>>> {
|
|
27
|
-
const instance = new (class extends AutoUpdatedServerObject<
|
|
28
|
-
InstanceType<C>
|
|
29
|
-
> {})(
|
|
30
|
-
socket,
|
|
31
|
-
data,
|
|
32
|
-
loggers,
|
|
33
|
-
Reflect.getMetadata(
|
|
34
|
-
"props",
|
|
35
|
-
classParam.prototype
|
|
36
|
-
) as (keyof InstanceType<C>)[],
|
|
37
|
-
classParam.name,
|
|
38
|
-
classParam,
|
|
39
|
-
autoClassers
|
|
40
|
-
);
|
|
41
|
-
await instance.isLoadedAsync();
|
|
42
|
-
return instance as AutoProps<C> & AutoUpdated<InstanceType<C>> & DeRef<InstanceType<C>>;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// ---------------------- Class ----------------------
|
|
46
|
-
export abstract class AutoUpdatedServerObject<
|
|
47
|
-
T extends Constructor<any>
|
|
48
|
-
> extends AutoUpdatedClientObject<T> {
|
|
49
|
-
protected readonly isServer: boolean = true;
|
|
50
|
-
private readonly entry: DocWithProps<T>;
|
|
51
|
-
|
|
52
|
-
constructor(
|
|
53
|
-
socket: SocketType,
|
|
54
|
-
data: DocWithProps<T>,
|
|
55
|
-
loggers: {
|
|
56
|
-
info: (...args: any[]) => void;
|
|
57
|
-
debug: (...args: any[]) => void;
|
|
58
|
-
error: (...args: any[]) => void;
|
|
59
|
-
warn?: (...args: any[]) => void;
|
|
60
|
-
},
|
|
61
|
-
properties: (keyof T)[],
|
|
62
|
-
className: string,
|
|
63
|
-
classProp: Constructor<T>,
|
|
64
|
-
autoClassers: Record<string, AutoUpdateManager<any>>
|
|
65
|
-
) {
|
|
66
|
-
super(
|
|
67
|
-
socket,
|
|
68
|
-
data.toObject(),
|
|
69
|
-
loggers,
|
|
70
|
-
properties,
|
|
71
|
-
className,
|
|
72
|
-
classProp,
|
|
73
|
-
autoClassers
|
|
74
|
-
);
|
|
75
|
-
this.entry = data;
|
|
76
|
-
this.socket.emit("new", { id: this.data._id, type: className });
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
protected handleNewObject(_data: IsData<T>) {
|
|
80
|
-
throw new Error("Cannot create new objects like this.");
|
|
81
|
-
}
|
|
82
|
-
protected async setValueInternal(key: string, value: any): Promise<boolean> {
|
|
83
|
-
try {
|
|
84
|
-
await (
|
|
85
|
-
this.autoClassers[this.className] as AutoUpdateServerManager<any>
|
|
86
|
-
).model.updateOne({ _id: this.data._id }, { $set: { [key]: value } });
|
|
87
|
-
|
|
88
|
-
const update: ServerUpdateRequest<T> = this.makeUpdate(key, value);
|
|
89
|
-
this.socket.emit("update" + this.className + this.data._id, update);
|
|
90
|
-
|
|
91
|
-
return true;
|
|
92
|
-
} catch (error) {
|
|
93
|
-
this.loggers.error("Error saving object:", error);
|
|
94
|
-
return false;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
public async destroy(): Promise<void> {
|
|
99
|
-
this.socket.emit("delete" + this.className, this.data._id);
|
|
100
|
-
await this.entry.deleteOne({ _id: this.data._id });
|
|
101
|
-
this.wipeSelf();
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
export type DocWithProps<T> = Document &
|
|
106
|
-
Omit<T & { _id: Types.ObjectId; __v: number }, "typegooseName"> &
|
|
107
|
-
IObjectWithTypegooseFunction;
|
|
1
|
+
import { IObjectWithTypegooseFunction } from "@typegoose/typegoose/lib/types.ts";
|
|
2
|
+
import { Types, Document } from "mongoose";
|
|
3
|
+
import { AutoUpdatedClientObject } from "./AutoUpdatedClientObjectClass.ts";
|
|
4
|
+
import {
|
|
5
|
+
AutoProps,
|
|
6
|
+
Constructor,
|
|
7
|
+
DeRef,
|
|
8
|
+
IsData,
|
|
9
|
+
LoggersType,
|
|
10
|
+
ServerUpdateRequest,
|
|
11
|
+
SocketType,
|
|
12
|
+
UnboxConstructor,
|
|
13
|
+
} from "./CommonTypes.ts";
|
|
14
|
+
import { AutoUpdateManager } from "./AutoUpdateManagerClass.ts";
|
|
15
|
+
import { AutoUpdateServerManager } from "./AutoUpdateServerManagerClass.ts";
|
|
16
|
+
import "reflect-metadata";
|
|
17
|
+
|
|
18
|
+
export type AutoUpdated<T extends Constructor<any>> = AutoUpdatedServerObject<T> & UnboxConstructor<T>;
|
|
19
|
+
|
|
20
|
+
export async function createAutoUpdatedClass<C extends Constructor<any>>(
|
|
21
|
+
classParam: C,
|
|
22
|
+
socket: SocketType,
|
|
23
|
+
data: DocWithProps<InstanceType<C>>,
|
|
24
|
+
loggers: LoggersType,
|
|
25
|
+
autoClassers: Record<string, AutoUpdateManager<any>>
|
|
26
|
+
): Promise<AutoProps<C> & AutoUpdated<InstanceType<C>> & DeRef<InstanceType<C>>> {
|
|
27
|
+
const instance = new (class extends AutoUpdatedServerObject<
|
|
28
|
+
InstanceType<C>
|
|
29
|
+
> {})(
|
|
30
|
+
socket,
|
|
31
|
+
data,
|
|
32
|
+
loggers,
|
|
33
|
+
Reflect.getMetadata(
|
|
34
|
+
"props",
|
|
35
|
+
classParam.prototype
|
|
36
|
+
) as (keyof InstanceType<C>)[],
|
|
37
|
+
classParam.name,
|
|
38
|
+
classParam,
|
|
39
|
+
autoClassers
|
|
40
|
+
);
|
|
41
|
+
await instance.isLoadedAsync();
|
|
42
|
+
return instance as AutoProps<C> & AutoUpdated<InstanceType<C>> & DeRef<InstanceType<C>>;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ---------------------- Class ----------------------
|
|
46
|
+
export abstract class AutoUpdatedServerObject<
|
|
47
|
+
T extends Constructor<any>
|
|
48
|
+
> extends AutoUpdatedClientObject<T> {
|
|
49
|
+
protected readonly isServer: boolean = true;
|
|
50
|
+
private readonly entry: DocWithProps<T>;
|
|
51
|
+
|
|
52
|
+
constructor(
|
|
53
|
+
socket: SocketType,
|
|
54
|
+
data: DocWithProps<T>,
|
|
55
|
+
loggers: {
|
|
56
|
+
info: (...args: any[]) => void;
|
|
57
|
+
debug: (...args: any[]) => void;
|
|
58
|
+
error: (...args: any[]) => void;
|
|
59
|
+
warn?: (...args: any[]) => void;
|
|
60
|
+
},
|
|
61
|
+
properties: (keyof T)[],
|
|
62
|
+
className: string,
|
|
63
|
+
classProp: Constructor<T>,
|
|
64
|
+
autoClassers: Record<string, AutoUpdateManager<any>>
|
|
65
|
+
) {
|
|
66
|
+
super(
|
|
67
|
+
socket,
|
|
68
|
+
data.toObject(),
|
|
69
|
+
loggers,
|
|
70
|
+
properties,
|
|
71
|
+
className,
|
|
72
|
+
classProp,
|
|
73
|
+
autoClassers
|
|
74
|
+
);
|
|
75
|
+
this.entry = data;
|
|
76
|
+
this.socket.emit("new", { id: this.data._id, type: className });
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
protected handleNewObject(_data: IsData<T>) {
|
|
80
|
+
throw new Error("Cannot create new objects like this.");
|
|
81
|
+
}
|
|
82
|
+
protected async setValueInternal(key: string, value: any): Promise<boolean> {
|
|
83
|
+
try {
|
|
84
|
+
await (
|
|
85
|
+
this.autoClassers[this.className] as AutoUpdateServerManager<any>
|
|
86
|
+
).model.updateOne({ _id: this.data._id }, { $set: { [key]: value } });
|
|
87
|
+
|
|
88
|
+
const update: ServerUpdateRequest<T> = this.makeUpdate(key, value);
|
|
89
|
+
this.socket.emit("update" + this.className + this.data._id, update);
|
|
90
|
+
|
|
91
|
+
return true;
|
|
92
|
+
} catch (error) {
|
|
93
|
+
this.loggers.error("Error saving object:", error);
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
public async destroy(): Promise<void> {
|
|
99
|
+
this.socket.emit("delete" + this.className, this.data._id);
|
|
100
|
+
await this.entry.deleteOne({ _id: this.data._id });
|
|
101
|
+
this.wipeSelf();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export type DocWithProps<T> = Document &
|
|
106
|
+
Omit<T & { _id: Types.ObjectId; __v: number }, "typegooseName"> &
|
|
107
|
+
IObjectWithTypegooseFunction;
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
### [0.2.6](https://github.com/Prestizni-Software/server-dem/compare/v0.2.5...v0.2.6) (2025-11-06)
|
|
6
|
+
|
|
7
|
+
### [0.2.5](https://github.com/Prestizni-Software/server-dem/compare/v0.2.4...v0.2.5) (2025-11-06)
|
|
8
|
+
|
|
5
9
|
### [0.2.4](https://github.com/Prestizni-Software/server-dem/compare/v0.2.3...v0.2.4) (2025-11-06)
|
|
6
10
|
|
|
7
11
|
### [0.2.3](https://github.com/Prestizni-Software/server-dem/compare/v0.2.2...v0.2.3) (2025-11-04)
|
package/CommonTypes.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { DefaultEventsMap, Server } from "socket.io";
|
|
2
2
|
import { Socket as SocketClient } from "socket.io-client";
|
|
3
3
|
import { ObjectId } from "bson";
|
|
4
|
-
import { AutoUpdated } from "./AutoUpdatedClientObjectClass.
|
|
4
|
+
import { AutoUpdated } from "./AutoUpdatedClientObjectClass.ts";
|
|
5
5
|
|
|
6
|
-
export type Ref<T extends Constructor<any
|
|
6
|
+
export type Ref<T> = string | (T extends Constructor<any> ? AutoUpdated<T> : (T & { _id: string }));
|
|
7
7
|
export type LoggersTypeInternal = LoggersType & {
|
|
8
8
|
warn: (...args: any[]) => void;
|
|
9
9
|
};
|
package/package.json
CHANGED
package/server.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import * as AutoUpdateServerManagerClass from "./AutoUpdateServerManagerClass.
|
|
2
|
-
import * as AutoUpdateManagerClass from "./AutoUpdateManagerClass.
|
|
3
|
-
import * as AutoUpdatedClientObjectClass from "./AutoUpdatedClientObjectClass.
|
|
4
|
-
import * as AutoUpdatedServerObjectClass from "./AutoUpdatedServerObjectClass.
|
|
5
|
-
import * as CommonTypes from "./CommonTypes.
|
|
1
|
+
import * as AutoUpdateServerManagerClass from "./AutoUpdateServerManagerClass.ts";
|
|
2
|
+
import * as AutoUpdateManagerClass from "./AutoUpdateManagerClass.ts";
|
|
3
|
+
import * as AutoUpdatedClientObjectClass from "./AutoUpdatedClientObjectClass.ts";
|
|
4
|
+
import * as AutoUpdatedServerObjectClass from "./AutoUpdatedServerObjectClass.ts";
|
|
5
|
+
import * as CommonTypes from "./CommonTypes.ts";
|
|
6
6
|
|
|
7
7
|
module.exports = {
|
|
8
8
|
AutoUpdateServerManagerClass,
|