@siemsiem/tonpleun 1.1.3 → 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.
Files changed (68) hide show
  1. package/dist/clientLib.d.ts +36 -13
  2. package/dist/clientLib.js +239 -157
  3. package/dist/clientLib.js.map +1 -1
  4. package/dist/helpers.js +10 -5
  5. package/dist/helpers.js.map +1 -1
  6. package/dist/server.js +143 -80
  7. package/dist/server.js.map +1 -1
  8. package/dist/types.d.ts +86 -8
  9. package/dist/types.js +64 -4
  10. package/dist/types.js.map +1 -1
  11. package/package.json +15 -10
  12. package/readme.md +22 -16
  13. package/src/clientLib.ts +256 -147
  14. package/src/server.ts +116 -38
  15. package/src/types.ts +84 -10
  16. package/dist/GEN.d.ts +0 -1
  17. package/dist/GEN.js +0 -9
  18. package/dist/GEN.js.map +0 -1
  19. package/dist/client.d.ts +0 -1
  20. package/dist/client.js +0 -49
  21. package/dist/client.js.map +0 -1
  22. package/dist/client2.d.ts +0 -1
  23. package/dist/client2.js +0 -26
  24. package/dist/client2.js.map +0 -1
  25. package/dist/test3.d.ts +0 -1
  26. package/dist/test3.js +0 -16
  27. package/dist/test3.js.map +0 -1
  28. package/dist/tests/clients/basic/clientA.d.ts +0 -1
  29. package/dist/tests/clients/basic/clientA.js +0 -17
  30. package/dist/tests/clients/basic/clientA.js.map +0 -1
  31. package/dist/tests/clients/basic/clientB.d.ts +0 -1
  32. package/dist/tests/clients/basic/clientB.js +0 -20
  33. package/dist/tests/clients/basic/clientB.js.map +0 -1
  34. package/dist/tests/clients/privleges/clientA.d.ts +0 -1
  35. package/dist/tests/clients/privleges/clientA.js +0 -17
  36. package/dist/tests/clients/privleges/clientA.js.map +0 -1
  37. package/dist/tests/clients/privleges/clientB.d.ts +0 -1
  38. package/dist/tests/clients/privleges/clientB.js +0 -20
  39. package/dist/tests/clients/privleges/clientB.js.map +0 -1
  40. package/dist/tests/server/basic.d.ts +0 -1
  41. package/dist/tests/server/basic.js +0 -3
  42. package/dist/tests/server/basic.js.map +0 -1
  43. package/dist/tests/server/privleges.d.ts +0 -1
  44. package/dist/tests/server/privleges.js +0 -22
  45. package/dist/tests/server/privleges.js.map +0 -1
  46. package/dist/tests/testMaster.d.ts +0 -1
  47. package/dist/tests/testMaster.js +0 -54
  48. package/dist/tests/testMaster.js.map +0 -1
  49. package/dist/v1/client.d.ts +0 -1
  50. package/dist/v1/client.js +0 -17
  51. package/dist/v1/client.js.map +0 -1
  52. package/dist/v1/lib.d.ts +0 -28
  53. package/dist/v1/lib.js +0 -191
  54. package/dist/v1/lib.js.map +0 -1
  55. package/dist/v1/main.d.ts +0 -1
  56. package/dist/v1/main.js +0 -195
  57. package/dist/v1/main.js.map +0 -1
  58. package/dist/v1/test2.d.ts +0 -1
  59. package/dist/v1/test2.js +0 -13
  60. package/dist/v1/test2.js.map +0 -1
  61. package/src/GEN.ts +0 -11
  62. package/src/tests/clients/basic/clientA.ts +0 -18
  63. package/src/tests/clients/basic/clientB.ts +0 -20
  64. package/src/tests/clients/privleges/clientA.ts +0 -18
  65. package/src/tests/clients/privleges/clientB.ts +0 -20
  66. package/src/tests/server/basic.ts +0 -3
  67. package/src/tests/server/privleges.ts +0 -20
  68. package/src/tests/testMaster.ts +0 -57
