@prestizni-software/server-dem 0.2.22 → 0.2.23
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/dist/AutoUpdateManagerClass.d.ts +28 -0
- package/dist/AutoUpdateManagerClass.js +56 -0
- package/dist/AutoUpdateManagerClass.js.map +1 -0
- package/dist/AutoUpdateServerManagerClass.d.ts +55 -0
- package/dist/AutoUpdateServerManagerClass.js +126 -0
- package/dist/AutoUpdateServerManagerClass.js.map +1 -0
- package/dist/AutoUpdatedClientObjectClass.d.ts +47 -0
- package/dist/AutoUpdatedClientObjectClass.js +384 -0
- package/dist/AutoUpdatedClientObjectClass.js.map +1 -0
- package/dist/AutoUpdatedServerObjectClass.d.ts +27 -0
- package/dist/AutoUpdatedServerObjectClass.js +64 -0
- package/dist/AutoUpdatedServerObjectClass.js.map +1 -0
- package/dist/CommonTypes.d.ts +78 -0
- package/dist/CommonTypes.js +10 -0
- package/dist/CommonTypes.js.map +1 -0
- package/dist/server.d.ts +1 -0
- package/{server.ts → dist/server.js} +13 -13
- package/dist/server.js.map +1 -0
- package/package.json +7 -2
- package/AutoUpdateManagerClass.ts +0 -83
- package/AutoUpdateServerManagerClass.ts +0 -253
- package/AutoUpdatedClientObjectClass.ts +0 -532
- package/AutoUpdatedServerObjectClass.ts +0 -142
- package/CHANGELOG.md +0 -49
- package/CommonTypes.ts +0 -161
- package/tsconfig.json +0 -113
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import { AutoUpdated } from "./AutoUpdatedClientObjectClass.js";
|
|
2
|
-
import { Constructor, IsData, LoggersType, SocketType } from "./CommonTypes.js";
|
|
3
|
-
import "reflect-metadata";
|
|
4
|
-
|
|
5
|
-
export abstract class AutoUpdateManager<T extends Constructor<any>> {
|
|
6
|
-
protected classes: { [_id: string]: AutoUpdated<T> } = {};
|
|
7
|
-
public socket: SocketType;
|
|
8
|
-
protected classParam: T;
|
|
9
|
-
protected properties: (keyof T)[];
|
|
10
|
-
public readonly classers: Record<string, AutoUpdateManager<any>>;
|
|
11
|
-
protected loggers: LoggersType = {
|
|
12
|
-
info: () => {},
|
|
13
|
-
debug: () => {},
|
|
14
|
-
error: () => {},
|
|
15
|
-
warn: () => {},
|
|
16
|
-
};
|
|
17
|
-
protected classesAsArray: AutoUpdated<T>[] = [];
|
|
18
|
-
protected emitter: EventTarget;
|
|
19
|
-
private isLoaded = false;
|
|
20
|
-
constructor(
|
|
21
|
-
classParam: T,
|
|
22
|
-
socket: SocketType,
|
|
23
|
-
loggers: LoggersType,
|
|
24
|
-
classers: Record<string, AutoUpdateManager<any>>,
|
|
25
|
-
emitter: EventTarget
|
|
26
|
-
) {
|
|
27
|
-
this.emitter = emitter;
|
|
28
|
-
this.classers = classers;
|
|
29
|
-
this.socket = socket;
|
|
30
|
-
this.classParam = classParam;
|
|
31
|
-
this.properties = Reflect.getMetadata(
|
|
32
|
-
"props",
|
|
33
|
-
Object.getPrototypeOf(classParam)
|
|
34
|
-
);
|
|
35
|
-
loggers.warn = loggers.warn ?? loggers.info;
|
|
36
|
-
this.loggers = loggers;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
public getObject(
|
|
41
|
-
_id: string
|
|
42
|
-
): AutoUpdated<T> | null {
|
|
43
|
-
return this.classes[_id];
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
public async isLoadedAsync(): Promise<boolean> {
|
|
47
|
-
if (this.isLoaded) return this.isLoaded;
|
|
48
|
-
await new Promise((resolve) => this.emitter.addEventListener("ManagerLoaded"+this.classParam.name+this.className, resolve));
|
|
49
|
-
this.isLoaded = true;
|
|
50
|
-
return this.isLoaded;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
public async deleteObject(_id: string): Promise<void> {
|
|
54
|
-
if (typeof this.classes[_id] === "string")
|
|
55
|
-
this.classes[_id] = await this.handleGetMissingObject(this.classes[_id]);
|
|
56
|
-
(this.classes[_id]).destroy();
|
|
57
|
-
this.classesAsArray.splice(this.classesAsArray.indexOf(this.classes[_id]), 1);
|
|
58
|
-
delete this.classes[_id];
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
public get objectIDs(): string[] {
|
|
62
|
-
return Object.keys(this.classes);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
public get objects(): { [_id: string]: AutoUpdated<T> | string } {
|
|
66
|
-
return this.classes;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
public get objectsAsArray(): AutoUpdated<T>[] {
|
|
70
|
-
return this.classesAsArray;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
public get className(): string {
|
|
74
|
-
return this.classParam.name;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
protected abstract handleGetMissingObject(
|
|
78
|
-
_id: string
|
|
79
|
-
): Promise<AutoUpdated<T>>;
|
|
80
|
-
public abstract createObject(
|
|
81
|
-
data: IsData<InstanceType<T>>
|
|
82
|
-
): Promise<AutoUpdated<T>>;
|
|
83
|
-
}
|
|
@@ -1,253 +0,0 @@
|
|
|
1
|
-
import { Server, Socket } from "socket.io";
|
|
2
|
-
import { AutoUpdateManager } from "./AutoUpdateManagerClass.js";
|
|
3
|
-
import {
|
|
4
|
-
createAutoUpdatedClass,
|
|
5
|
-
} from "./AutoUpdatedServerObjectClass.js";
|
|
6
|
-
import {
|
|
7
|
-
Constructor,
|
|
8
|
-
IsData,
|
|
9
|
-
LoggersType,
|
|
10
|
-
Paths,
|
|
11
|
-
PathValueOf,
|
|
12
|
-
ServerResponse,
|
|
13
|
-
ServerUpdateRequest,
|
|
14
|
-
} from "./CommonTypes.js";
|
|
15
|
-
import { BeAnObject, ReturnModelType } from "@typegoose/typegoose/lib/types.js";
|
|
16
|
-
import { getModelForClass } from "@typegoose/typegoose";
|
|
17
|
-
export type WrappedInstances<T extends Record<string, Constructor<any>>> = {
|
|
18
|
-
[K in keyof T]: AutoUpdateServerManager<T[K]>;
|
|
19
|
-
};
|
|
20
|
-
type AccessDefinitions<C extends Constructor<any>> = {
|
|
21
|
-
[K in Paths<C>]?: {
|
|
22
|
-
access?: string[];
|
|
23
|
-
update?: boolean;
|
|
24
|
-
};
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
export type AutoStatusDefinitions<
|
|
28
|
-
C extends Constructor<any>,
|
|
29
|
-
E extends Record<string, string | number>,
|
|
30
|
-
S extends StatusDefinition<C>
|
|
31
|
-
> = {
|
|
32
|
-
statusProperty: Paths<C>;
|
|
33
|
-
statusEnum: E;
|
|
34
|
-
definitions: { [K in keyof E]: S };
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
type StatusDefinition<C extends Constructor<any>> = {
|
|
38
|
-
[K in Paths<C>]?: PathValueOf<C, K>;
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
export function createAutoStatusDefinitions<
|
|
42
|
-
C extends Constructor<any>,
|
|
43
|
-
E extends { [k: string]: string | number },
|
|
44
|
-
S extends StatusDefinition<C>
|
|
45
|
-
>(
|
|
46
|
-
_class: C,
|
|
47
|
-
_template: S,
|
|
48
|
-
statusProperty: Paths<C>,
|
|
49
|
-
statusEnum: E,
|
|
50
|
-
definitions: { [K in keyof E]: S }
|
|
51
|
-
): AutoStatusDefinitions<C, E, S> {
|
|
52
|
-
return {
|
|
53
|
-
statusProperty,
|
|
54
|
-
statusEnum,
|
|
55
|
-
definitions,
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export type AUSDefinitions<T extends Record<string, Constructor<any>>> = {
|
|
60
|
-
[K in keyof T]: ServerManagerDefinition<T[K]>;
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
export type AUSOption<C extends Constructor<any>> = {
|
|
64
|
-
accessDefinitions?: Partial<AccessDefinitions<C>>;
|
|
65
|
-
autoStatusDefinitions?: AutoStatusDefinitions<
|
|
66
|
-
C,
|
|
67
|
-
{ [k: string]: string | number },
|
|
68
|
-
StatusDefinition<C>
|
|
69
|
-
>;
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
type ServerManagerDefinition<C extends Constructor<any>> = {
|
|
73
|
-
class: C;
|
|
74
|
-
options?: AUSOption<C>;
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
export async function AUSManagerFactory<
|
|
78
|
-
T extends Record<string, Constructor<any>>
|
|
79
|
-
>(
|
|
80
|
-
defs: AUSDefinitions<T>,
|
|
81
|
-
loggers: LoggersType,
|
|
82
|
-
socket: Server,
|
|
83
|
-
emitter: EventTarget
|
|
84
|
-
): Promise<{ [K in keyof T]: AutoUpdateServerManager<T[K]> }> {
|
|
85
|
-
const classers: any = {};
|
|
86
|
-
|
|
87
|
-
let i = 0;
|
|
88
|
-
for (const key in defs) {
|
|
89
|
-
const def = defs[key];
|
|
90
|
-
const c = new AutoUpdateServerManager(
|
|
91
|
-
def.class,
|
|
92
|
-
loggers,
|
|
93
|
-
socket,
|
|
94
|
-
getModelForClass(def.class),
|
|
95
|
-
classers,
|
|
96
|
-
emitter,
|
|
97
|
-
def.options
|
|
98
|
-
) as any;
|
|
99
|
-
i++;
|
|
100
|
-
classers[key] = c;
|
|
101
|
-
await c.loadDB();
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
return classers as WrappedInstances<T>;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
export class AutoUpdateServerManager<
|
|
108
|
-
T extends Constructor<any>
|
|
109
|
-
> extends AutoUpdateManager<T> {
|
|
110
|
-
public readonly model: ReturnModelType<T, BeAnObject>;
|
|
111
|
-
private readonly clientSockets: Set<Socket> = new Set<Socket>();
|
|
112
|
-
public readonly options?: AUSOption<T>;
|
|
113
|
-
constructor(
|
|
114
|
-
classParam: T,
|
|
115
|
-
loggers: LoggersType,
|
|
116
|
-
socket: Server,
|
|
117
|
-
model: ReturnModelType<T, BeAnObject>,
|
|
118
|
-
classers: Record<string, AutoUpdateManager<any>>,
|
|
119
|
-
emitter: EventTarget,
|
|
120
|
-
options?: AUSOption<T>
|
|
121
|
-
) {
|
|
122
|
-
super(classParam, socket, loggers, classers, emitter);
|
|
123
|
-
this.model = model;
|
|
124
|
-
this.options = options;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
public async loadDB() {
|
|
128
|
-
const docs = await this.model.find({});
|
|
129
|
-
for (const doc of docs) {
|
|
130
|
-
this.classes[(doc as any)._id] =
|
|
131
|
-
this.classes[(doc as any)._id] ??
|
|
132
|
-
(await this.handleGetMissingObject((doc as any)._id.toString()));
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
public registerSocket(socket: Socket) {
|
|
137
|
-
this.clientSockets.add(socket);
|
|
138
|
-
|
|
139
|
-
socket.on(
|
|
140
|
-
"startup" + this.className,
|
|
141
|
-
async (ack: (ids: string[]) => void) => {
|
|
142
|
-
const ids: string[] = [];
|
|
143
|
-
ack(this.objectIDs);
|
|
144
|
-
}
|
|
145
|
-
);
|
|
146
|
-
socket.on("delete" + this.className, async (id: string) => {
|
|
147
|
-
this.classes[id].destroy();
|
|
148
|
-
this.classesAsArray.splice(
|
|
149
|
-
this.classesAsArray.indexOf(this.classes[id]),
|
|
150
|
-
1
|
|
151
|
-
);
|
|
152
|
-
delete this.classes[id];
|
|
153
|
-
});
|
|
154
|
-
socket.on(
|
|
155
|
-
"new" + this.className,
|
|
156
|
-
async (
|
|
157
|
-
data: IsData<InstanceType<T>>,
|
|
158
|
-
ack: (res: ServerResponse<T>) => void
|
|
159
|
-
) => {
|
|
160
|
-
try {
|
|
161
|
-
const newDoc = await this.createObject(data);
|
|
162
|
-
ack({
|
|
163
|
-
data: newDoc.extractedData,
|
|
164
|
-
success: true,
|
|
165
|
-
message: "Created successfully",
|
|
166
|
-
});
|
|
167
|
-
} catch (error) {
|
|
168
|
-
this.loggers.error(error);
|
|
169
|
-
ack({ success: false, message: (error as any).message });
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
);
|
|
173
|
-
|
|
174
|
-
socket.onAny(
|
|
175
|
-
async (
|
|
176
|
-
event: string,
|
|
177
|
-
data: ServerUpdateRequest<T>,
|
|
178
|
-
ack: (res: ServerResponse<T>) => void
|
|
179
|
-
) => {
|
|
180
|
-
if (
|
|
181
|
-
event.startsWith("update" + this.className) &&
|
|
182
|
-
event.replace("update" + this.className, "").length === 24
|
|
183
|
-
) {
|
|
184
|
-
try {
|
|
185
|
-
const id = event.replace("update" + this.className, "");
|
|
186
|
-
let obj = this.classes[id];
|
|
187
|
-
if (typeof obj === "string")
|
|
188
|
-
this.classes[id] = obj = await this.handleGetMissingObject(obj);
|
|
189
|
-
if (typeof obj === "string") throw new Error(`Never...`);
|
|
190
|
-
obj.setValue(data.key as any, data.value);
|
|
191
|
-
ack({
|
|
192
|
-
data: obj.extractedData,
|
|
193
|
-
success: true,
|
|
194
|
-
message: "Updated successfully",
|
|
195
|
-
});
|
|
196
|
-
} catch (error) {
|
|
197
|
-
ack({ success: false, message: (error as any).message });
|
|
198
|
-
}
|
|
199
|
-
} else if (
|
|
200
|
-
event.startsWith("get" + this.className) &&
|
|
201
|
-
event.replace("get" + this.className, "").length === 24
|
|
202
|
-
) {
|
|
203
|
-
try {
|
|
204
|
-
const id = event.replace("get" + this.className, "");
|
|
205
|
-
let obj = this.classes[id];
|
|
206
|
-
ack({
|
|
207
|
-
data: obj.extractedData,
|
|
208
|
-
success: true,
|
|
209
|
-
message: "Updated successfully",
|
|
210
|
-
});
|
|
211
|
-
} catch (error) {
|
|
212
|
-
ack({ success: false, message: (error as any).message });
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
);
|
|
217
|
-
socket.on("disconnect", () => {
|
|
218
|
-
this.clientSockets.delete(socket);
|
|
219
|
-
});
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
protected async handleGetMissingObject(_id: string) {
|
|
223
|
-
const document = await this.model.findById(_id);
|
|
224
|
-
if (!document) throw new Error(`No document with id ${_id} in DB.`);
|
|
225
|
-
if (!this.classers) throw new Error(`No classers.`);
|
|
226
|
-
return await createAutoUpdatedClass(
|
|
227
|
-
this.classParam,
|
|
228
|
-
this.socket,
|
|
229
|
-
document,
|
|
230
|
-
this.loggers,
|
|
231
|
-
this,
|
|
232
|
-
this.emitter
|
|
233
|
-
);
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
public async createObject(data: Omit<IsData<InstanceType<T>>, "_id">) {
|
|
237
|
-
if (!this.classers) throw new Error(`No classers.`);
|
|
238
|
-
(data as any)._id = undefined;
|
|
239
|
-
const entry = await this.model.create(data);
|
|
240
|
-
const object = await createAutoUpdatedClass(
|
|
241
|
-
this.classParam,
|
|
242
|
-
this.socket,
|
|
243
|
-
entry,
|
|
244
|
-
this.loggers,
|
|
245
|
-
this,
|
|
246
|
-
this.emitter
|
|
247
|
-
);
|
|
248
|
-
object.checkAutoStatusChange();
|
|
249
|
-
this.classes[object._id] = object;
|
|
250
|
-
this.classesAsArray.push(object);
|
|
251
|
-
return object;
|
|
252
|
-
}
|
|
253
|
-
}
|