@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.
- package/dist/clientLib.d.ts +36 -13
- package/dist/clientLib.js +239 -157
- package/dist/clientLib.js.map +1 -1
- package/dist/helpers.js +10 -5
- package/dist/helpers.js.map +1 -1
- package/dist/server.js +143 -80
- package/dist/server.js.map +1 -1
- package/dist/types.d.ts +86 -8
- package/dist/types.js +64 -4
- package/dist/types.js.map +1 -1
- package/package.json +15 -10
- package/readme.md +22 -16
- package/src/clientLib.ts +256 -147
- package/src/server.ts +116 -38
- package/src/types.ts +84 -10
- package/dist/GEN.d.ts +0 -1
- package/dist/GEN.js +0 -9
- package/dist/GEN.js.map +0 -1
- package/dist/client.d.ts +0 -1
- package/dist/client.js +0 -49
- package/dist/client.js.map +0 -1
- package/dist/client2.d.ts +0 -1
- package/dist/client2.js +0 -26
- package/dist/client2.js.map +0 -1
- package/dist/test3.d.ts +0 -1
- package/dist/test3.js +0 -16
- package/dist/test3.js.map +0 -1
- package/dist/tests/clients/basic/clientA.d.ts +0 -1
- package/dist/tests/clients/basic/clientA.js +0 -17
- package/dist/tests/clients/basic/clientA.js.map +0 -1
- package/dist/tests/clients/basic/clientB.d.ts +0 -1
- package/dist/tests/clients/basic/clientB.js +0 -20
- package/dist/tests/clients/basic/clientB.js.map +0 -1
- package/dist/tests/clients/privleges/clientA.d.ts +0 -1
- package/dist/tests/clients/privleges/clientA.js +0 -17
- package/dist/tests/clients/privleges/clientA.js.map +0 -1
- package/dist/tests/clients/privleges/clientB.d.ts +0 -1
- package/dist/tests/clients/privleges/clientB.js +0 -20
- package/dist/tests/clients/privleges/clientB.js.map +0 -1
- package/dist/tests/server/basic.d.ts +0 -1
- package/dist/tests/server/basic.js +0 -3
- package/dist/tests/server/basic.js.map +0 -1
- package/dist/tests/server/privleges.d.ts +0 -1
- package/dist/tests/server/privleges.js +0 -22
- package/dist/tests/server/privleges.js.map +0 -1
- package/dist/tests/testMaster.d.ts +0 -1
- package/dist/tests/testMaster.js +0 -54
- package/dist/tests/testMaster.js.map +0 -1
- package/dist/v1/client.d.ts +0 -1
- package/dist/v1/client.js +0 -17
- package/dist/v1/client.js.map +0 -1
- package/dist/v1/lib.d.ts +0 -28
- package/dist/v1/lib.js +0 -191
- package/dist/v1/lib.js.map +0 -1
- package/dist/v1/main.d.ts +0 -1
- package/dist/v1/main.js +0 -195
- package/dist/v1/main.js.map +0 -1
- package/dist/v1/test2.d.ts +0 -1
- package/dist/v1/test2.js +0 -13
- package/dist/v1/test2.js.map +0 -1
- package/src/GEN.ts +0 -11
- package/src/tests/clients/basic/clientA.ts +0 -18
- package/src/tests/clients/basic/clientB.ts +0 -20
- package/src/tests/clients/privleges/clientA.ts +0 -18
- package/src/tests/clients/privleges/clientB.ts +0 -20
- package/src/tests/server/basic.ts +0 -3
- package/src/tests/server/privleges.ts +0 -20
- package/src/tests/testMaster.ts +0 -57
package/readme.md
CHANGED
|
@@ -1,28 +1,34 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Tonpleun: Server-to-Server Communication via WebSockets
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
9
|
+
## Features
|
|
12
10
|
|
|
13
|
-
|
|
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
|
-
|
|
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
|
-
|
|
20
|
+
```bash
|
|
21
|
+
npm install tonpleun
|
|
22
|
+
```
|
|
19
23
|
|
|
20
|
-
|
|
24
|
+
## Usage
|
|
21
25
|
|
|
22
|
-
|
|
26
|
+
See [run-server.ts](./run-server.ts) and [test-client.ts](./test-client.ts) for example usage.
|
|
23
27
|
|
|
24
|
-
|
|
28
|
+
## AI-Generated Code
|
|
25
29
|
|
|
26
|
-
|
|
30
|
+
Some small parts of this codebase were made with AI assistance.
|
|
27
31
|
|
|
28
|
-
|
|
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 {
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
}
|
|
94
|
-
|
|
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
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
-
|
|
105
|
-
|
|
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
|
-
|
|
158
|
+
this.ws.on('close', () => {
|
|
159
|
+
console.log('Verbinding met tonpleun server gesloten.');
|
|
110
160
|
});
|
|
111
|
-
ws.on('error', (error) => {
|
|
112
|
-
|
|
113
|
-
|
|
161
|
+
this.ws.on('error', (error) => {
|
|
162
|
+
console.error('Fout opgetreden:', error);
|
|
163
|
+
this.ws.close();
|
|
114
164
|
});
|
|
115
|
-
ws.on('message', (data) => {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
|
|
146
|
-
const
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
}
|
|
163
|
-
|
|
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
|
-
|
|
168
|
-
|
|
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
|
-
|
|
276
|
+
}
|
|
277
|
+
public TESTING_HELPERS = {
|
|
172
278
|
done: () => {
|
|
173
|
-
|
|
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
|
-
|
|
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
|
+
}
|