package/readme.md CHANGED
@@ -1,28 +1,34 @@
1
- # tonpleun
1
+ # Tonpleun: Server-to-Server Communication via WebSockets
2
2
 
3
- uhhh dit zijn zeer goede docs (nee)
4
- tonpleun is een websocket server die websocket clients verzoeken laat maken aan andere websocket clients die zich als service registreren.
5
- voor nu is tonpleun in js maar wrs moet ik het porten naar python omdat ik dan meer code kan hergebruiken voor andere projecten.
3
+ ## What Is Tonpleun?
6
4
 
7
- ## Installatie
5
+ Tonpleun is a communication layer that lets servers call functions on other servers and perform basic WebSocket communication with other servers or local clients.
8
6
 
9
- gebruik dit gewoon niet...
7
+ It is designed to make building a network of communicating servers easier, without having to manage all low-level communication details yourself.
10
8
 
11
- maar als je het toch wilt gebruiken download de repo compile het met tsc en run main.js met node.
9
+ ## Features
12
10
 
13
- ## Gebruik
11
+ - Call functions on other servers
12
+ - Send messages to other servers (message handling logic is up to your app)
13
+ - Register config values that other clients can update
14
+ - Basic client privilege levels
15
+ - Simple API for registering and calling services
16
+ - Optional schema-based validation for service input/output (for example with Zod)
14
17
 
15
- gebruik het niet
16
- maar als je onverstandig genoeg bent om het toch te gebruiken gebruik lib.ts om een client te maken die verbinding maakt met de tonpleun server.
18
+ ## Installation
17
19
 
18
- ## Configuratie
20
+ ```bash
21
+ npm install tonpleun
22
+ ```
19
23
 
20
- tonpleun heeft geen configuratie opties.
24
+ ## Usage
21
25
 
22
- ## Licentie
26
+ See [run-server.ts](./run-server.ts) and [test-client.ts](./test-client.ts) for example usage.
23
27
 
24
- heel eerlijk het boeit me niet wat je doet met deze slechte code dus doe er mee wat je wilt.
28
+ ## AI-Generated Code
25
29
 
26
- ## Bijdragen
30
+ Some small parts of this codebase were made with AI assistance.
27
31
 
28
- uhhhhh maak een pr ofzo.
32
+ The major AI-assisted parts are the schema validation and the WebUI (idfk how to make a build script). This README was also improved with Copilot help for readability.
33
+
34
+ English is not my first language, and I have dyslexia, so this workflow helps me write clearer documentation faster.
package/src/clientLib.ts CHANGED
@@ -1,178 +1,287 @@
1
1
  import WebSocket from 'ws';
2
2
  import { randomUUID } from 'crypto';
3
- import { requestType, stringPacketOptions, type getServicePacketClient, type GetServiceResponsePacketToServer, type GetServiceResponsePacketToClient, type InitPacket, type packet, type StringPacket, type registerConfigPacket, type setConfigPacket, type fakeTypeType, type namedFakeType, InitResponsePacket } from './types.js';
3
+ import {
4
+ requestType,
5
+ stringPacketOptions,
6
+ type getServicePacketClient,
7
+ type GetServiceResponsePacketToServer,
8
+ type GetServiceResponsePacketToClient,
9
+ type InitPacket,
10
+ type packet,
11
+ type StringPacket,
12
+ type registerConfigPacket,
13
+ type setConfigPacket,
14
+ InitResponsePacket,
15
+ getServicePacketClientSchema,
16
+ getServiceResponsePacketToClientSchema,
17
+ initResponsePacketSchema,
18
+ packetSchema,
19
+ setConfigPacketSchema,
20
+ stringPacketSchema
21
+ } from './types.js';
4
22
  import { WsSend } from './helpers.js';
5
23
  import { assert } from 'console';
6
24
  import { writeFileSync, mkdirSync } from 'fs';
7
25
  import { dirname } from 'path';
8
26
 
