Compare commits

..

22 Commits

Author SHA1 Message Date
7693b52066 1.0.41 2019-04-22 23:11:52 +02:00
30a02ae48b fix(core): update 2019-04-22 23:11:51 +02:00
241182ed2e 1.0.40 2019-04-22 22:04:53 +02:00
3d82038ec3 fix(core): update 2019-04-22 22:04:52 +02:00
300d62ed12 1.0.39 2019-04-22 13:06:02 +02:00
a5e849aa17 fix(core): update 2019-04-22 13:06:01 +02:00
83807d7c5c 1.0.38 2019-04-22 09:58:36 +02:00
39d3a0f2f8 fix(core): update 2019-04-22 09:58:36 +02:00
904a48d414 1.0.37 2019-04-12 20:50:44 +02:00
e2acb28756 1.0.36 2019-04-11 18:59:46 +02:00
92e4379bd2 fix(core): update 2019-04-11 18:59:45 +02:00
e0ce732ee1 1.0.35 2019-04-11 18:57:24 +02:00
98be0f036c fix(core): update 2019-04-11 18:57:23 +02:00
54fca17142 1.0.34 2019-04-11 18:50:43 +02:00
1a7634e8db fix(core): update 2019-04-11 18:50:43 +02:00
8830b825ac 1.0.33 2019-04-11 18:32:36 +02:00
123324bf43 fix(core): update 2019-04-11 18:32:36 +02:00
4761ff31cf 1.0.32 2019-04-11 18:31:21 +02:00
430c3ea13a fix(core): update 2019-04-11 18:31:21 +02:00
6dd3782b0d 1.0.31 2019-04-11 18:16:14 +02:00
06aa721247 1.0.30 2019-04-11 17:52:02 +02:00
f728c56016 fix(core): update 2019-04-11 17:52:01 +02:00
18 changed files with 269 additions and 114 deletions

21
package-lock.json generated
View File

@ -1,6 +1,6 @@
{ {
"name": "@pushrocks/smartuniverse", "name": "@pushrocks/smartuniverse",
"version": "1.0.29", "version": "1.0.41",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
@ -386,6 +386,17 @@
"luxon": "^1.12.1" "luxon": "^1.12.1"
} }
}, },
"@pushrocks/smartunique": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/@pushrocks/smartunique/-/smartunique-3.0.1.tgz",
"integrity": "sha512-xBu9ZB4C0BA0S/pbFFZn2ItPfnodPKpzrYIq1yN5XDs6OaookwcDF/iBwfS9+EYMSPENC9wAsOxg2RGMm4Qicw==",
"requires": {
"@types/shortid": "^0.0.29",
"@types/uuid": "^3.0.0",
"shortid": "^2.2.8",
"uuid": "^3.1.0"
}
},
"@pushrocks/tapbundle": { "@pushrocks/tapbundle": {
"version": "3.0.9", "version": "3.0.9",
"resolved": "https://verdaccio.lossless.one/@pushrocks%2ftapbundle/-/tapbundle-3.0.9.tgz", "resolved": "https://verdaccio.lossless.one/@pushrocks%2ftapbundle/-/tapbundle-3.0.9.tgz",
@ -566,6 +577,14 @@
"@types/node": "*" "@types/node": "*"
} }
}, },
"@types/uuid": {
"version": "3.4.4",
"resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.4.tgz",
"integrity": "sha512-tPIgT0GUmdJQNSHxp0X2jnpQfBSTfGxUMc/2CXBU2mnyTFVYVa2ojpoQ74w0U2yn2vw3jnC640+77lkFFpdVDw==",
"requires": {
"@types/node": "*"
}
},
"@types/vinyl": { "@types/vinyl": {
"version": "2.0.3", "version": "2.0.3",
"resolved": "https://verdaccio.lossless.one/@types%2fvinyl/-/vinyl-2.0.3.tgz", "resolved": "https://verdaccio.lossless.one/@types%2fvinyl/-/vinyl-2.0.3.tgz",

View File

@ -1,6 +1,6 @@
{ {
"name": "@pushrocks/smartuniverse", "name": "@pushrocks/smartuniverse",
"version": "1.0.29", "version": "1.0.41",
"private": false, "private": false,
"description": "messaging service for your micro services", "description": "messaging service for your micro services",
"main": "dist/index.js", "main": "dist/index.js",
@ -33,6 +33,7 @@
"@pushrocks/smartrequest": "^1.1.14", "@pushrocks/smartrequest": "^1.1.14",
"@pushrocks/smartrx": "^2.0.3", "@pushrocks/smartrx": "^2.0.3",
"@pushrocks/smartsocket": "^1.1.27", "@pushrocks/smartsocket": "^1.1.27",
"@pushrocks/smarttime": "^3.0.7" "@pushrocks/smarttime": "^3.0.7",
"@pushrocks/smartunique": "^3.0.1"
} }
} }

