@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/src/server.ts CHANGED
@@ -1,15 +1,41 @@
1
1
  import { log, successPacketBuilder, WsSend } from './helpers.js';
2
2
  import { WebSocketServer, WebSocket } from 'ws';
3
- import { InitResponsePacket, type StringPacket, requestType, stringPacketOptions, type namedFakeType, type getServicePacket, type getServicePacketClient, type GetServiceResponsePacketToClient, type InitPacket, type packet, type registerConfigPacket, type RegisterServicePacket, type setConfigPacket } from './types.js';
3
+ import {
4
+ InitResponsePacket,
5
+ type StringPacket,
6
+ requestType,
7
+ stringPacketOptions,
8
+ type getServicePacket,
9
+ type getServicePacketClient,
10
+ type GetServiceResponsePacketToClient,
11
+ type InitPacket,
12
+ type packet,
13
+ type registerConfigPacket,
14
+ type RegisterServicePacket,
15
+ type setConfigPacket,
16
+ getServicePacketSchema,
17
+ getServiceResponsePacketToServerSchema,
18
+ initPacketSchema,
19
+ packetSchema,
20
+ registerConfigPacketSchema,
21
+ registerServicePacketSchema,
22
+ setConfigPacketSchema,
23
+ sendExternalDataPacket
24
+ } from './types.js';
4
25
 
5
26
  function mapToObject(map: Map<any, any>) {
6
- return Object.fromEntries([...map.entries()].map(([kMaxLength, v]): any => [kMaxLength, v instanceof Map ? mapToObject(v) : v]))
27
+ return Object.fromEntries([
28
+ ...map.entries()
29
+ ].map(([kMaxLength, v]): any => [
30
+ kMaxLength,
31
+ v instanceof Map ? mapToObject(v) : v instanceof Set ? [...v.values()] : v
32
+ ]))
7
33
  }
8
34
 
9
35
  const VERSION = {
10
- MAJOR: 1,
11
- MINOR: 1,
12
- PATCH: 3
36
+ MAJOR: 2,
37
+ MINOR: 0,
38
+ PATCH: 0
13
39
  };