9
- const url = "ws://localhost:8765";
10
- export let ws: WebSocket;
11
- const serviceCallbacks = new Map<string, (...args: any[]) => any>();
12
- let clinetIDStore = "error";
13
- const localConfigs = new Map<string, registerConfigPacket>();
14
- let key: any = undefined;
27
+ type ValidationSuccess = {
28
+ success: true;
29
+ data: unknown;
30
+ };
15
31
 
16
- const VERSION = {
17
- MAJOR: 1,
18
- MINOR: 1,
19
- PATCH: 3
20
- }
21
- export async function genHelper() {
22
- console.info('genHelper called');
23
- const result = await getService('genHelper', 'tonpleun', []);
32
+ type ValidationFailure = {
33
+ success: false;
34
+ error?: {
35
+ issues?: unknown;
36
+ } | unknown;
37
+ };
24
38
 
25
- const outPath = dirname('./src/GEN.ts');
26
- mkdirSync(outPath, { recursive: true });
27
- writeFileSync('./src/GEN.ts', result);
28
- console.info('GEN.ts gegenereerd in ./src/GEN.ts');
29
- return result;
30
- }
39
+ export type ServiceInputValidator = {
40
+ safeParse: (data: unknown) => ValidationSuccess | ValidationFailure;
41
+ };
31
42
 
