@prestizni-software/client-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.
@@ -0,0 +1,12 @@
1
+ import { Socket } from "socket.io-client";
2
+ import { AutoUpdateManager } from "./AutoUpdateManagerClass.js";
3
+ import { Constructor, IsData, LoggersType } from "./CommonTypes.js";
4
+ export type WrappedInstances<T extends Record<string, Constructor<any>>> = {
5
+ [K in keyof T]: AutoUpdateClientManager<T[K]>;
6
+ };
7
+ export declare function AUCManagerFactory<T extends Record<string, Constructor<any>>>(defs: T, loggers: LoggersType, socket: Socket): Promise<WrappedInstances<T>>;
8
+ export declare class AutoUpdateClientManager<T extends Constructor<any>> extends AutoUpdateManager<T> {
9
+ constructor(classParam: T, loggers: LoggersType, socket: Socket, classers: Record<string, AutoUpdateManager<any>>, emitter: EventTarget);
10
+ protected handleGetMissingObject(_id: string): Promise<import("./AutoUpdatedClientObjectClass.js").AutoUpdated<T>>;
11
+ createObject(data: Omit<IsData<InstanceType<T>>, "_id">): Promise<import("./AutoUpdatedClientObjectClass.js").AutoUpdated<T>>;
12
+ }
@@ -0,0 +1,46 @@
1
+ import { AutoUpdateManager } from "./AutoUpdateManagerClass.js";
2
+ import { createAutoUpdatedClass } from "./AutoUpdatedClientObjectClass.js";
3
+ // ---------------------- Factory ----------------------
4
+ export async function AUCManagerFactory(defs, loggers, socket) {
5
+ const classers = {};
6
+ const emitter = new EventTarget();
7
+ for (const key in defs) {
8
+ const Model = defs[key];
9
+ const c = new AutoUpdateClientManager(Model, loggers, socket, classers, emitter);
10
+ classers[key] = c;
11
+ await c.isLoadedAsync();
12
+ }
13
+ return classers;
14
+ }
15
+ export class AutoUpdateClientManager extends AutoUpdateManager {
16
+ constructor(classParam, loggers, socket, classers, emitter) {
17
+ super(classParam, socket, loggers, classers, emitter);
18
+ socket.emit("startup" + classParam.name, async (data) => {
19
+ for (const id of data) {
20
+ this.classes[id] = await this.handleGetMissingObject(id);
21
+ this.classesAsArray.push(this.classes[id]);
22
+ }
23
+ emitter.dispatchEvent(new Event("ManagerLoaded" + this.classParam.name + this.className));
24
+ });
25
+ socket.on("new" + classParam.name, async (id) => {
26
+ this.classes[id] = await this.handleGetMissingObject(id);
27
+ this.classesAsArray.push(this.classes[id]);
28
+ });
29
+ socket.on("delete" + classParam.name, (id) => {
30
+ this.deleteObject(id);
31
+ });
32
+ }
33
+ async handleGetMissingObject(_id) {
34
+ if (!this.classers)
35
+ throw new Error(`No classers.`);
36
+ return await createAutoUpdatedClass(this.classParam, this.socket, _id, this.loggers, this, this.emitter);
37
+ }
38
+ async createObject(data) {
39
+ if (!this.classers)
40
+ throw new Error(`No classers.`);
41
+ const object = await createAutoUpdatedClass(this.classParam, this.socket, data, this.loggers, this, this.emitter);
42
+ this.classes[object._id] = object;
43
+ return object;
44
+ }
45
+ }
46
+ //# sourceMappingURL=AutoUpdateClientManagerClass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutoUpdateClientManagerClass.js","sourceRoot":"","sources":["../AutoUpdateClientManagerClass.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { AutoUpdated } from "./AutoUpdatedClientObjectClass.js";
2
+ import { Constructor, IsData, LoggersType, SocketType } from "./CommonTypes.js";
3
+ import "reflect-metadata";
4
+ export declare abstract class AutoUpdateManager<T extends Constructor<any>> {
5
+ protected classes: {
6
+ [_id: string]: AutoUpdated<T>;
7
+ };
8
+ socket: SocketType;
9
+ protected classParam: T;
10
+ protected properties: (keyof T)[];
11
+ readonly classers: Record<string, AutoUpdateManager<any>>;
12
+ protected loggers: LoggersType;
13
+ protected classesAsArray: AutoUpdated<T>[];
14
+ protected emitter: EventTarget;
15
+ private isLoaded;
16
+ constructor(classParam: T, socket: SocketType, loggers: LoggersType, classers: Record<string, AutoUpdateManager<any>>, emitter: EventTarget);
17
+ getObject(_id: string): AutoUpdated<T> | null;
18
+ isLoadedAsync(): Promise<boolean>;
19
+ deleteObject(_id: string): Promise<void>;
20
+ get objectIDs(): string[];
21
+ get objects(): {
22
+ [_id: string]: AutoUpdated<T> | string;
23
+ };
24
+ get objectsAsArray(): AutoUpdated<T>[];
25
+ get className(): string;
26
+ protected abstract handleGetMissingObject(_id: string): Promise<AutoUpdated<T>>;
27
+ abstract createObject(data: IsData<InstanceType<T>>): Promise<AutoUpdated<T>>;
28
+ }
@@ -0,0 +1,56 @@
1
+ import "reflect-metadata";
2
+ export class AutoUpdateManager {
3
+ classes = {};
4
+ socket;
5
+ classParam;
6
+ properties;
7
+ classers;
8
+ loggers = {
9
+ info: () => { },
10
+ debug: () => { },
11
+ error: () => { },
12
+ warn: () => { },
13
+ };
14
+ classesAsArray = [];
15
+ emitter;
16
+ isLoaded = false;
17
+ constructor(classParam, socket, loggers, classers, emitter) {
18
+ this.emitter = emitter;
19
+ this.classers = classers;
20
+ this.socket = socket;
21
+ this.classParam = classParam;
22
+ this.properties = Reflect.getMetadata("props", Object.getPrototypeOf(classParam));
23
+ loggers.warn = loggers.warn ?? loggers.info;
24
+ this.loggers = loggers;
25
+ }
26
+ getObject(_id) {
27
+ return this.classes[_id];
28
+ }
29
+ async isLoadedAsync() {
30
+ if (this.isLoaded)
31
+ return this.isLoaded;
32
+ await new Promise((resolve) => this.emitter.addEventListener("ManagerLoaded" + this.classParam.name + this.className, resolve));
33
+ this.isLoaded = true;
34
+ return this.isLoaded;
35
+ }
36
+ async deleteObject(_id) {
37
+ if (typeof this.classes[_id] === "string")
38
+ this.classes[_id] = await this.handleGetMissingObject(this.classes[_id]);
39
+ (this.classes[_id]).destroy();
40
+ this.classesAsArray.splice(this.classesAsArray.indexOf(this.classes[_id]), 1);
41
+ delete this.classes[_id];
42
+ }
43
+ get objectIDs() {
44
+ return Object.keys(this.classes);
45
+ }
46
+ get objects() {
47
+ return this.classes;
48
+ }
49
+ get objectsAsArray() {
50
+ return this.classesAsArray;
51
+ }
52
+ get className() {
53
+ return this.classParam.name;
54
+ }
55
+ }
56
+ //# sourceMappingURL=AutoUpdateManagerClass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutoUpdateManagerClass.js","sourceRoot":"","sources":["../AutoUpdateManagerClass.ts"],"names":[],"mappings":"AAEA,OAAO,kBAAkB,CAAC;AAE1B,MAAM,OAAgB,iBAAiB;IAC3B,OAAO,GAAsC,EAAE,CAAC;IACnD,MAAM,CAAa;IAChB,UAAU,CAAI;IACd,UAAU,CAAc;IAClB,QAAQ,CAAyC;IACvD,OAAO,GAAgB;QAC/B,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;QACd,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;QACf,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;QACf,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;KACf,CAAC;IACQ,cAAc,GAAqB,EAAE,CAAC;IACtC,OAAO,CAAc;IACvB,QAAQ,GAAG,KAAK,CAAC;IACzB,YACE,UAAa,EACb,MAAkB,EAClB,OAAoB,EACpB,QAAgD,EAChD,OAAoB;QAEpB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,WAAW,CACnC,OAAO,EACP,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAClC,CAAC;QACF,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAGM,SAAS,CACd,GAAW;QAEX,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAEM,KAAK,CAAC,aAAa;QACxB,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAC;QACxC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,eAAe,GAAC,IAAI,CAAC,UAAU,CAAC,IAAI,GAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5H,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,GAAW;QACnC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ;YACvC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3E,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAC9B,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9E,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,IAAW,SAAS;QAClB,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;IAC9B,CAAC;CAQF"}
@@ -0,0 +1,47 @@
1
+ import "reflect-metadata";
2
+ import { Constructor, DeRef, InstanceOf, IsData, LoggersType, LoggersTypeInternal, Paths, PathValueOf, RefToId, SocketType } from "./CommonTypes.js";
3
+ import { AutoUpdateManager } from "./AutoUpdateManagerClass.js";
4
+ import { AutoUpdateClientManager } from "./AutoUpdateClientManagerClass.js";
5
+ export type AutoUpdated<T extends Constructor<any>> = AutoUpdatedClientObject<T> & DeRef<InstanceOf<T>>;
6
+ export declare function createAutoUpdatedClass<C extends Constructor<any>>(classParam: C, socket: SocketType, data: RefToId<IsData<InstanceType<C>>> | string, loggers: LoggersType, autoClassers: AutoUpdateClientManager<any>, emitter: EventTarget): Promise<AutoUpdated<C>>;
7
+ export declare abstract class AutoUpdatedClientObject<T extends Constructor<any>> {
8
+ protected readonly socket: SocketType;
9
+ protected data: IsData<T>;
10
+ protected readonly isServer: boolean;
11
+ protected readonly loggers: LoggersTypeInternal;
12
+ protected isLoading: boolean;
13
+ protected readonly emitter: EventTarget;
14
+ protected readonly properties: (keyof T)[];
15
+ protected readonly className: string;
16
+ protected autoClasser: AutoUpdateManager<any>;
17
+ protected isLoadingReferences: boolean;
18
+ readonly classProp: Constructor<T>;
19
+ private readonly EmitterID;
20
+ private readonly loadShit;
21
+ constructor(socket: SocketType, data: string | RefToId<IsData<T>>, loggers: LoggersType, properties: (keyof T)[], className: string, classProperty: Constructor<T>, autoClasser: AutoUpdateManager<any>, emitter: EventTarget);
22
+ protected handleNewObject(data: IsData<T>): void;
23
+ get extractedData(): {
24
+ [K in keyof InstanceType<T>]: InstanceOf<InstanceType<T>>[K];
25
+ };
26
+ isLoaded(): boolean;
27
+ isLoadedAsync(): Promise<boolean>;
28
+ private openSockets;
29
+ private handleUpdateRequest;
30
+ private generateSettersAndGetters;
31
+ protected findReference(id: string): AutoUpdated<any> | undefined;
32
+ setValue<K extends Paths<InstanceOf<T>>>(key: K, val: PathValueOf<T, K>): Promise<boolean>;
33
+ getValue(key: Paths<T>): any;
34
+ protected setValueInternal(key: string, value: any): Promise<boolean>;
35
+ protected makeUpdate(key: string, value: any): any;
36
+ protected checkAutoStatusChange(): Promise<void>;
37
+ protected resolveReference(id: string): AutoUpdatedClientObject<any> | null;
38
+ private loadForceReferences;
39
+ private handleLoadOnForced;
40
+ destroy(): Promise<void>;
41
+ protected wipeSelf(): void;
42
+ }
43
+ export declare function processIsRefProperties(instance: any, target: any, prefix?: string | null, allProps?: string[], newData?: any, loggers?: LoggersType): {
44
+ allProps: string[];
45
+ newData: any;
46
+ };
47
+ export declare function getMetadataRecursive(metaKey: string, proto: any, prop: string): any;
@@ -0,0 +1,384 @@
1
+ import "reflect-metadata";
2
+ import { ObjectId } from "bson";
3
+ export async function createAutoUpdatedClass(classParam, socket, data, loggers, autoClassers, emitter) {
4
+ if (typeof data !== "string")
5
+ processIsRefProperties(data, classParam.prototype, undefined, [], loggers);
6
+ const props = Reflect.getMetadata("props", classParam.prototype);
7
+ const instance = new (class extends AutoUpdatedClientObject {
8
+ })(socket, data, loggers, props, classParam.name, classParam, autoClassers, emitter);
9
+ await instance.isLoadedAsync();
10
+ return instance;
11
+ }
12
+ export class AutoUpdatedClientObject {
13
+ socket;
14
+ //protected updates: string[] = [];
15
+ data;
16
+ isServer = false;
17
+ loggers = {
18
+ info: () => { },
19
+ debug: () => { },
20
+ error: () => { },
21
+ warn: () => { },
22
+ };
23
+ isLoading = false;
24
+ emitter;
25
+ properties;
26
+ className;
27
+ autoClasser;
28
+ isLoadingReferences = false;
29
+ classProp;
30
+ EmitterID = new ObjectId().toHexString();
31
+ loadShit = async () => {
32
+ if (this.isLoaded()) {
33
+ try {
34
+ await this.loadForceReferences();
35
+ }
36
+ catch (error) {
37
+ this.loggers.error(error);
38
+ }
39
+ this.isLoadingReferences = false;
40
+ return;
41
+ }
42
+ this.emitter.addEventListener("loaded" + this.EmitterID, async () => {
43
+ try {
44
+ await this.loadForceReferences();
45
+ }
46
+ catch (error) {
47
+ this.loggers.error(error);
48
+ }
49
+ this.isLoadingReferences = false;
50
+ });
51
+ };
52
+ constructor(socket, data, loggers, properties, className, classProperty, autoClasser, emitter) {
53
+ this.emitter = emitter;
54
+ this.classProp = classProperty;
55
+ this.isLoadingReferences = true;
56
+ this.isLoading = true;
57
+ this.autoClasser = autoClasser;
58
+ this.className = className;
59
+ this.properties = properties;
60
+ this.loggers.debug = loggers.debug;
61
+ this.loggers.info = loggers.info;
62
+ this.loggers.error = loggers.error;
63
+ this.loggers.warn = loggers.warn ?? loggers.info;
64
+ this.socket = socket;
65
+ if (typeof data === "string") {
66
+ if (data === "")
67
+ throw new Error("Cannot create a new AutoUpdatedClientClass with an empty string for ID.");
68
+ this.socket.emit("get" + this.className + data, null, (res) => {
69
+ if (!res.success) {
70
+ this.isLoading = false;
71
+ this.loggers.error("Could not load data from server:", res.message);
72
+ this.emitter.dispatchEvent(new Event("loaded" + this.EmitterID));
73
+ return;
74
+ }
75
+ checkForMissingRefs(res.data, properties, classProperty, autoClasser);
76
+ this.data = res.data;
77
+ this.isLoading = false;
78
+ this.emitter.dispatchEvent(new Event("loaded" + this.EmitterID));
79
+ });
80
+ this.data = { _id: data };
81
+ }
82
+ else {
83
+ this.isLoading = true;
84
+ checkForMissingRefs(data, properties, classProperty, autoClasser);
85
+ this.data = data;
86
+ if (this.data._id === "")
87
+ this.handleNewObject(data);
88
+ else {
89
+ this.isLoading = false;
90
+ }
91
+ ;
92
+ }
93
+ if (!this.isServer)
94
+ this.openSockets();
95
+ this.generateSettersAndGetters();
96
+ }
97
+ handleNewObject(data) {
98
+ this.isLoading = true;
99
+ if (!this.className)
100
+ throw new Error("Cannot create a new AutoUpdatedClientClass without a class name.");
101
+ this.socket.emit("new" + this.className, data, (res) => {
102
+ if (!res.success) {
103
+ this.isLoading = false;
104
+ this.loggers.error("Could not create data on server:", res.message);
105
+ this.emitter.dispatchEvent(new Event("loaded" + this.EmitterID));
106
+ return;
107
+ }
108
+ checkForMissingRefs(res.data, this.properties, this.classProp, this.autoClasser);
109
+ this.data = res.data;
110
+ this.isLoading = false;
111
+ this.emitter.dispatchEvent(new Event("loaded" + this.EmitterID));
112
+ });
113
+ }
114
+ get extractedData() {
115
+ const extracted = Object.fromEntries(Object.entries(processIsRefProperties(this.data, this.classProp.prototype).newData).filter(([k, v]) => typeof v !== "function"));
116
+ return structuredClone(extracted);
117
+ }
118
+ isLoaded() {
119
+ return !this.isLoading;
120
+ }
121
+ async isLoadedAsync() {
122
+ await this.loadShit();
123
+ return this.isLoading
124
+ ? new Promise((resolve) => {
125
+ this.emitter.addEventListener("loaded" + this.EmitterID, () => {
126
+ resolve(this.isLoading === false);
127
+ });
128
+ })
129
+ : true;
130
+ }
131
+ openSockets() {
132
+ this.loggers.debug(`[${this.data._id}] Opening socket listeners`);
133
+ this.socket.on("update" + this.className + this.data._id, async (update) => {
134
+ await this.handleUpdateRequest(update);
135
+ });
136
+ }
137
+ // Example server-side handler
138
+ async handleUpdateRequest(update) {
139
+ try {
140
+ const path = update.key.split(".");
141
+ let dataRef = this.data;
142
+ for (let i = 0; i < path.length - 1; i++) {
143
+ if (!dataRef[path[i]])
144
+ dataRef[path[i]] = {};
145
+ dataRef = dataRef[path[i]];
146
+ }
147
+ dataRef[path.at(-1)] = update.value;
148
+ this.loggers.debug(`[${this.data._id}] Applied patch ${update.key} set to ${update.value}`);
149
+ // Return success with the applied patch
150
+ return { success: true, data: undefined, message: "" };
151
+ }
152
+ catch (error) {
153
+ this.loggers.error(`[${this.data._id}] Error applying patch:`, error);
154
+ return {
155
+ success: false,
156
+ message: "Error applying update: " + error.message,
157
+ };
158
+ }
159
+ }
160
+ generateSettersAndGetters() {
161
+ for (const key of this.properties) {
162
+ if (typeof key !== "string")
163
+ return;
164
+ const k = key;
165
+ const isRef = getMetadataRecursive("isRef", this.classProp.prototype, key);
166
+ Object.defineProperty(this, key, {
167
+ get: () => {
168
+ if (isRef)
169
+ return typeof this.data[k] === "string"
170
+ ? this.findReference(this.data[k])
171
+ : this.data[k];
172
+ else
173
+ return this.data[k];
174
+ },
175
+ set: () => {
176
+ throw new Error(`Cannot set ${key} this way, use "setValue" function.`);
177
+ },
178
+ enumerable: true,
179
+ configurable: true,
180
+ });
181
+ }
182
+ }
183
+ findReference(id) {
184
+ for (const classer of Object.values(this.autoClasser.classers)) {
185
+ const result = classer.getObject(id);
186
+ if (result)
187
+ return result;
188
+ }
189
+ }
190
+ async setValue(key, val) {
191
+ let value = val;
192
+ this.loggers.debug(`[${this.data._id}] Setting ${key} to ${value}`);
193
+ try {
194
+ if (value instanceof AutoUpdatedClientObject)
195
+ value = value.extractedData._id;
196
+ const path = key.split(".");
197
+ let obj = this.data;
198
+ let lastClass = this;
199
+ let lastPath = key;
200
+ for (let i = 0; i < path.length - 1; i++) {
201
+ if (typeof obj[path[i]] !== "object" ||
202
+ obj[path[i]] instanceof ObjectId) {
203
+ let temp = this.resolveReference(obj[path[i]].toString());
204
+ if (!temp) {
205
+ return false;
206
+ }
207
+ lastClass = temp;
208
+ lastPath = path.slice(i + 1).join(".");
209
+ return await lastClass.setValue(lastPath, value);
210
+ }
211
+ else
212
+ obj = obj[path[i]];
213
+ }
214
+ if (lastClass !== this || lastPath !== key)
215
+ throw new Error("???");
216
+ const success = await this.setValueInternal(lastPath, value);
217
+ if (!success) {
218
+ return false;
219
+ }
220
+ const pathArr = lastPath.split(".");
221
+ if (pathArr.length === 1) {
222
+ this.data[key] = value;
223
+ await this.checkAutoStatusChange();
224
+ return true;
225
+ }
226
+ const pathMinusLast = pathArr.splice(0, 1);
227
+ let ref = this;
228
+ for (const p of pathMinusLast) {
229
+ ref = ref[p];
230
+ }
231
+ ref[pathArr.at(-1)] = value;
232
+ await this.checkAutoStatusChange();
233
+ return true;
234
+ }
235
+ catch (error) {
236
+ this.loggers.error(error);
237
+ return false;
238
+ }
239
+ }
240
+ getValue(key) {
241
+ let value;
242
+ for (const part of key.split(".")) {
243
+ if (value)
244
+ value = value[part];
245
+ else
246
+ value = this.data[part];
247
+ }
248
+ return value;
249
+ }
250
+ async setValueInternal(key, value) {
251
+ const update = this.makeUpdate(key, value);
252
+ const promise = new Promise((resolve) => {
253
+ try {
254
+ this.socket.emit("update" + this.className + this.data._id, update, (res) => {
255
+ resolve(res.success);
256
+ });
257
+ }
258
+ catch (error) {
259
+ this.loggers.error("Error sending update:", error);
260
+ resolve(false);
261
+ }
262
+ });
263
+ return promise;
264
+ }
265
+ makeUpdate(key, value) {
266
+ const id = this.data._id.toString();
267
+ return { _id: id, key, value };
268
+ }
269
+ async checkAutoStatusChange() {
270
+ return;
271
+ }
272
+ // return a properly typed AutoUpdatedClientClass (or null)
273
+ // inside AutoUpdatedClientClass
274
+ resolveReference(id) {
275
+ if (!this.autoClasser)
276
+ throw new Error("No autoClasser");
277
+ for (const autoClasser of Object.values(this.autoClasser.classers)) {
278
+ const data = autoClasser.getObject(id);
279
+ if (data)
280
+ return data;
281
+ }
282
+ return null;
283
+ }
284
+ async loadForceReferences(obj = this.data, proto = this.classProp.prototype) {
285
+ const props = Reflect.getMetadata("props", proto) || [];
286
+ for (const key of props) {
287
+ const isRef = Reflect.getMetadata("isRef", proto, key);
288
+ if (isRef) {
289
+ await this.handleLoadOnForced(obj, key);
290
+ }
291
+ // If the property itself is a nested object, check deeper
292
+ if (obj[key] && typeof obj[key] === "object") {
293
+ const nestedProto = Object.getPrototypeOf(obj[key]);
294
+ if (nestedProto) {
295
+ await this.loadForceReferences(obj[key], nestedProto);
296
+ }
297
+ }
298
+ }
299
+ }
300
+ async handleLoadOnForced(obj, key) {
301
+ if (!this.autoClasser)
302
+ throw new Error("No autoClassers");
303
+ const refId = obj[key];
304
+ if (refId) {
305
+ for (const classer of Object.values(this.autoClasser.classers)) {
306
+ const result = classer.getObject(refId);
307
+ if (result) {
308
+ obj[key] = result;
309
+ // Recursively load refs inside the resolved object
310
+ if (typeof result.loadForceReferences === "function") {
311
+ await result.loadForceReferences();
312
+ }
313
+ break;
314
+ }
315
+ }
316
+ }
317
+ }
318
+ async destroy() {
319
+ this.socket.emit("delete" + this.className, this.data._id);
320
+ this.wipeSelf();
321
+ }
322
+ wipeSelf() {
323
+ for (const key of Object.keys(this.data)) {
324
+ delete this.data[key];
325
+ }
326
+ this.loggers.info(`[${this.data._id}] ${this.className} object wiped`);
327
+ }
328
+ }
329
+ export function processIsRefProperties(instance, target, prefix = null, allProps = [], newData = {}, loggers) {
330
+ const props = Reflect.getMetadata("props", target) || [];
331
+ for (const prop of props) {
332
+ const path = prefix ? `${prefix}.${prop}` : prop;
333
+ allProps.push(path);
334
+ newData[prop] = instance[prop];
335
+ if (Reflect.getMetadata("isRef", target, prop)) {
336
+ (loggers ?? console).debug("Changing isRef:", path);
337
+ newData[prop] =
338
+ typeof instance[prop] === "string"
339
+ ? instance[prop]
340
+ : instance[prop]?._id;
341
+ }
342
+ const type = Reflect.getMetadata("design:type", target, prop);
343
+ if (type?.prototype) {
344
+ const nestedProps = Reflect.getMetadata("props", type.prototype);
345
+ if (nestedProps && instance[prop]) {
346
+ newData[prop] = processIsRefProperties(instance[prop], type.prototype, path, allProps, undefined, loggers).newData;
347
+ }
348
+ }
349
+ }
350
+ return { allProps, newData };
351
+ }
352
+ export function getMetadataRecursive(metaKey, proto, prop) {
353
+ while (proto) {
354
+ const meta = Reflect.getMetadata(metaKey, proto, prop);
355
+ if (meta !== undefined)
356
+ return meta;
357
+ proto = Object.getPrototypeOf(proto);
358
+ }
359
+ return undefined;
360
+ }
361
+ function checkForMissingRefs(data, props, classParam, autoClassers) {
362
+ if (typeof data !== "string") {
363
+ const entryKeys = Object.keys(data);
364
+ for (const prop of props) {
365
+ if (!entryKeys.includes(prop.toString()) &&
366
+ getMetadataRecursive("isRef", classParam.prototype, prop.toString())) {
367
+ findMissingObjectReference(data, prop, autoClassers.classers);
368
+ }
369
+ }
370
+ }
371
+ }
372
+ function findMissingObjectReference(data, prop, autoClassers) {
373
+ for (const ac of Object.values(autoClassers)) {
374
+ for (const obj of ac.objectsAsArray) {
375
+ const found = Object.values(obj.extractedData).find((value) => Array.isArray(value) ? value.includes(data._id) : value === data._id);
376
+ if (found) {
377
+ data[prop] = obj._id;
378
+ return;
379
+ }
380
+ }
381
+ }
382
+ console.log("a");
383
+ }
384
+ //# sourceMappingURL=AutoUpdatedClientObjectClass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutoUpdatedClientObjectClass.js","sourceRoot":"","sources":["../AutoUpdatedClientObjectClass.ts"],"names":[],"mappings":"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"}