View File

@ -1,13 +1,16 @@
# @pushrocks/smartuniverse # @pushrocks/smartuniverse
messaging service for micro services messaging service for micro services
## Availabililty and Links ## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@pushrocks/smartuniverse)
* [gitlab.com (source)](https://gitlab.com/pushrocks/smartuniverse) - [npmjs.org (npm package)](https://www.npmjs.com/package/@pushrocks/smartuniverse)
* [github.com (source mirror)](https://github.com/pushrocks/smartuniverse) - [gitlab.com (source)](https://gitlab.com/pushrocks/smartuniverse)
* [docs (typedoc)](https://pushrocks.gitlab.io/smartuniverse/) - [github.com (source mirror)](https://github.com/pushrocks/smartuniverse)
- [docs (typedoc)](https://pushrocks.gitlab.io/smartuniverse/)
## Status for master ## Status for master
[![build status](https://gitlab.com/pushrocks/smartuniverse/badges/master/build.svg)](https://gitlab.com/pushrocks/smartuniverse/commits/master) [![build status](https://gitlab.com/pushrocks/smartuniverse/badges/master/build.svg)](https://gitlab.com/pushrocks/smartuniverse/commits/master)
[![coverage report](https://gitlab.com/pushrocks/smartuniverse/badges/master/coverage.svg)](https://gitlab.com/pushrocks/smartuniverse/commits/master) [![coverage report](https://gitlab.com/pushrocks/smartuniverse/badges/master/coverage.svg)](https://gitlab.com/pushrocks/smartuniverse/commits/master)
[![npm downloads per month](https://img.shields.io/npm/dm/@pushrocks/smartuniverse.svg)](https://www.npmjs.com/package/@pushrocks/smartuniverse) [![npm downloads per month](https://img.shields.io/npm/dm/@pushrocks/smartuniverse.svg)](https://www.npmjs.com/package/@pushrocks/smartuniverse)
@ -20,9 +23,34 @@ messaging service for micro services
Use TypeScript for best in class instellisense. Use TypeScript for best in class instellisense.
### What is smartuniverse all about?
Think WhatsApp, but for your microservices architecture. It allows your services to securely talk to each other in **private, shielded channels** without having to expose anything to the outside world. This allows the use of **reactive programming across your entire stack**.
### Server side
every universe has a server that manages messages.
Think Kafka, but without Kafka.
```typescript
import * as smartuniverse from '@pushrocks/smartuniverse';
const myUniverse = new smartuniverse.Universe({
messageExpiryInMilliseconds: 60000 // the standard time in milliseconds until a message expires
});
// create as many channels as you like
myUniverse.addChannel('awesomeChannel', 'awesomeChannelPass');
myUniverse.addChannel('awesomeChannel2', 'jhkjhfsdf87eerkjslkfja9');
myUniverse.start(8765); // start the server and provide the port on which to listen on
```
### Client side
All your microservices represents clients in the universe that may talk to each other using the universe server.
For further information read the linked docs at the top of this readme. For further information read the linked docs at the top of this readme.
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh) > MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html) > | By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
[![repo-footer](https://pushrocks.gitlab.io/assets/repo-footer.svg)](https://maintainedby.lossless.com) [![repo-footer](https://pushrocks.gitlab.io/assets/repo-footer.svg)](https://maintainedby.lossless.com)

View File

@ -5,9 +5,14 @@ import * as smartuniverse from '../ts/index';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
let testUniverse: smartuniverse.Universe; let testUniverse: smartuniverse.Universe;
let testUniverseClient: smartuniverse.ClientUniverse; let testClientUniverse: smartuniverse.ClientUniverse;
let testClientChannel: smartuniverse.ClientUniverseChannel; let testClientChannel: smartuniverse.ClientUniverseChannel;
const testChannelData = {
channelName: 'awesomeTestChannel',
channelPass: 'awesomeChannelPAss'
};
tap.test('first test', async () => { tap.test('first test', async () => {
testUniverse = new smartuniverse.Universe({ testUniverse = new smartuniverse.Universe({
messageExpiryInMilliseconds: 1000 messageExpiryInMilliseconds: 1000
@ -15,15 +20,15 @@ tap.test('first test', async () => {
}); });
tap.test('add a message to the SmartUniverse', async () => { tap.test('add a message to the SmartUniverse', async () => {
await testUniverse.initServer(8765); await testUniverse.start(8765);
}); });
// testing message handling // testing message handling
tap.test('create smartuniverse client', async () => { tap.test('create smartuniverse client', async () => {
testUniverseClient = new smartuniverse.ClientUniverse({ testClientUniverse = new smartuniverse.ClientUniverse({
serverAddress: 'http://localhost:8765' serverAddress: 'http://localhost:8765'
}); });
expect(testUniverseClient).to.be.instanceof(smartuniverse.ClientUniverse); expect(testClientUniverse).to.be.instanceof(smartuniverse.ClientUniverse);
}); });
tap.test('should add a channel to the universe', async () => { tap.test('should add a channel to the universe', async () => {
@ -31,20 +36,21 @@ tap.test('should add a channel to the universe', async () => {
}); });
tap.test('should get a observable correctly', async () => { tap.test('should get a observable correctly', async () => {
testClientChannel = await testUniverseClient.getChannel('testChannel'); testClientChannel = await testClientUniverse.getChannel(testChannelData.channelName);
expect(testClientChannel).to.be.instanceof(smartuniverse.ClientUniverseChannel); expect(testClientChannel).to.be.instanceof(smartuniverse.ClientUniverseChannel);
}); });
tap.test('should send a message correctly', async () => { tap.test('should send a message correctly', async () => {
await testUniverseClient.sendMessage('greeting', { await testClientUniverse.sendMessage({
anyBool: true messageText: 'hello',
targetChannelName: 'channel1'
}); });
}); });
tap.test('should receive a message correctly', async () => {}); tap.test('should receive a message correctly', async () => {});
tap.test('should disconnect the client correctly', async () => { tap.test('should disconnect the client correctly', async () => {
testUniverseClient.close(); testClientUniverse.close();
}); });
tap.test('should end the server correctly', async tools => { tap.test('should end the server correctly', async tools => {

View File

@ -7,4 +7,5 @@ export * from './smartuniverse.classes.universe';
export * from './smartuniverse.classes.universecache'; export * from './smartuniverse.classes.universecache';
export * from './smartuniverse.classes.universechannel'; export * from './smartuniverse.classes.universechannel';
export * from './smartuniverse.classes.universemessage'; export * from './smartuniverse.classes.universemessage';
export * from './smartuniverse.interfaces';
export * from './interfaces';

View File

@ -0,0 +1,15 @@
export interface IServerGetMessagesRequestBody {
channel: string;
topic?: string;
youngerThan: number;
}
/**
* the interface for a standard request
*/
export interface IServerPutMessageRequestBody {
channel: string;
passphrase: string;
message: string;
payload: any;
}

3
ts/interfaces/index.ts Normal file
View File

@ -0,0 +1,3 @@
export * from './http.interfaces';
export * from './universechannel.interfaces';
export * from './universemessage.interfaces';

View File

@ -0,0 +1 @@
export interface IUniverseChannel {}

View File

@ -0,0 +1,15 @@
export interface IMessageCreator {
messageText: string;
payload?: string | number | any;
payloadStringType?: 'Buffer' | 'string' | 'object';
targetChannelName: string;
}
export interface IUniverseMessage extends IMessageCreator {
id: string;
/**
* time of creation
*/
timestamp: number;
passphrase: string;
}

View File

@ -5,10 +5,10 @@ import { Observable } from 'rxjs';
import { Smartsocket, SmartsocketClient } from '@pushrocks/smartsocket'; import { Smartsocket, SmartsocketClient } from '@pushrocks/smartsocket';
import * as url from 'url'; import * as url from 'url';
import * as interfaces from './interfaces';
import { import {
ClientUniverseChannel, ClientUniverseChannel,
IServerGetMessagesRequestBody,
IServerPutMessageRequestBody,
UniverseMessage UniverseMessage
} from './'; } from './';
@ -31,32 +31,62 @@ export class ClientUniverse {
this.options = optionsArg; this.options = optionsArg;
} }
public async sendMessage(messageArg, payloadArg) { /**
const requestBody = { * adds a channel to the channelcache
message: messageArg, * TODO: verify channel before adding it to the channel cache
payload: payloadArg */
}; public async addChannel (channelNameArg: string, passphraseArg: string) {
// TODO: User websocket connection if available const existingChannel = this.getChannel(channelNameArg);
await plugins.smartrequest.postJson(this.options.serverAddress, {
requestBody if (existingChannel) {
}); throw new Error('channel exists');
}
// lets create the channel
ClientUniverseChannel.createClientUniverseChannel(
this,
channelNameArg,
passphraseArg
);
} }
/**
* gets a channel from the channelcache
* @param channelName
* @param passphraseArg
*/
public async getChannel(channelName: string): Promise<ClientUniverseChannel> { public async getChannel(channelName: string): Promise<ClientUniverseChannel> {
await this.checkConnection(); await this.checkConnection();
const clientUniverseChannel = await ClientUniverseChannel.createClientUniverseChannel( const clientUniverseChannel = this.channelCache.find(channel => {
this, return channel.name === channelName;
channelName })
);
this.channelCache.add(clientUniverseChannel);
return clientUniverseChannel; return clientUniverseChannel;
} }
public async sendMessage(messageArg: interfaces.IMessageCreator) {
const requestBody: interfaces.IUniverseMessage = {
id: plugins.smartunique.shortId(),
timestamp: Date.now(),
passphrase: (await this.getChannel(messageArg.targetChannelName)).passphrase,
...messageArg,
};
const requestBodyString = JSON.stringify(requestBody);
// TODO: User websocket connection if available
const response = await plugins.smartrequest.postJson(`${this.options.serverAddress}/sendmessage` , {
requestBody: requestBodyString
});
}
public close() { public close() {
this.socketClient.disconnect(); this.socketClient.disconnect();
} }
private async checkConnection() { /**
* checks the connection towards a universe server
* since password validation is done through other means, a connection should always be possible
*/
private async checkConnection(): Promise<void> {
if (!this.socketClient && !this.observableIntake) { if (!this.socketClient && !this.observableIntake) {
const parsedURL = url.parse(this.options.serverAddress); const parsedURL = url.parse(this.options.serverAddress);
this.socketClient = new SmartsocketClient({ this.socketClient = new SmartsocketClient({

View File

@ -1,17 +1,26 @@
import * as plugins from './smartuniverse.plugins'; import * as plugins from './smartuniverse.plugins';
import * as interfaces from './interfaces';
import { ClientUniverse, IUniverseChannel } from './'; import { ClientUniverse } from './';
export class ClientUniverseChannel implements IUniverseChannel { export class ClientUniverseChannel implements interfaces.IUniverseChannel {
// ====== // ======
// STATIC // STATIC
// ====== // ======
/**
* creates a channel and adds it to the cache of clientUniverseArg
* @param clientUniverseArg
* @param channelNameArg
* @param passphraseArg
*/
public static async createClientUniverseChannel( public static async createClientUniverseChannel(
clientUniverseArg: ClientUniverse, clientUniverseArg: ClientUniverse,
channelName: string channelNameArg: string,
passphraseArg: string
): Promise<ClientUniverseChannel> { ): Promise<ClientUniverseChannel> {
const clientChannel = new ClientUniverseChannel(clientUniverseArg); const clientChannel = new ClientUniverseChannel(clientUniverseArg, channelNameArg, passphraseArg);
await clientChannel.transmitSubscription(); clientUniverseArg.channelCache.add(clientChannel);
await clientChannel.subscribe();
return clientChannel; return clientChannel;
} }
@ -19,16 +28,24 @@ export class ClientUniverseChannel implements IUniverseChannel {
// INSTANCE // INSTANCE
// ======== // ========
// properties
public name: string;
public passphrase: string;
// refs
public clientUniverse: ClientUniverse; public clientUniverse: ClientUniverse;
constructor(clientUniverseArg: ClientUniverse) { constructor(clientUniverseArg: ClientUniverse, nameArg: string, passphraseArg: string) {
this.clientUniverse = clientUniverseArg; this.clientUniverse = clientUniverseArg;
this.name = nameArg;
this.passphrase = passphraseArg;
} }
/** /**
* subscribes to a channel
* tells the universe about this instances interest into a channel * tells the universe about this instances interest into a channel
*/ */
public async transmitSubscription() { public async subscribe() {
this.clientUniverse.socketClient; this.clientUniverse.socketClient;
} }
} }

View File

@ -1,15 +1,32 @@
import * as plugins from './smartuniverse.plugins'; import * as plugins from './smartuniverse.plugins';
import { IUniverseMessage } from './'; import * as interfaces from './interfaces';
export class ClientUniverseMessage implements IUniverseMessage { export class ClientUniverseMessage implements interfaces.IUniverseMessage {
// ====== // ======
// STATIC // STATIC
// ====== // ======
createMessage(messageArg: string, payloadArg: any) {} public static createMessageFromPayload(messageDescriptor: interfaces.IUniverseMessage) {
};
// ======== // ========
// INSTANCE // INSTANCE
// ======== // ========
public id: string;
public timestamp: number;
public smartTimestamp: plugins.smarttime.TimeStamp;
public messageText: string;
public passphrase: string;
public payload: any;
public payloadStringType;
public targetChannelName: string;
constructor(messageArg, payloadArg) {} constructor(messageArg, payloadArg) {}
getAsJsonForPayload () {
}
} }

View File

@ -5,25 +5,13 @@ import { UniverseCache, UniverseChannel, UniverseMessage } from './';
import * as paths from './smartuniverse.paths'; import * as paths from './smartuniverse.paths';
import * as interfaces from './interfaces';
export interface ISmartUniverseConstructorOptions { export interface ISmartUniverseConstructorOptions {
messageExpiryInMilliseconds: number; messageExpiryInMilliseconds: number;
} }
export interface IServerGetMessagesRequestBody {
channel: string;
topic?: string;
youngerThan: number;
}
/**
* the interface for a standard request
*/
export interface IServerPutMessageRequestBody {
channel: string;
passphrase: string;
message: string;
payload: any;
}
/** /**
* main class that setsup a Universe * main class that setsup a Universe
@ -35,9 +23,16 @@ export class Universe {
// options // options
private options: ISmartUniverseConstructorOptions; private options: ISmartUniverseConstructorOptions;
// Store version handling /**
* stores the version of the universe server running
* this is done since the version is exposed through the api and multiple fs actions are avoided this way.
*/
private universeVersionStore: string; private universeVersionStore: string;
private get universeVersion() {
/**
* get the currently running version of smartuniverse
*/
public get universeVersion() {
if (this.universeVersionStore) { if (this.universeVersionStore) {
return this.universeVersionStore; return this.universeVersionStore;
} else { } else {
@ -47,7 +42,14 @@ export class Universe {
} }
} }
/**
* the smartexpress server used
*/
private smartexpressServer: plugins.smartexpress.Server; private smartexpressServer: plugins.smartexpress.Server;
/**
* the smartsocket used
*/
private smartsocket: plugins.smartsocket.Smartsocket; private smartsocket: plugins.smartsocket.Smartsocket;
constructor(optionsArg: ISmartUniverseConstructorOptions) { constructor(optionsArg: ISmartUniverseConstructorOptions) {
@ -59,14 +61,14 @@ export class Universe {
* adds a channel to the Universe * adds a channel to the Universe
*/ */
public async addChannel(nameArg: string, passphraseArg: string) { public async addChannel(nameArg: string, passphraseArg: string) {
const newChannel = new UniverseChannel(this.universeCache, nameArg, passphraseArg); const newChannel = UniverseChannel.createChannel(this.universeCache, nameArg, passphraseArg);
this.universeCache.channelMap.add(newChannel);
} }
/** /**
* initiates a server * initiates a server
*/ */
public async initServer(portArg: number | string) { public async start(portArg: number | string) {
// lets create the base smartexpress server
this.smartexpressServer = new plugins.smartexpress.Server({ this.smartexpressServer = new plugins.smartexpress.Server({
cors: true, cors: true,
defaultAnswer: async () => { defaultAnswer: async () => {
@ -76,31 +78,47 @@ export class Universe {
port: portArg port: portArg
}); });
// lets create the http request route
this.smartexpressServer.addRoute('/sendmessage', new Handler('POST', async (req, res) => {
const universeMessageInstance = new UniverseMessage(req.body);
this.universeCache.addMessage(universeMessageInstance);
}));
// add websocket upgrade // add websocket upgrade
this.smartsocket = new plugins.smartsocket.Smartsocket({ this.smartsocket = new plugins.smartsocket.Smartsocket({
port: 12345 // fix this within smartsocket port: 12345 // fix this within smartsocket
}); });
// add a role for the clients
const ClientRole = new plugins.smartsocket.SocketRole({ const ClientRole = new plugins.smartsocket.SocketRole({
name: 'clientuniverse', name: 'clientuniverse',
passwordHash: 'clientuniverse' // authentication happens on another level passwordHash: 'clientuniverse' // authentication happens on another level
}); });
// add the role to smartsocket
this.smartsocket.addSocketRoles([ClientRole]); this.smartsocket.addSocketRoles([ClientRole]);
const SubscriptionSocketFunction = new plugins.smartsocket.SocketFunction({ const SubscriptionSocketFunction = new plugins.smartsocket.SocketFunction({
allowedRoles: [ClientRole], allowedRoles: [ClientRole],
funcName: 'channelSubscription', funcName: 'channelSubscription',
funcDef: () => {} funcDef: () => {
console.log('a client connected');
} // TODO: implement an action upon connection of clients
}); });
// add smartsocket to the running smartexpress app
this.smartsocket.setExternalServer('express', this.smartexpressServer as any); this.smartsocket.setExternalServer('express', this.smartexpressServer as any);
// should work with express as well
// start the socket
this.smartsocket.start(); this.smartsocket.start();
// start the smartexpress instance
await this.smartexpressServer.start(); await this.smartexpressServer.start();
} }
/**
* stop everything
*/
public async stopServer() { public async stopServer() {
await this.smartsocket.stop(); await this.smartsocket.stop();
await this.smartexpressServer.stop(); await this.smartexpressServer.stop();

View File

@ -39,7 +39,7 @@ export class UniverseCache {
} }
/** /**
* add a message to the UniverseStore * add a message to the UniverseCache
* @param messageArg * @param messageArg
* @param attachedPayloadArg * @param attachedPayloadArg
*/ */
@ -50,12 +50,12 @@ export class UniverseCache {
} }
/** /**
* Read a message from the UniverseStore * Read a message from the UniverseCache
*/ */
public readMessagesYoungerThan(unixTimeArg?: number): Observable<UniverseMessage> { public readMessagesYoungerThan(unixTimeArg?: number): Observable<UniverseMessage> {
const messageObservable = from(this.messageMap.getArray()).pipe( const messageObservable = from(this.messageMap.getArray()).pipe(
filter(messageArg => { filter(messageArg => {
return messageArg.timestamp.isYoungerThanMilliSeconds(this.destructionTime); return messageArg.smartTimestamp.isYoungerThanMilliSeconds(this.destructionTime);
}) })
); );
return messageObservable; return messageObservable;

View File

@ -23,6 +23,7 @@ export class UniverseChannel {
passphraseArg: string passphraseArg: string
) { ) {
const newChannel = new UniverseChannel(universeCacheArg, channelNameArg, passphraseArg); const newChannel = new UniverseChannel(universeCacheArg, channelNameArg, passphraseArg);
universeCacheArg.channelMap.add(newChannel);
return newChannel; return newChannel;
} }
@ -82,8 +83,8 @@ export class UniverseChannel {
*/ */
public authenticate(universeMessageArg: UniverseMessage): boolean { public authenticate(universeMessageArg: UniverseMessage): boolean {
return ( return (
this.name === universeMessageArg.requestedChannelName && this.name === universeMessageArg.targetChannelName &&
this.passphrase === universeMessageArg.requestedChannelPassphrase this.passphrase === universeMessageArg.passphrase
); );
} }

View File

@ -1,4 +1,5 @@
import * as plugins from './smartuniverse.plugins'; import * as plugins from './smartuniverse.plugins';
import * as interfaces from './interfaces';
import { Objectmap } from '@pushrocks/lik'; import { Objectmap } from '@pushrocks/lik';
@ -6,31 +7,30 @@ import { Timer, TimeStamp } from '@pushrocks/smarttime';
import { Universe } from './smartuniverse.classes.universe'; import { Universe } from './smartuniverse.classes.universe';
import { UniverseChannel } from './smartuniverse.classes.universechannel'; import { UniverseChannel } from './smartuniverse.classes.universechannel';
import { UniverseCache } from './smartuniverse.classes.universecache'; import { UniverseCache } from './smartuniverse.classes.universecache';
import { IUniverseMessage } from './interfaces';
/** /**
* represents a message within a universe * represents a message within a universe
* acts as a container to save message states like authentication status * acts as a container to save message states like authentication status
*/ */
export class UniverseMessage { export class UniverseMessage implements interfaces.IUniverseMessage {
/**
* public and unique id public id: string;
* numeric ascending
* adheres to time in milliseconds public timestamp: number;
* avoids duplications though public smartTimestamp: TimeStamp;
*/
public id: number; public messageText: string;
public passphrase: string;
public payload: any;
public payloadStringType;
public targetChannelName: string;
/** /**
* the UniverseCache the message is attached to * the UniverseCache the message is attached to
*/ */
public universeCache: UniverseCache; public universeCache: UniverseCache;
/**
* requestedChannelName
*/
public requestedChannelName: string;
public requestedChannelPassphrase: string;
/** /**
* enables unprotected grouping of messages for efficiency purposes. * enables unprotected grouping of messages for efficiency purposes.
*/ */
@ -40,21 +40,10 @@ export class UniverseMessage {
* wether the message is authenticated * wether the message is authenticated
*/ */
public authenticated: boolean = null; public authenticated: boolean = null;
/** /**
* time of creation * a destruction timer for this message
*/ */
public timestamp: TimeStamp;
/**
* the actual message
*/
public message: string;
/**
* any attached payloads. Can be of binary format.
*/
public attachedPayload: any;
public destructionTimer: Timer; // a timer to take care of message destruction public destructionTimer: Timer; // a timer to take care of message destruction
/** /**
@ -62,17 +51,12 @@ export class UniverseMessage {
* @param messageArg * @param messageArg
* @param attachedPayloadArg * @param attachedPayloadArg
*/ */
constructor( constructor(messageDescriptor: IUniverseMessage) {
messageArg: string, this.smartTimestamp = new TimeStamp(this.timestamp);
requestedChannelNameArg: string, this.messageText = messageDescriptor.messageText;
passphraseArg: string, this.targetChannelName = messageDescriptor.targetChannelName;
attachedPayloadArg: any this.passphrase = messageDescriptor.passphrase;
) { this.payload = messageDescriptor.payload;
this.timestamp = new TimeStamp();
this.message = messageArg;
this.requestedChannelName = requestedChannelNameArg;
this.requestedChannelPassphrase = passphraseArg;
this.attachedPayload = attachedPayloadArg;
// prevent memory issues // prevent memory issues
this.fallBackDestruction(); this.fallBackDestruction();
} }
@ -98,7 +82,7 @@ export class UniverseMessage {
/** /**
* handles bad messages for further analysis * handles bad messages for further analysis
*/ */
handleAsBadMessage() { public handleAsBadMessage() {
console.log('received a bad message'); console.log('received a bad message');
} }

View File

@ -1,3 +0,0 @@
export interface IUniverseChannel {}
export interface IUniverseMessage {}

View File

@ -14,6 +14,7 @@ import * as smartrequest from '@pushrocks/smartrequest';
import * as smartrx from '@pushrocks/smartrx'; import * as smartrx from '@pushrocks/smartrx';
import * as smartsocket from '@pushrocks/smartsocket'; import * as smartsocket from '@pushrocks/smartsocket';
import * as smarttime from '@pushrocks/smarttime'; import * as smarttime from '@pushrocks/smarttime';
import * as smartunique from '@pushrocks/smartunique';
export { export {
lik, lik,
@ -25,5 +26,6 @@ export {
smartrx, smartrx,
smartrequest, smartrequest,
smartsocket, smartsocket,
smarttime smarttime,
smartunique
}; };