smartuniverse/ts/smartuniverse.classes.universemessage.ts

120 lines
3.1 KiB
TypeScript
Raw Normal View History

2018-03-13 05:15:40 +00:00
import * as plugins from './smartuniverse.plugins';
2019-04-11 16:50:43 +00:00
import * as interfaces from './interfaces';
2018-03-13 05:15:40 +00:00
2019-01-31 01:52:18 +00:00
import { Objectmap } from '@pushrocks/lik';
2019-01-31 01:52:18 +00:00
import { Timer, TimeStamp } from '@pushrocks/smarttime';
2018-05-23 22:14:57 +00:00
import { Universe } from './smartuniverse.classes.universe';
import { UniverseChannel } from './smartuniverse.classes.universechannel';
import { UniverseCache } from './smartuniverse.classes.universecache';
2018-03-13 05:15:40 +00:00
2018-04-13 13:45:48 +00:00
/**
* represents a message within a universe
* acts as a container to save message states like authentication status
2018-04-13 13:45:48 +00:00
*/
2019-04-11 16:50:43 +00:00
export class UniverseMessage implements interfaces.IUniverseMessage {
2018-03-13 05:15:40 +00:00
/**
* public and unique id
* numeric ascending
* adheres to time in milliseconds
2019-04-11 16:57:23 +00:00
* -> meaning it describes the time of arrival
* -> two messages received at the same time will count up the second one
* -> avoids duplications of messages
* -> may be changed to nanoseconds to ensure higher throughput
2018-03-13 05:15:40 +00:00
*/
public id: number;
2018-05-07 16:50:07 +00:00
/**
* the UniverseCache the message is attached to
2018-05-07 16:50:07 +00:00
*/
public universeCache: UniverseCache;
/**
* requestedChannelName
*/
public requestedChannelName: string;
public requestedChannelPassphrase: string;
2018-05-19 22:41:59 +00:00
/**
* enables unprotected grouping of messages for efficiency purposes.
*/
public universeChannelList = new Objectmap<UniverseChannel>();
/**
* wether the message is authenticated
*/
public authenticated: boolean = null;
2018-05-07 16:50:07 +00:00
/**
* time of creation
*/
public timestamp: TimeStamp;
/**
2018-05-19 22:41:59 +00:00
* the actual message
2018-05-07 16:50:07 +00:00
*/
2018-05-19 22:41:59 +00:00
public message: string;
/**
* any attached payloads. Can be of binary format.
*/
public attachedPayload: any;
2018-04-29 12:17:26 +00:00
public destructionTimer: Timer; // a timer to take care of message destruction
2018-03-13 05:15:40 +00:00
2018-04-29 12:17:26 +00:00
/**
* the constructor to create a universe message
2018-05-07 16:50:07 +00:00
* @param messageArg
* @param attachedPayloadArg
2018-04-29 12:17:26 +00:00
*/
constructor(
messageArg: string,
requestedChannelNameArg: string,
passphraseArg: string,
attachedPayloadArg: any
) {
2018-03-13 05:15:40 +00:00
this.timestamp = new TimeStamp();
this.message = messageArg;
this.requestedChannelName = requestedChannelNameArg;
this.requestedChannelPassphrase = passphraseArg;
2018-03-13 05:15:40 +00:00
this.attachedPayload = attachedPayloadArg;
// prevent memory issues
2018-05-19 22:41:59 +00:00
this.fallBackDestruction();
}
public setUniverseCache(universeCacheArg: UniverseCache) {
this.universeCache = universeCacheArg;
2018-05-19 22:41:59 +00:00
}
2018-05-23 21:50:45 +00:00
public setDestructionTimer(selfdestructAfterArg: number) {
2018-05-19 22:41:59 +00:00
if (selfdestructAfterArg) {
this.destructionTimer = new Timer(selfdestructAfterArg);
this.destructionTimer.start();
2018-03-13 05:15:40 +00:00
// set up self destruction by removing this from the parent messageCache
2018-05-19 22:41:59 +00:00
this.destructionTimer.completed.then(async () => {
this.universeCache.messageMap.remove(this);
2018-05-19 22:41:59 +00:00
});
} else {
this.fallBackDestruction();
}
2018-05-23 21:50:45 +00:00
}
2018-05-19 22:41:59 +00:00
/**
* handles bad messages for further analysis
*/
handleAsBadMessage() {
console.log('received a bad message');
}
2018-05-19 22:41:59 +00:00
/**
2018-05-23 21:50:45 +00:00
* prevents memory leaks if channels have no default
2018-05-19 22:41:59 +00:00
*/
2018-05-23 21:50:45 +00:00
private fallBackDestruction() {
2018-05-19 22:41:59 +00:00
plugins.smartdelay.delayFor(1000).then(() => {
if (!this.destructionTimer) {
this.setDestructionTimer(6000);
}
2018-03-20 07:16:54 +00:00
});
2018-03-13 05:15:40 +00:00
}
}