| 
														
															@@ -6,7 +6,6 @@ import BaseModule from "../BaseModule"; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import { Jobs, Modules, UniqueMethods } from "../types/Modules"; 
														 | 
														
														 | 
														
															 import { Jobs, Modules, UniqueMethods } from "../types/Modules"; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import WebSocket from "../WebSocket"; 
														 | 
														
														 | 
														
															 import WebSocket from "../WebSocket"; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import { UserRole } from "../models/schemas/users/UserRole"; 
														 | 
														
														 | 
														
															 import { UserRole } from "../models/schemas/users/UserRole"; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-import { StationType } from "../models/schemas/stations/StationType"; 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import permissions from "../permissions"; 
														 | 
														
														 | 
														
															 import permissions from "../permissions"; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import Job from "../Job"; 
														 | 
														
														 | 
														
															 import Job from "../Job"; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import { Models } from "../types/Models"; 
														 | 
														
														 | 
														
															 import { Models } from "../types/Models"; 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -21,7 +20,13 @@ export default class APIModule extends BaseModule { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 		super("api"); 
														 | 
														
														 | 
														
															 		super("api"); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 		this._dependentModules = ["data", "events", "websocket"]; 
														 | 
														
														 | 
														
															 		this._dependentModules = ["data", "events", "websocket"]; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 		this._subscriptions = {}; 
														 | 
														
														 | 
														
															 		this._subscriptions = {}; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+		this._jobConfig = { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+			prepareWebsocket: false, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+			runJob: false 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+		}; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 	} 
														 | 
														
														 | 
														
															 	} 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 	/** 
														 | 
														
														 | 
														
															 	/** 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -142,9 +147,14 @@ export default class APIModule extends BaseModule { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 		socket.on("close", async () => { 
														 | 
														
														 | 
														
															 		socket.on("close", async () => { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 			if (socketId) 
														 | 
														
														 | 
														
															 			if (socketId) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-				await this._jobQueue.runJob("api", "unsubscribeAll", { 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-					socketId 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-				}); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+				await this._jobQueue.runJob( 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+					"api", 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+					"unsubscribeAll", 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+					{}, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+					{ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+						socketId 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+					} 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+				); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 		}); 
														 | 
														
														 | 
														
															 		}); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 		return { 
														 | 
														
														 | 
														
															 		return { 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -288,16 +298,18 @@ export default class APIModule extends BaseModule { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 		await Promise.all(promises); 
														 | 
														
														 | 
														
															 		await Promise.all(promises); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 	} 
														 | 
														
														 | 
														
															 	} 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-	public async subscribe( 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-		context: JobContext, 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-		payload: { channel: string; socketId?: string } 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-	) { 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-		// TODO: assert perm to join by socketId 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-		// TODO: Prevent socketId payload from outside backend 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															- 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+	public async subscribe(context: JobContext, payload: { channel: string }) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 		const { channel } = payload; 
														 | 
														
														 | 
														
															 		const { channel } = payload; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+		const [, moduleName, modelName, modelId] = 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+			/^([a-z]+)\.([a-z]+)\.([A-z0-9]+)\.?([A-z]+)?$/.exec(channel) ?? []; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+		if (moduleName === "model" && modelName && modelId) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+			await context.assertPermission( 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+				`data.${modelName}.findById.${modelId}` 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+			); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+		else await context.assertPermission(`event.${channel}`); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-		const socketId = payload.socketId ?? context.getSocketId(); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+		const socketId = context.getSocketId(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 		if (!socketId) throw new Error("No socketId specified"); 
														 | 
														
														 | 
														
															 		if (!socketId) throw new Error("No socketId specified"); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -318,11 +330,11 @@ export default class APIModule extends BaseModule { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 	public async unsubscribe( 
														 | 
														
														 | 
														
															 	public async unsubscribe( 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 		context: JobContext, 
														 | 
														
														 | 
														
															 		context: JobContext, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-		payload: { channel: string; socketId: string } 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+		payload: { channel: string } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 	) { 
														 | 
														
														 | 
														
															 	) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 		const { channel } = payload; 
														 | 
														
														 | 
														
															 		const { channel } = payload; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-		const socketId = payload.socketId ?? context.getSocketId(); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+		const socketId = context.getSocketId(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 		if (!socketId) throw new Error("No socketId specified"); 
														 | 
														
														 | 
														
															 		if (!socketId) throw new Error("No socketId specified"); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -344,11 +356,8 @@ export default class APIModule extends BaseModule { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 			}); 
														 | 
														
														 | 
														
															 			}); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 	} 
														 | 
														
														 | 
														
															 	} 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-	public async unsubscribeAll( 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-		context: JobContext, 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-		payload: { socketId: string } 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-	) { 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-		const socketId = payload.socketId ?? context.getSocketId(); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+	public async unsubscribeAll(context: JobContext) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+		const socketId = context.getSocketId(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 		if (!socketId) throw new Error("No socketId specified"); 
														 | 
														
														 | 
														
															 		if (!socketId) throw new Error("No socketId specified"); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -357,7 +366,6 @@ export default class APIModule extends BaseModule { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 				.filter(([, socketIds]) => socketIds.has(socketId)) 
														 | 
														
														 | 
														
															 				.filter(([, socketIds]) => socketIds.has(socketId)) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 				.map(([channel]) => 
														 | 
														
														 | 
														
															 				.map(([channel]) => 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 					context.executeJob("api", "unsubscribe", { 
														 | 
														
														 | 
														
															 					context.executeJob("api", "unsubscribe", { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-						socketId, 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 						channel 
														 | 
														
														 | 
														
															 						channel 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 					}) 
														 | 
														
														 | 
														
															 					}) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 				) 
														 | 
														
														 | 
														
															 				) 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -371,10 +379,14 @@ export default class APIModule extends BaseModule { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 					const promises = []; 
														 | 
														
														 | 
														
															 					const promises = []; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 					for await (const socketId of socketIds.values()) { 
														 | 
														
														 | 
														
															 					for await (const socketId of socketIds.values()) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 						promises.push( 
														 | 
														
														 | 
														
															 						promises.push( 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-							new Job("unsubscribe", "api", { 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-								socketId, 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-								channel 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-							}).execute() 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+							new Job( 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+								"unsubscribe", 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+								"api", 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+								{ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+									channel 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+								}, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+								{ socketId } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+							).execute() 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 						); 
														 | 
														
														 | 
														
															 						); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 					} 
														 | 
														
														 | 
														
															 					} 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 					return Promise.all(promises); 
														 | 
														
														 | 
														
															 					return Promise.all(promises); 
														 |