150 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			150 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | "use strict"; | ||
|  | var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||
|  |     if (k2 === undefined) k2 = k; | ||
|  |     Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); | ||
|  | }) : (function(o, m, k, k2) { | ||
|  |     if (k2 === undefined) k2 = k; | ||
|  |     o[k2] = m[k]; | ||
|  | })); | ||
|  | var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | ||
|  |     Object.defineProperty(o, "default", { enumerable: true, value: v }); | ||
|  | }) : function(o, v) { | ||
|  |     o["default"] = v; | ||
|  | }); | ||
|  | var __importStar = (this && this.__importStar) || function (mod) { | ||
|  |     if (mod && mod.__esModule) return mod; | ||
|  |     var result = {}; | ||
|  |     if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); | ||
|  |     __setModuleDefault(result, mod); | ||
|  |     return result; | ||
|  | }; | ||
|  | Object.defineProperty(exports, "__esModule", { value: true }); | ||
|  | exports.UniverseChannel = void 0; | ||
|  | const plugins = __importStar(require("./smartuniverse.plugins")); | ||
|  | const smartuniverse_classes_universemessage_1 = require("./smartuniverse.classes.universemessage"); | ||
|  | const smartuniverse_logging_1 = require("./smartuniverse.logging"); | ||
|  | /** | ||
|  |  * enables messages to stay within a certain scope. | ||
|  |  */ | ||
|  | class UniverseChannel { | ||
|  |     constructor(universeArg, channelNameArg, passphraseArg) { | ||
|  |         this.subject = new plugins.smartrx.rxjs.Subject(); | ||
|  |         this.universeRef = universeArg; | ||
|  |         this.name = channelNameArg; | ||
|  |         this.passphrase = passphraseArg; | ||
|  |     } | ||
|  |     // ======
 | ||
|  |     // STATIC
 | ||
|  |     // ======
 | ||
|  |     /** | ||
|  |      * creates new channels | ||
|  |      * @param channelArg the name of the topic | ||
|  |      * @param passphraseArg the secret thats used for a certain topic. | ||
|  |      */ | ||
|  |     static createChannel(universeArg, channelNameArg, passphraseArg) { | ||
|  |         const newChannel = new UniverseChannel(universeArg, channelNameArg, passphraseArg); | ||
|  |         universeArg.universeCache.channelMap.add(newChannel); | ||
|  |         return newChannel; | ||
|  |     } | ||
|  |     /** | ||
|  |      * returns boolean wether certain channel exists | ||
|  |      */ | ||
|  |     static async doesChannelExists(universeCacheArg, channelNameArg) { | ||
|  |         const channel = universeCacheArg.channelMap.find(channelArg => { | ||
|  |             return channelArg.name === channelNameArg; | ||
|  |         }); | ||
|  |         if (channel) { | ||
|  |             return true; | ||
|  |         } | ||
|  |         else { | ||
|  |             return false; | ||
|  |         } | ||
|  |     } | ||
|  |     /** | ||
|  |      * a static message authorization function that takes the  UniverseCache | ||
|  |      * (where messages and channels are stored and their lifetime is managed) | ||
|  |      * and the universemessage to find a fitting channel for the message | ||
|  |      * @param universeCacheArg | ||
|  |      * @param universeMessageArg | ||
|  |      */ | ||
|  |     static authorizeAMessageForAChannel(universeCacheArg, universeMessageArg) { | ||
|  |         const foundChannel = universeCacheArg.channelMap.find(universeChannel => { | ||
|  |             const result = universeChannel.authenticate(universeMessageArg); | ||
|  |             return result; | ||
|  |         }); | ||
|  |         if (foundChannel) { | ||
|  |             universeMessageArg.authenticated = true; | ||
|  |             universeMessageArg.universeChannelList.add(foundChannel); | ||
|  |             smartuniverse_logging_1.logger.log('ok', 'message authorized'); | ||
|  |             return foundChannel; | ||
|  |         } | ||
|  |         else { | ||
|  |             universeMessageArg.authenticated = false; | ||
|  |             universeMessageArg.universeChannelList.add(universeCacheArg.blackListChannel); | ||
|  |             smartuniverse_logging_1.logger.log('warn', 'message not valid'); | ||
|  |             return null; | ||
|  |         } | ||
|  |     } | ||
|  |     static getUniverseChannelByName(universeRef, universeChannelName) { | ||
|  |         return universeRef.universeCache.channelMap.find(channelArg => { | ||
|  |             return channelArg.name === universeChannelName; | ||
|  |         }); | ||
|  |     } | ||
|  |     /** | ||
|  |      * authenticates a client on the server side by matching | ||
|  |      * # the messages channelName against the unverseChannel's name | ||
|  |      * # the messages password against the universeChannel's password | ||
|  |      */ | ||
|  |     authenticate(universeMessageArg) { | ||
|  |         return (this.name === universeMessageArg.targetChannelName && | ||
|  |             this.passphrase === universeMessageArg.passphrase); | ||
|  |     } | ||
|  |     /** | ||
|  |      * pushes a message to clients | ||
|  |      * @param messageArg | ||
|  |      */ | ||
|  |     async push(messageArg) { | ||
|  |         this.subject.next(messageArg); | ||
|  |         const universeConnectionsWithChannelAccess = []; | ||
|  |         await this.universeRef.universeCache.connectionMap.forEach(async (socketConnection) => { | ||
|  |             if (socketConnection.authenticatedChannels.includes(this)) { | ||
|  |                 universeConnectionsWithChannelAccess.push(socketConnection); | ||
|  |             } | ||
|  |         }); | ||
|  |         for (const universeConnection of universeConnectionsWithChannelAccess) { | ||
|  |             const smartsocket = universeConnection.socketConnection | ||
|  |                 .smartsocketRef; | ||
|  |             const universeMessageToSend = { | ||
|  |                 id: messageArg.id, | ||
|  |                 timestamp: messageArg.timestamp, | ||
|  |                 passphrase: messageArg.passphrase, | ||
|  |                 targetChannelName: this.name, | ||
|  |                 messageText: messageArg.messageText, | ||
|  |                 payload: messageArg.payload | ||
|  |             }; | ||
|  |             smartsocket.clientCall('processMessage', universeMessageToSend, universeConnection.socketConnection); | ||
|  |         } | ||
|  |     } | ||
|  |     // functions to interact with a channel locally
 | ||
|  |     subscribe(observingFunctionArg) { | ||
|  |         return this.subject.subscribe(messageArg => { | ||
|  |             observingFunctionArg(messageArg); | ||
|  |         }, error => console.log(error)); | ||
|  |     } | ||
|  |     /** | ||
|  |      * sends a message to the channel | ||
|  |      */ | ||
|  |     async sendMessage(messageDescriptor) { | ||
|  |         const messageToSend = new smartuniverse_classes_universemessage_1.UniverseMessage({ | ||
|  |             id: plugins.smartunique.shortId(), | ||
|  |             messageText: messageDescriptor.messageText, | ||
|  |             payload: messageDescriptor.payload, | ||
|  |             targetChannelName: this.name, | ||
|  |             passphrase: this.passphrase, | ||
|  |             timestamp: Date.now() | ||
|  |         }); | ||
|  |         this.universeRef.universeCache.addMessage(messageToSend); | ||
|  |     } | ||
|  | } | ||
|  | exports.UniverseChannel = UniverseChannel; | ||
|  | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnR1bml2ZXJzZS5jbGFzc2VzLnVuaXZlcnNlY2hhbm5lbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0dW5pdmVyc2UuY2xhc3Nlcy51bml2ZXJzZWNoYW5uZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlFQUFtRDtBQUluRCxtR0FBMEU7QUFHMUUsbUVBQWlEO0FBRWpEOztHQUVHO0FBQ0gsTUFBYSxlQUFlO0lBbUYxQixZQUFZLFdBQXFCLEVBQUUsY0FBc0IsRUFBRSxhQUFxQjtRQVB4RSxZQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQXdCLENBQUM7UUFRekUsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLElBQUksR0FBRyxjQUFjLENBQUM7UUFDM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUM7SUFDbEMsQ0FBQztJQXRGRCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFFVDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLGFBQWEsQ0FDekIsV0FBcUIsRUFDckIsY0FBc0IsRUFDdEIsYUFBcUI7UUFFckIsTUFBTSxVQUFVLEdBQUcsSUFBSSxlQUFlLENBQUMsV0FBVyxFQUFFLGNBQWMsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNuRixXQUFXLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckQsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBK0IsRUFBRSxjQUFzQjtRQUMzRixNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQzVELE9BQU8sVUFBVSxDQUFDLElBQUks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
 |