32
- export async function awaitServiceMessage(expectedFor: stringPacketOptions): Promise<StringPacket> {
33
- return new Promise<StringPacket>((resolve) => {
34
- const handler = (raw: Buffer) => {
35
- const rawPacket = JSON.parse(raw.toString()) as packet;
36
- if (rawPacket.type === requestType.Success) {
37
- const data = rawPacket.data as StringPacket;
38
- if (data.for === expectedFor) {
39
- ws.removeListener('message', handler);
40
- resolve(data);
41
- }
42
- }
43
- };
44
- ws.on('message', handler);
45
- });
46
- }
47
- export async function registerConfigItem(name: string, description: string, value: string, idthing: string) {
43
+ export default class Tonpleun {
44
+ private url = "ws://localhost:8765";
45
+ public ws: WebSocket;
46
+ private serviceCallbacks = new Map<string, (...args: any[]) => any>();
47
+ private serviceInputSchemas = new Map<string, ServiceInputValidator>();
48
+ private clinetIDStore = "error";
49
+ private localConfigs = new Map<string, registerConfigPacket>();
50
+ private key: any = undefined;
51
+ public initialized: Promise<StringPacket>;
48
52
 
49
- WsSend(ws, { type: requestType.RegisterConifg, data: { name: name, description: description, defaultValue: value, type: typeof value, id: idthing } as registerConfigPacket, key })
50
- // Wacht tot de verbinding is geopend
51
- return new Promise<void>((resolve) => {
52
- awaitServiceMessage(stringPacketOptions.registerConfigSuccess).then(() => {
53
- localConfigs.set(idthing, { name, id: idthing, description, type: typeof value as fakeTypeType, defaultValue: value } as registerConfigPacket)
54
- resolve();
55
- });
56
- });
57
- }
58
- export async function SetConfigItem(idthing: string, newValue: string, clientId?: string) {
59
- WsSend(ws, { type: requestType.SetConfig, data: { ClientId: clientId || clinetIDStore, id: idthing, newValue: newValue } as setConfigPacket, key })
60
- return new Promise<void>((resolve) => {
61
- awaitServiceMessage(stringPacketOptions.setConfigSuccess).then(() => {
62
- const existing = localConfigs.get(idthing);
63
- if (existing) {
64
- localConfigs.set(idthing, { ...existing, value: newValue } as registerConfigPacket);
65
- }
66
- resolve();
67
- });
68
- });
69
- }
53
+ private VERSION = {
54
+ MAJOR: 2,
55
+ MINOR: 0,
56
+ PATCH: 0
57
+ }
70
58
 
71
- export async function registerService(ServiceId: string, args: namedFakeType[], callback: (...args: any[]) => any) {
72
- WsSend(ws, { type: requestType.RegisterService, data: { ServiceId, args }, key });
73
- serviceCallbacks.set(ServiceId, callback);
74
- return new Promise<void>((resolve) => {
75
- awaitServiceMessage(stringPacketOptions.registerServiceSuccess).then(() => {
76
- resolve();
77
- });
59
+ public async awaitServiceMessage(expectedFor: stringPacketOptions): Promise<StringPacket> {
60
+ return new Promise<StringPacket>((resolve) => {
61
+ const handler = (raw: Buffer) => {
62
+ let parsedRaw: unknown;
63
+ try {
64
+ parsedRaw = JSON.parse(raw.toString());
65
+ } catch {
66
+ return;
67
+ }
68
+ const packetResult = packetSchema.safeParse(parsedRaw);
69
+ if (!packetResult.success) {
70
+ return;
71
+ }
72
+ const rawPacket = packetResult.data as packet;
73
+ if (rawPacket.type === requestType.Success) {
74
+ const stringResult = stringPacketSchema.safeParse(rawPacket.data);
75
+ if (!stringResult.success) {
76
+ return;
77
+ }
78
+ const data = stringResult.data as StringPacket;
79
+ if (data.for === expectedFor) {
80
+ this.ws.removeListener('message', handler);
81
+ resolve(data);
82
+ }
83
+ }
84
+ };
85
+ this.ws.on('message', handler);
78
86
  });
79
- }
80
- export async function getService(ServiceId: string, ClientId: string, inputs: any[]): Promise<any> {
87
+ }
88
+ public async registerConfigItem(name: string, description: string, value: string, idthing: string) {
89
+ await this.initialized;
90
+ const waitForAck = this.awaitServiceMessage(stringPacketOptions.registerConfigSuccess);
91
+ WsSend(this.ws, { type: requestType.RegisterConifg, data: { name: name, description: description, defaultValue: value, type: typeof value, id: idthing } as registerConfigPacket, key: this.key })
92
+ await waitForAck;
93
+ this.localConfigs.set(idthing, { name, id: idthing, description, type: typeof value as registerConfigPacket['type'], defaultValue: value } as registerConfigPacket)
94
+ }
95
+ public async SetConfigItem(idthing: string, newValue: string, clientId?: string) {
96
+ await this.initialized;
97
+ const waitForAck = this.awaitServiceMessage(stringPacketOptions.setConfigSuccess);
98
+ WsSend(this.ws, { type: requestType.SetConfig, data: { ClientId: clientId || this.clinetIDStore, id: idthing, newValue: newValue } as setConfigPacket, key: this.key })
99
+ await waitForAck;
100
+ const existing = this.localConfigs.get(idthing);
101
+ if (existing) {
102
+ this.localConfigs.set(idthing, { ...existing, value: newValue } as registerConfigPacket);
103
+ }
104
+ }
105
+ public async registerService(ServiceId: string, callback: (...args: any[]) => any, inputSchema?: ServiceInputValidator) {
106
+ await this.initialized;
107
+ const waitForAck = this.awaitServiceMessage(stringPacketOptions.registerServiceSuccess);
108
+ this.serviceCallbacks.set(ServiceId, callback);
109
+ if (inputSchema) {
110
+ this.serviceInputSchemas.set(ServiceId, inputSchema);
111
+ }
112
+ WsSend(this.ws, { type: requestType.RegisterService, data: { ServiceId }, key: this.key });
113
+ await waitForAck;
114
+ }
115
+ public async getService(ServiceId: string, ClientId: string, inputs: any[]): Promise<any> {
116
+ await this.initialized;
81
117
  const connectionId = randomUUID();
82
- WsSend(ws, { type: requestType.GetService, data: { ClientId, ServiceId, args: inputs, connectionId } as getServicePacketClient, key });
83
- return new Promise<any>((resolve) => {
84
- const handler = (raw: Buffer) => {
85
- const rawPacket = JSON.parse(raw.toString()) as packet;
86
- if (rawPacket.type === requestType.GetServiceResponse) {
87
- const data = rawPacket.data as GetServiceResponsePacketToClient;
88
- if (data.serviceId === ServiceId && data.connectionId === connectionId) {
89
- ws.removeListener('message', handler);
90
- resolve(data.result);
91
- }
92
- }
93
- };
94
- ws.on('message', handler);
118
+ const responsePromise = new Promise<any>((resolve) => {
119
+ const handler = (raw: Buffer) => {
120
+ let parsedRaw: unknown;
121
+ try {
122
+ parsedRaw = JSON.parse(raw.toString());
123
+ } catch {
124
+ return;
125
+ }
126
+ const packetResult = packetSchema.safeParse(parsedRaw);
127
+ if (!packetResult.success) {
128
+ return;
129
+ }
130
+ const rawPacket = packetResult.data as packet;
131
+ if (rawPacket.type === requestType.GetServiceResponse) {
132
+ const responseResult = getServiceResponsePacketToClientSchema.safeParse(rawPacket.data);
133
+ if (!responseResult.success) {
134
+ return;
135
+ }
136
+ const data = responseResult.data as GetServiceResponsePacketToClient;
137
+ if (data.serviceId === ServiceId && data.connectionId === connectionId) {
138
+ this.ws.removeListener('message', handler);
139
+ resolve(data.result);
140
+ }
141
+ }
142
+ };
143
+ this.ws.on('message', handler);
95
144
  });
96
- }
97
-
98
- export async function initializeClient(ClientId: string, creds?: any) {
99
- clinetIDStore = ClientId;
100
- key = creds;
101
- ws = new WebSocket(url);
145
+ WsSend(this.ws, { type: requestType.GetService, data: { ClientId, ServiceId, args: inputs, connectionId } as getServicePacketClient, key: this.key });
146
+ return responsePromise;
147
+ }
148
+ constructor(ClientId: string, creds?: any) {
149
+ this.clinetIDStore = ClientId;
150
+ this.key = creds;
151
+ this.ws = new WebSocket(this.url);
102
152
 
103
- ws.on('open', () => {
104
- console.log('Verbonden met tonpleun server.');
105
- WsSend(ws, { type: requestType.Init, data: { ClientId } as InitPacket, key })
153
+ this.ws.on('open', () => {
154
+ console.log('Verbonden met tonpleun server.');
155
+ WsSend(this.ws, { type: requestType.Init, data: { ClientId } as InitPacket, key: this.key })
106
156
 
107
157
  });
108
- ws.on('close', () => {
109
- console.log('Verbinding met tonpleun server gesloten.');
158
+ this.ws.on('close', () => {
159
+ console.log('Verbinding met tonpleun server gesloten.');
110
160
  });
111
- ws.on('error', (error) => {
112
- console.error('Fout opgetreden:', error);
113
- ws.close();
161
+ this.ws.on('error', (error) => {
162
+ console.error('Fout opgetreden:', error);
163
+ this.ws.close();
114
164
  });
115
- ws.on('message', (data) => {
116
- const rawPacket = JSON.parse(data.toString()) as packet
117
- if (rawPacket.type === requestType.GetService) {
118
- const serviceData = rawPacket.data as getServicePacketClient;
119
- const callback = serviceCallbacks.get(serviceData.ServiceId);
120
- if (callback) {
121
- try {
122
- const result = callback(...serviceData.args);
123
- WsSend(ws, {
124
- type: requestType.GetServiceResponse, data: {
125
- result: result,
126
- ServiceId: serviceData.ServiceId,
127
- connectionId: serviceData.connectionId,
128
- } as GetServiceResponsePacketToServer,
129
- key
130
- });
131
- } catch (error) {
132
- console.error(`Fout bij uitvoeren van service ${serviceData.ServiceId}:`, error);
133
- }
165
+ this.ws.on('message', (data) => {
166
+ let parsedRaw: unknown;
167
+ try {
168
+ parsedRaw = JSON.parse(data.toString());
169
+ } catch {
170
+ return;
171
+ }
172
+ const packetResult = packetSchema.safeParse(parsedRaw);
173
+ if (!packetResult.success) {
174
+ return;
175
+ }
176
+ const rawPacket = packetResult.data as packet
177
+ if (rawPacket.type === requestType.GetService) {
178
+ const serviceDataResult = getServicePacketClientSchema.safeParse(rawPacket.data);
179
+ if (!serviceDataResult.success) {
180
+ return;
181
+ }
182
+ const serviceData = serviceDataResult.data as getServicePacketClient;
183
+ const callback = this.serviceCallbacks.get(serviceData.ServiceId);
184
+ if (callback) {
185
+ try {
186
+ const schema = this.serviceInputSchemas.get(serviceData.ServiceId);
187
+ let callbackArgs: any[] = serviceData.args;
188
+ if (schema) {
189
+ const schemaResult = schema.safeParse(serviceData.args);
190
+ if (!schemaResult.success) {
191
+ const validationError = schemaResult.error;
192
+ const issues = (typeof validationError === 'object' && validationError !== null && 'issues' in validationError)
193
+ ? (validationError as { issues?: unknown }).issues
194
+ : validationError;
195
+ WsSend(this.ws, {
196
+ type: requestType.GetServiceResponse, data: {
197
+ result: {
198
+ error: 'Invalid service input',
199
+ issues
200
+ },
201
+ ServiceId: serviceData.ServiceId,
202
+ connectionId: serviceData.connectionId,
203
+ } as GetServiceResponsePacketToServer,
204
+ key: this.key
205
+ });
206
+ return;
207
+ }
208
+ callbackArgs = Array.isArray(schemaResult.data) ? schemaResult.data : [schemaResult.data];
134
209
  }
135
210
 
136
- } else if (rawPacket.type === requestType.SetConfig) {
137
- const cfg = rawPacket.data as setConfigPacket;
138
- const existing = localConfigs.get(cfg.id);
139
- if (existing) {
140
- localConfigs.set(cfg.id, { ...existing, value: cfg.newValue } as registerConfigPacket);
141
- }
211
+ const result = callback(...callbackArgs);
212
+ WsSend(this.ws, {
213
+ type: requestType.GetServiceResponse, data: {
214
+ result: result,
215
+ ServiceId: serviceData.ServiceId,
216
+ connectionId: serviceData.connectionId,
217
+ } as GetServiceResponsePacketToServer,
218
+ key: this.key
219
+ });
220
+ } catch (error) {
221
+ console.error(`Fout bij uitvoeren van service ${serviceData.ServiceId}:`, error);
222
+ }
142
223
  }
143
- });
144
224
 
145
- return new Promise<StringPacket>((resolve) => {
146
- const handler = (raw: Buffer) => {
147
- const rawPacket = JSON.parse(raw.toString()) as packet;
148
- if (rawPacket.type === requestType.Init) {
149
- const data = rawPacket.data as InitResponsePacket;
150
- assert(data.versionMajor === VERSION.MAJOR, `Major versie mismatch: Client versie is ${VERSION.MAJOR}, server versie is ${data.versionMajor}.`);
151
- if (data.versionMinor !== VERSION.MINOR) {
152
- console.warn(`Waarschuwing: Minor versie mismatch: Client versie is ${VERSION.MINOR}, server versie is ${data.versionMinor}. Mogelijk zijn er incompatibiliteiten.`);
153
- }
154
- if (data.versionPatch !== VERSION.PATCH) {
155
- console.warn(`Waarschuwing: Patch versie mismatch: Client versie is ${VERSION.PATCH}, server versie is ${data.versionPatch}. Mogelijk zijn er bugs of ontbrekende functies.`);
156
- }
157
- ws.removeListener('message', handler);
158
- console.info('Client geïnitialiseerd met versie:', data.versionMajor, data.versionMinor, data.versionPatch);
159
- console.info('gebruik via GEN.ts is aanbevolen')
160
- resolve({ for: stringPacketOptions.initSuccess, msg: 'Init succesvol' } as StringPacket);
161
- }
162
- };
163
- ws.on('message', handler);
225
+ } else if (rawPacket.type === requestType.SetConfig) {
226
+ const setConfigResult = setConfigPacketSchema.safeParse(rawPacket.data);
227
+ if (!setConfigResult.success) {
228
+ return;
229
+ }
230
+ const cfg = setConfigResult.data as setConfigPacket;
231
+ const existing = this.localConfigs.get(cfg.id);
232
+ if (existing) {
233
+ this.localConfigs.set(cfg.id, { ...existing, value: cfg.newValue } as registerConfigPacket);
234
+ }
235
+ }
236
+ });
237
+ this.initialized = new Promise<StringPacket>((resolve) => {
238
+ const handler = (raw: Buffer) => {
239
+ let parsedRaw: unknown;
240
+ try {
241
+ parsedRaw = JSON.parse(raw.toString());
242
+ } catch {
243
+ return;
244
+ }
245
+ const packetResult = packetSchema.safeParse(parsedRaw);
246
+ if (!packetResult.success) {
247
+ return;
248
+ }
249
+ const rawPacket = packetResult.data as packet;
250
+ if (rawPacket.type === requestType.Init) {
251
+ const initResult = initResponsePacketSchema.safeParse(rawPacket.data);
252
+ if (!initResult.success) {
253
+ return;
254
+ }
255
+ const data = initResult.data as InitResponsePacket;
256
+ assert(data.versionMajor === this.VERSION.MAJOR, `Major versie mismatch: Client versie is ${this.VERSION.MAJOR}, server versie is ${data.versionMajor}.`);
257
+ if (data.versionMinor !== this.VERSION.MINOR) {
258
+ console.warn(`Waarschuwing: Minor versie mismatch: Client versie is ${this.VERSION.MINOR}, server versie is ${data.versionMinor}. Mogelijk zijn er incompatibiliteiten.`);
259
+ }
260
+ if (data.versionPatch !== this.VERSION.PATCH) {
261
+ console.warn(`Waarschuwing: Patch versie mismatch: Client versie is ${this.VERSION.PATCH}, server versie is ${data.versionPatch}. Mogelijk zijn er bugs of ontbrekende functies.`);
262
+ }
263
+ this.ws.removeListener('message', handler);
264
+ console.info('Client geïnitialiseerd met versie:', data.versionMajor, data.versionMinor, data.versionPatch);
265
+ resolve({ for: stringPacketOptions.initSuccess, msg: 'Init succesvol' } as StringPacket);
266
+ }
267
+ };
268
+ this.ws.on('message', handler);
164
269
  });
165
- }
166
270
 
167
- export function getConfigValue(id: string): any | undefined {
168
- const item = localConfigs.get(id);
271
+ }
272
+
273
+ public getConfigValue(id: string): any | undefined {
274
+ const item = this.localConfigs.get(id);
169
275
  return item ? (item.value ?? item.defaultValue) : undefined;
170
- }
171
- export const TESTING_HELPERS = {
276
+ }
277
+ public TESTING_HELPERS = {
172
278
  done: () => {
173
- ws.send(JSON.stringify({ type: requestType.Success, data: { msg: 'done', for: stringPacketOptions.initSuccess } as StringPacket, key }));
279
+ this.ws.send(JSON.stringify({ type: requestType.Success, data: { msg: 'done', for: stringPacketOptions.initSuccess } as StringPacket, key: this.key }));
174
280
  },
175
281
  error: (msg: string) => {
176
- ws.send(JSON.stringify({ type: requestType.Success, data: { msg: msg, for: stringPacketOptions.initSuccess } as StringPacket, key }));
282
+ this.ws.send(JSON.stringify({ type: requestType.Success, data: { msg: msg, for: stringPacketOptions.initSuccess } as StringPacket, key: this.key }));
177
283
  }
178
- }
284
+ }
285
+
286
+
287
+ }