14
40
  enum PRIVLEGE_LEVELS {
15
41
  NONE = 0,
@@ -45,34 +71,12 @@ const unprivlegedError = {
45
71
  } as packet;
46
72
 
47
73
  let clients: Record<string, WebSocket> = {};
48
- let services = new Map<string, Map<string, namedFakeType[]>>();
74
+ let services = new Map<string, Set<string>>();
49
75
  let configs = new Map<string, Map<string, registerConfigPacket>>();
50
76
  let localServices = new Map<string, (...args: any[]) => any>();
51
77
  localServices.set('getServices', (...args: any[]) => { if (!config.ALLOW_SCANNING) { return; } return mapToObject(services) })
52
78
  localServices.set('getConfigs', (...args: any[]) => { if (!config.ALLOW_SCANNING) { return; } return mapToObject(configs) })
53
- localServices.set('genHelper', (...args: any[]) => {
54
- if (!config.ALLOW_CONFIG_GENERATION) {
55
- return;
56
- }
57
- let output = '/* Dit bestand is automatisch gegenereerd door Tonpleun. Wijzigingen hierin worden overschreven. */\n\n';
58
- output += `import { getService } from './clientLib.js';\n\n`;
59
-
60
- services.forEach((serviceMap, clientId) => {
61
- output += `// Services for client: ${clientId}\n`;
62
- serviceMap.forEach((argTypes, serviceId) => {
63
- output += `// ${serviceId}\n`;
64
- output += `export async function ${serviceId}(`;
65
- output += argTypes.map((type, _) => `${type.name}: ${type.type}`).join(', ');
66
- output += `): Promise<any> {\n`;
67
- output += ` return await getService('${serviceId}', '${clientId}', [${argTypes.map((arg, _) => `${arg.name}`).join(', ')}]);\n`;
68
- output += `}\n\n`;
69
- });
70
- });
71
79
 
72
- output += `// Tonpleun versie: ${VERSION.MAJOR}.${VERSION.MINOR}.${VERSION.PATCH}\n`;
73
- output += `// Genereer dit bestand opnieuw met de genHelper service indien services zijn gewijzigd.\n`;
74
- return output;
75
- });
76
80
  // Map a unique connectionId to the original requester WebSocket
77
81
  const connectionMap = new Map<string, WebSocket>();
78
82
 
@@ -96,11 +100,30 @@ export default function startServer(customConfig?: Partial<configType>) {
96
100
  log(id, 'ws verbonden wachten op init.');
97
101
 
98
102
  ws.on('message', async (raw) => {
99
- const jsonData = JSON.parse(raw.toString()) as packet;
103
+ let parsedRaw: unknown;
104
+ try {
105
+ parsedRaw = JSON.parse(raw.toString());
106
+ } catch {
107
+ log(id, 'invalid json ontvangen.');
108
+ return;
109
+ }
110
+ const parsedPacket = packetSchema.safeParse(parsedRaw);
111
+ if (!parsedPacket.success) {
112
+ log(id, 'ongeldig packet ontvangen.');
113
+ return;
114
+ }
115
+ const jsonData = parsedPacket.data as packet;
100
116
  let data;
101
117
  switch (jsonData.type) {
102
118
  case requestType.Init:
103
- data = jsonData.data as InitPacket;
119
+ {
120
+ const initData = initPacketSchema.safeParse(jsonData.data);
121
+ if (!initData.success) {
122
+ log(id, 'ongeldig init packet ontvangen.');
123
+ return;
124
+ }
125
+ data = initData.data as InitPacket;
126
+ }
104
127
  clients[data.ClientId] = ws;
105
128
  id = data.ClientId;
106
129
  // voor deze kunnen we direct afsluiten als ze niet mogen initen
@@ -109,25 +132,39 @@ export default function startServer(customConfig?: Partial<configType>) {
109
132
  ws.close();
110
133
  return;
111
134
  }
112
- services.set(id, new Map())
135
+ services.set(id, new Set())
113
136
  // initialize per-client config store to avoid undefined access
114
137
  configs.set(id, new Map())
115
138
  log(id, 'ws init gedaan, client id gegeven. ip: ', req.socket.remoteAddress);
116
- WsSend(ws, { type: requestType.Init, data: { versionMajor: VERSION.MAJOR, versionMinor: VERSION.MINOR, versionPatch: VERSION.MINOR } as InitResponsePacket } as packet);
139
+ WsSend(ws, { type: requestType.Init, data: { versionMajor: VERSION.MAJOR, versionMinor: VERSION.MINOR, versionPatch: VERSION.PATCH } as InitResponsePacket } as packet);
117
140
  break;
118
141
  case requestType.RegisterService:
119
- data = jsonData.data as RegisterServicePacket;
142
+ {
143
+ const registerData = registerServicePacketSchema.safeParse(jsonData.data);
144
+ if (!registerData.success) {
145
+ log(id, 'ongeldig register service packet ontvangen.');
146
+ return;
147
+ }
148
+ data = registerData.data as RegisterServicePacket;
149
+ }
120
150
  if (!privlegeCheck(id, 5)) {
121
151
  log(id, 'register service geweigerd vanwege privleges.');
122
152
  WsSend(ws, unprivlegedError);
123
153
  return;
124
154
  }
125
- services.get(id)!.set(data.ServiceId, data.args);
155
+ services.get(id)!.add(data.ServiceId);
126
156
  log(id, `service ${data.ServiceId} geregistreerd.`);
127
157
  WsSend(ws, successPacketBuilder(`service ${data.ServiceId} geregistreerd.`, stringPacketOptions.registerServiceSuccess));
128
158
  break;
129
159
  case requestType.GetService:
130
- data = jsonData.data as getServicePacket;
160
+ {
161
+ const getServiceData = getServicePacketSchema.safeParse(jsonData.data);
162
+ if (!getServiceData.success) {
163
+ log(id, 'ongeldig get service packet ontvangen.');
164
+ return;
165
+ }
166
+ data = getServiceData.data as getServicePacket;
167
+ }
131
168
  log(id, `service ${data.ServiceId} opgevraagd bij client ${data.ClientId}.`);
132
169
  if (!privlegeCheck(id, PRIVLEGE_LEVELS.SERVICE_ACCESS)) {
133
170
  log(id, 'get service geweigerd vanwege privleges.');
@@ -165,7 +202,14 @@ export default function startServer(customConfig?: Partial<configType>) {
165
202
  }
166
203
  break;
167
204
  case requestType.GetServiceResponse:
168
- data = jsonData.data;
205
+ {
206
+ const responseData = getServiceResponsePacketToServerSchema.safeParse(jsonData.data);
207
+ if (!responseData.success) {
208
+ log(id, 'ongeldig get service response packet ontvangen.');
209
+ return;
210
+ }
211
+ data = responseData.data;
212
+ }
169
213
  if (!privlegeCheck(id, PRIVLEGE_LEVELS.SERVICE_ACCESS)) {
170
214
  console.error('GetServiceResponse received from unprivileged client how tf does this even happen:', id);
171
215
  WsSend(ws, unprivlegedError);
@@ -187,7 +231,14 @@ export default function startServer(customConfig?: Partial<configType>) {
187
231
  }
188
232
  break;
189
233
  case requestType.RegisterConifg:
190
- data = jsonData.data as registerConfigPacket;
234
+ {
235
+ const registerConfigData = registerConfigPacketSchema.safeParse(jsonData.data);
236
+ if (!registerConfigData.success) {
237
+ log(id, 'ongeldig register config packet ontvangen.');
238
+ return;
239
+ }
240
+ data = registerConfigData.data as registerConfigPacket;
241
+ }
191
242
  if (!privlegeCheck(id, PRIVLEGE_LEVELS.CONFIG_ACCESS)) {
192
243
  log(id, 'register geweigerd vanwege privleges.');
193
244
  WsSend(ws, unprivlegedError);
@@ -204,7 +255,14 @@ export default function startServer(customConfig?: Partial<configType>) {
204
255
  WsSend(ws, unprivlegedError);
205
256
  return;
206
257
  }
207
- data = jsonData.data as setConfigPacket;
258
+ {
259
+ const setConfigData = setConfigPacketSchema.safeParse(jsonData.data);
260
+ if (!setConfigData.success) {
261
+ log(id, 'ongeldig set config packet ontvangen.');
262
+ return;
263
+ }
264
+ data = setConfigData.data as setConfigPacket;
265
+ }
208
266
  log(id, 'update de dinges');
209
267
  const otherGuy = clients[data.ClientId]
210
268
  if (otherGuy) {
@@ -233,6 +291,26 @@ export default function startServer(customConfig?: Partial<configType>) {
233
291
  console.info('test server afgesloten.');
234
292
  }
235
293
  break;
294
+ case requestType.SendExternalData:
295
+ {
296
+ if (!privlegeCheck(id, PRIVLEGE_LEVELS.FULL_ACCESS)) {
297
+ log(id, 'Externe data verzenden geweigerd vanwege privleges.');
298
+ WsSend(ws, unprivlegedError);
299
+ return;
300
+ }
301
+ const externalData = jsonData.data as sendExternalDataPacket;
302
+ const recipientWs = clients[externalData.ToClientId];
303
+ if (recipientWs) {
304
+ WsSend(recipientWs, {
305
+ type: requestType.SendExternalData,
306
+ data: externalData.externalDataPacket,
307
+ key: undefined
308
+ });
309
+ } else {
310
+ log(id, `externe data ontvanger ${externalData.ToClientId} niet gevonden.`);
311
+ }
312
+ }
313
+ break;
236
314
  default:
237
315
  log(id, 'invalid msg');
238
316
  break;
package/src/types.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import { z } from 'zod';
2
+
1
3
  export enum requestType {
2
4
  Init,
3
5
  Success,
@@ -7,14 +9,10 @@ export enum requestType {
7
9
  GetService,
8
10
  RegisterConifg,
9
11
  SetConfig,
10
-
12
+ SendExternalData,
11
13
  }
12
- export enum stringPacketOptions { Error, initSuccess, registerServiceSuccess, getServiceSuccess, registerConfigSuccess, setConfigSuccess };
13
- export type fakeTypeType = "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function";
14
- export type namedFakeType = {
15
- name: string,
16
- type: fakeTypeType
17
- };
14
+ export enum stringPacketOptions { Error, initSuccess, registerServiceSuccess, getServiceSuccess, registerConfigSuccess, setConfigSuccess, };
15
+ export type configValueType = "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function";
18
16
  export type packet = {
19
17
  type: requestType,
20
18
  data: any,
@@ -38,7 +36,6 @@ export type StringPacket = {
38
36
  // requestType.RegisterService
39
37
  export type RegisterServicePacket = {
40
38
  ServiceId: string,
41
- args: namedFakeType[]
42
39
  }
43
40
  // requestType.GetService ( client1 -> server)
44
41
  export type getServicePacket = {
@@ -72,7 +69,7 @@ export type registerConfigPacket = {
72
69
  name: string,
73
70
  id: string,
74
71
  description: string,
75
- type: fakeTypeType,
72
+ type: configValueType,
76
73
  defaultValue: any,
77
74
  value?: any
78
75
  }
@@ -81,4 +78,81 @@ export type setConfigPacket = {
81
78
  ClientId: string,
82
79
  newValue: any,
83
80
  id: string
84
- }
81
+ }
82
+
83
+ export type sendExternalDataPacket = {
84
+ ToClientId: string,
85
+ externalDataPacket: externalDataPacket
86
+ }
87
+
88
+ export type externalDataPacket = {
89
+ FromClientId: string,
90
+ data: any
91
+ }
92
+
93
+ export const configValueTypeSchema = z.enum(["string", "number", "bigint", "boolean", "symbol", "undefined", "object", "function"]);
94
+
95
+ export const initPacketSchema = z.object({
96
+ ClientId: z.string().min(1)
97
+ });
98
+
99
+ export const initResponsePacketSchema = z.object({
100
+ versionMajor: z.number().int(),
101
+ versionMinor: z.number().int(),
102
+ versionPatch: z.number().int()
103
+ });
104
+
105
+ export const stringPacketSchema = z.object({
106
+ msg: z.string(),
107
+ for: z.nativeEnum(stringPacketOptions)
108
+ });
109
+
110
+ export const registerServicePacketSchema = z.object({
111
+ ServiceId: z.string().min(1)
112
+ });
113
+
114
+ export const getServicePacketSchema = z.object({
115
+ ClientId: z.string().min(1),
116
+ ServiceId: z.string().min(1),
117
+ connectionId: z.string().min(1),
118
+ args: z.array(z.unknown())
119
+ });
120
+
121
+ export const getServicePacketClientSchema = z.object({
122
+ ServiceId: z.string().min(1),
123
+ args: z.array(z.unknown()),
124
+ connectionId: z.string().min(1)
125
+ });
126
+
127
+ export const getServiceResponsePacketToServerSchema = z.object({
128
+ ServiceId: z.string().min(1),
129
+ result: z.unknown(),
130
+ connectionId: z.string().min(1)
131
+ });
132
+
133
+ export const getServiceResponsePacketToClientSchema = z.object({
134
+ result: z.unknown(),
135
+ serviceId: z.string().min(1),
136
+ connectionId: z.string().min(1)
137
+ });
138
+
139
+ export const registerConfigPacketSchema = z.object({
140
+ name: z.string().min(1),
141
+ id: z.string().min(1),
142
+ description: z.string(),
143
+ type: configValueTypeSchema,
144
+ defaultValue: z.unknown(),
145
+ value: z.unknown().optional()
146
+ });
147
+
148
+ export const setConfigPacketSchema = z.object({
149
+ ClientId: z.string().min(1),
150
+ newValue: z.unknown(),
151
+ id: z.string().min(1)
152
+ });
153
+
154
+ export const packetSchema = z.object({
155
+ type: z.nativeEnum(requestType),
156
+ data: z.unknown(),
157
+ key: z.unknown().optional()
158
+ });
package/dist/GEN.d.ts DELETED
@@ -1 +0,0 @@
1
- export declare function echo(tekst: string): Promise<any>;
package/dist/GEN.js DELETED
@@ -1,9 +0,0 @@
1
- /* Dit bestand is automatisch gegenereerd door Tonpleun. Wijzigingen hierin worden overschreven. */
2
- import { getService } from './clientLib.js';
3
- // Services for client: testClient
4
- // echo
5
- export async function echo(tekst) {
6
- return await getService('echo', 'testClient', [tekst]);
7
- }
8
- // Services for client: Client2
9
- //# sourceMappingURL=GEN.js.map
package/dist/GEN.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"GEN.js","sourceRoot":"","sources":["../src/GEN.ts"],"names":[],"mappings":"AAAA,mGAAmG;AAEnG,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,kCAAkC;AAClC,OAAO;AACP,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,KAAa;IACpC,OAAO,MAAM,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,+BAA+B"}
package/dist/client.d.ts DELETED
@@ -1 +0,0 @@
1
- export {};
package/dist/client.js DELETED
@@ -1,49 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const clientLib_js_1 = require("./clientLib.js");
7
- const strict_1 = __importDefault(require("node:assert/strict"));
8
- function echo(args) {
9
- console.log(args);
10
- return 'pindakaas';
11
- }
12
- async function main() {
13
- await (0, clientLib_js_1.initializeClient)('testClient');
14
- console.log(await (0, clientLib_js_1.registerService)('echo', [{ name: 'tekst', type: 'string' }], echo));
15
- console.log(await (0, clientLib_js_1.getService)('getServices', 'tonpleun', []));
16
- // Config tests: register and update a config item, then verify via tonpleun service
17
- await (0, clientLib_js_1.registerConfigItem)('greeting', 'Simple greeting config', 'hello', 'conf:greeting');
18
- const configsAfterRegister = await (0, clientLib_js_1.getService)('getConfigs', 'tonpleun', []);
19
- strict_1.default.ok(configsAfterRegister['testClient'], 'configs for testClient should exist');
20
- strict_1.default.ok(configsAfterRegister['testClient']['conf:greeting'], 'conf:greeting should be registered');
21
- strict_1.default.equal(configsAfterRegister['testClient']['conf:greeting'].defaultValue, 'hello');
22
- console.log('[Client1] registered config OK');
23
- await (0, clientLib_js_1.SetConfigItem)('conf:greeting', 'hi');
24
- const configsAfterSet = await (0, clientLib_js_1.getService)('getConfigs', 'tonpleun', []);
25
- strict_1.default.equal(configsAfterSet['testClient']['conf:greeting'].value, 'hi');
26
- console.log('[Client1] set config value OK');
27
- strict_1.default.equal((0, clientLib_js_1.getConfigValue)('conf:greeting'), 'hi');
28
- console.log('[Client1] local config value OK');
29
- // Wait for a potential remote update (e.g., from Client2) and verify locally
30
- await new Promise((resolve) => {
31
- const expected = 'bye';
32
- const start = Date.now();
33
- const interval = setInterval(() => {
34
- const current = (0, clientLib_js_1.getConfigValue)('conf:greeting');
35
- if (current === expected) {
36
- clearInterval(interval);
37
- console.log('[Client1] remote config update applied OK');
38
- resolve();
39
- }
40
- else if (Date.now() - start > 5000) {
41
- clearInterval(interval);
42
- console.warn('[Client1] timeout waiting remote update; current:', current);
43
- resolve();
44
- }
45
- }, 200);
46
- });
47
- }
48
- main();
49
- //# sourceMappingURL=client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";;;;;AAAA,iDAAqI;AACrI,gEAAwC;AACxC,SAAS,IAAI,CAAC,IAAW;IACvB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACjB,OAAO,WAAW,CAAA;AACpB,CAAC;AACD,KAAK,UAAU,IAAI;IACjB,MAAM,IAAA,+BAAgB,EAAC,YAAY,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAA,8BAAe,EAAC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAA;IACrF,OAAO,CAAC,GAAG,CAAC,MAAM,IAAA,yBAAU,EAAC,aAAa,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,CAAA;IAC5D,oFAAoF;IACpF,MAAM,IAAA,iCAAkB,EAAC,UAAU,EAAE,wBAAwB,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;IACzF,MAAM,oBAAoB,GAAQ,MAAM,IAAA,yBAAU,EAAC,YAAY,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IACjF,gBAAM,CAAC,EAAE,CAAC,oBAAoB,CAAC,YAAY,CAAC,EAAE,qCAAqC,CAAC,CAAC;IACrF,gBAAM,CAAC,EAAE,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,EAAE,oCAAoC,CAAC,CAAC;IACrG,gBAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACxF,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAE9C,MAAM,IAAA,4BAAa,EAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IAC3C,MAAM,eAAe,GAAQ,MAAM,IAAA,yBAAU,EAAC,YAAY,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IAC5E,gBAAM,CAAC,KAAK,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,gBAAM,CAAC,KAAK,CAAC,IAAA,6BAAc,EAAC,eAAe,CAAC,EAAE,IAAI,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAC/C,6EAA6E;IAC7E,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,QAAQ,GAAG,KAAK,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,MAAM,OAAO,GAAG,IAAA,6BAAc,EAAC,eAAe,CAAC,CAAC;YAChD,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACzB,aAAa,CAAC,QAAQ,CAAC,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;gBACzD,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,IAAI,EAAE,CAAC;gBACrC,aAAa,CAAC,QAAQ,CAAC,CAAC;gBACxB,OAAO,CAAC,IAAI,CAAC,mDAAmD,EAAE,OAAO,CAAC,CAAC;gBAC3E,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC,CAAC,CAAC;AACL,CAAC;AACD,IAAI,EAAE,CAAC"}
package/dist/client2.d.ts DELETED
@@ -1 +0,0 @@
1
- export {};
package/dist/client2.js DELETED
@@ -1,26 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const clientLib_js_1 = require("./clientLib.js");
7
- const strict_1 = __importDefault(require("node:assert/strict"));
8
- async function main() {
9
- await (0, clientLib_js_1.initializeClient)('Client2');
10
- const result = await (0, clientLib_js_1.getService)('echo', 'testClient', ['hoi!!!!']);
11
- console.log('[Client2] echo result:', result);
12
- // Validate that configs registered by Client1 are visible and updated
13
- const configs = await (0, clientLib_js_1.getService)('getConfigs', 'tonpleun', []);
14
- strict_1.default.ok(configs['testClient'], 'configs for testClient should exist');
15
- strict_1.default.ok(configs['testClient']['conf:greeting'], 'conf:greeting should be present');
16
- console.log('[Client2] observed config:', configs['testClient']['conf:greeting']);
17
- // Trigger a remote config update for owner 'testClient' and verify server state
18
- await (0, clientLib_js_1.SetConfigItem)('conf:greeting', 'bye', 'testClient');
19
- const configsAfterSet = await (0, clientLib_js_1.getService)('getConfigs', 'tonpleun', []);
20
- strict_1.default.equal(configsAfterSet['testClient']['conf:greeting'].value, 'bye');
21
- console.log('[Client2] remote config update OK');
22
- const genResult = await (0, clientLib_js_1.genHelper)();
23
- console.log('[Client2] genHelper result length:', genResult.length);
24
- }
25
- main();
26
- //# sourceMappingURL=client2.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client2.js","sourceRoot":"","sources":["../src/client2.ts"],"names":[],"mappings":";;;;;AAAA,iDAAuF;AACvF,gEAAwC;AACxC,KAAK,UAAU,IAAI;IACf,MAAM,IAAA,+BAAgB,EAAC,SAAS,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAU,EAAC,MAAM,EAAE,YAAY,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;IAClE,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAA;IAC7C,sEAAsE;IACtE,MAAM,OAAO,GAAQ,MAAM,IAAA,yBAAU,EAAC,YAAY,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IACpE,gBAAM,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,qCAAqC,CAAC,CAAC;IACxE,gBAAM,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,EAAE,iCAAiC,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;IAClF,gFAAgF;IAChF,MAAM,IAAA,4BAAa,EAAC,eAAe,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;IAC1D,MAAM,eAAe,GAAQ,MAAM,IAAA,yBAAU,EAAC,YAAY,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IAC5E,gBAAM,CAAC,KAAK,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IAEjD,MAAM,SAAS,GAAG,MAAM,IAAA,wBAAS,GAAE,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;AACxE,CAAC;AACD,IAAI,EAAE,CAAC"}
package/dist/test3.d.ts DELETED
@@ -1 +0,0 @@
1
- export {};
package/dist/test3.js DELETED
@@ -1,16 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const clientLib_js_1 = require("./clientLib.js");
7
- const GEN_js_1 = require("./GEN.js");
8
- const strict_1 = __importDefault(require("node:assert/strict"));
9
- async function main() {
10
- await (0, clientLib_js_1.initializeClient)('Client3');
11
- (0, GEN_js_1.echo)('Hello from Client3').then((result) => {
12
- strict_1.default.equal(result, 'pindakaas');
13
- });
14
- }
15
- main();
16
- //# sourceMappingURL=test3.js.map
package/dist/test3.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"test3.js","sourceRoot":"","sources":["../src/test3.ts"],"names":[],"mappings":";;;;;AAAA,iDAAuF;AACvF,qCAAgC;AAChC,gEAAwC;AAExC,KAAK,UAAU,IAAI;IACf,MAAM,IAAA,+BAAgB,EAAC,SAAS,CAAC,CAAC;IAClC,IAAA,aAAI,EAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QACvC,gBAAM,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACP,CAAC;AACD,IAAI,EAAE,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,17 +0,0 @@
1
- import { initializeClient, registerService, registerConfigItem, getConfigValue } from "~/clientLib";
2
- async function main() {
3
- await initializeClient('clientA');
4
- console.log('Client A is initialized and ready to use services.');
5
- await registerService('addNumbers', [{ name: 'a', type: 'number' }, { name: 'b', type: 'number' }], (a, b) => {
6
- if (getConfigValue('addNumbersMode') === 'double') {
7
- return (a + b) * 2;
8
- }
9
- return a + b;
10
- });
11
- console.log('Service addNumbers registered on Client A.');
12
- await registerConfigItem('addNumbers mode', 'Determines how addNumbers behaves', 'normal', 'addNumbersMode');
13
- console.log('Config item addNumbers mode registered on Client A.');
14
- // B sluit af als alles gelukt is
15
- }
16
- main();
17
- //# sourceMappingURL=clientA.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clientA.js","sourceRoot":"","sources":["../../../../src/tests/clients/basic/clientA.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGpG,KAAK,UAAU,IAAI;IACf,MAAM,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAClE,MAAM,eAAe,CAAC,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE;QACzH,IAAI,cAAc,CAAC,gBAAgB,CAAC,KAAK,QAAQ,EAAE,CAAC;YAChD,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC1D,MAAM,kBAAkB,CAAC,iBAAiB,EAAE,mCAAmC,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAC7G,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACnE,iCAAiC;AACrC,CAAC;AACD,IAAI,EAAE,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,20 +0,0 @@
1
- import { initializeClient, getService, SetConfigItem, TESTING_HELPERS } from "~/clientLib";
2
- async function main() {
3
- await initializeClient('clientB');
4
- console.log('Client B is initialized and ready to use services.');
5
- const firstResult = await getService('addNumbers', 'clientA', [5, 10]);
6
- if (firstResult !== 15) {
7
- TESTING_HELPERS.error(`Expected 15 but got ${firstResult}`);
8
- return;
9
- }
10
- await SetConfigItem('addNumbersMode', 'double', 'clientA');
11
- console.log('Config item addNumbers mode set to double on Client A.');
12
- const secondResult = await getService('addNumbers', 'clientA', [5, 10]);
13
- if (secondResult !== 30) {
14
- TESTING_HELPERS.error(`Expected 30 but got ${secondResult}`);
15
- return;
16
- }
17
- TESTING_HELPERS.done();
18
- }
19
- main();
20
- //# sourceMappingURL=clientB.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clientB.js","sourceRoot":"","sources":["../../../../src/tests/clients/basic/clientB.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE3F,KAAK,UAAU,IAAI;IACf,MAAM,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACvE,IAAI,WAAW,KAAK,EAAE,EAAE,CAAC;QACrB,eAAe,CAAC,KAAK,CAAC,uBAAuB,WAAW,EAAE,CAAC,CAAC;QAC5D,OAAO;IACX,CAAC;IACD,MAAM,aAAa,CAAC,gBAAgB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACxE,IAAI,YAAY,KAAK,EAAE,EAAE,CAAC;QACtB,eAAe,CAAC,KAAK,CAAC,uBAAuB,YAAY,EAAE,CAAC,CAAC;QAC7D,OAAO;IACX,CAAC;IACD,eAAe,CAAC,IAAI,EAAE,CAAC;AAC3B,CAAC;AACD,IAAI,EAAE,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,17 +0,0 @@
1
- import { initializeClient, registerService, registerConfigItem, getConfigValue } from "~/clientLib";
2
- async function main() {
3
- await initializeClient('clientA', 'service-access-key');
4
- console.log('Client A is initialized and ready to use services.');
5
- await registerService('addNumbers', [{ name: 'a', type: 'number' }, { name: 'b', type: 'number' }], (a, b) => {
6
- if (getConfigValue('addNumbersMode') === 'double') {
7
- return (a + b) * 2;
8
- }
9
- return a + b;
10
- });
11
- console.log('Service addNumbers registered on Client A.');
12
- await registerConfigItem('addNumbers mode', 'Determines how addNumbers behaves', 'normal', 'addNumbersMode');
13
- console.log('Config item addNumbers mode registered on Client A.');
14
- // B sluit af als alles gelukt is
15
- }
16
- main();
17
- //# sourceMappingURL=clientA.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clientA.js","sourceRoot":"","sources":["../../../../src/tests/clients/privleges/clientA.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGpG,KAAK,UAAU,IAAI;IACf,MAAM,gBAAgB,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAClE,MAAM,eAAe,CAAC,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE;QACzH,IAAI,cAAc,CAAC,gBAAgB,CAAC,KAAK,QAAQ,EAAE,CAAC;YAChD,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC1D,MAAM,kBAAkB,CAAC,iBAAiB,EAAE,mCAAmC,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAC7G,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACnE,iCAAiC;AACrC,CAAC;AACD,IAAI,EAAE,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,20 +0,0 @@
1
- import { initializeClient, getService, SetConfigItem, TESTING_HELPERS } from "~/clientLib";
2
- async function main() {
3
- await initializeClient('clientB');
4
- console.log('Client B is initialized and ready to use services.');
5
- const firstResult = await getService('addNumbers', 'clientA', [5, 10]);
6
- if (firstResult !== 15) {
7
- TESTING_HELPERS.error(`Expected 15 but got ${firstResult}`);
8
- return;
9
- }
10
- await SetConfigItem('addNumbersMode', 'double', 'clientA');
11
- console.log('Config item addNumbers mode set to double on Client A.');
12
- const secondResult = await getService('addNumbers', 'clientA', [5, 10]);
13
- if (secondResult !== 30) {
14
- TESTING_HELPERS.error(`Expected 30 but got ${secondResult}`);
15
- return;
16
- }
17
- TESTING_HELPERS.done();
18
- }
19
- main();
20
- //# sourceMappingURL=clientB.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clientB.js","sourceRoot":"","sources":["../../../../src/tests/clients/privleges/clientB.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE3F,KAAK,UAAU,IAAI;IACf,MAAM,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACvE,IAAI,WAAW,KAAK,EAAE,EAAE,CAAC;QACrB,eAAe,CAAC,KAAK,CAAC,uBAAuB,WAAW,EAAE,CAAC,CAAC;QAC5D,OAAO;IACX,CAAC;IACD,MAAM,aAAa,CAAC,gBAAgB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACxE,IAAI,YAAY,KAAK,EAAE,EAAE,CAAC;QACtB,eAAe,CAAC,KAAK,CAAC,uBAAuB,YAAY,EAAE,CAAC,CAAC;QAC7D,OAAO;IACX,CAAC;IACD,eAAe,CAAC,IAAI,EAAE,CAAC;AAC3B,CAAC;AACD,IAAI,EAAE,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,3 +0,0 @@
1
- import startServer from "~/server";
2
- startServer();
3
- //# sourceMappingURL=basic.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"basic.js","sourceRoot":"","sources":["../../../src/tests/server/basic.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,UAAU,CAAC;AAEnC,WAAW,EAAE,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,22 +0,0 @@
1
- import startServer from '~/server';
2
- const customConfig = {
3
- CLIENT_ALLOWED_CHECK: (key) => {
4
- if (key === 'full-access-key') {
5
- return 7; // Full access
6
- }
7
- else if (key === 'service-access-key') {
8
- return 2; // Service access only
9
- }
10
- else if (key === 'config-access-key') {
11
- return 3; // Config access only
12
- }
13
- else {
14
- return 0; // No access
15
- }
16
- },
17
- PRIVLEGE_CHECK_AT: 2, // Enforce privilege checks at level 2 and above
18
- ALLOW_CONFIG_GENERATION: false,
19
- ALLOW_SCANNING: false,
20
- };
21
- startServer(customConfig);
22
- //# sourceMappingURL=privleges.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"privleges.js","sourceRoot":"","sources":["../../../src/tests/server/privleges.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,UAAU,CAAA;AAElC,MAAM,YAAY,GAAG;IACjB,oBAAoB,EAAE,CAAC,GAAQ,EAAU,EAAE;QACvC,IAAI,GAAG,KAAK,iBAAiB,EAAE,CAAC;YAC5B,OAAO,CAAC,CAAC,CAAC,cAAc;QAC5B,CAAC;aAAM,IAAI,GAAG,KAAK,oBAAoB,EAAE,CAAC;YACtC,OAAO,CAAC,CAAC,CAAC,sBAAsB;QACpC,CAAC;aAAM,IAAI,GAAG,KAAK,mBAAmB,EAAE,CAAC;YACrC,OAAO,CAAC,CAAC,CAAC,qBAAqB;QACnC,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,CAAC,CAAC,YAAY;QAC1B,CAAC;IACL,CAAC;IACD,iBAAiB,EAAE,CAAC,EAAE,gDAAgD;IACtE,uBAAuB,EAAE,KAAK;IAC9B,cAAc,EAAE,KAAK;CACxB,CAAC;AAEF,WAAW,CAAC,YAAY,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};