Compare commits
19 Commits
Author | SHA1 | Date | |
---|---|---|---|
f6985bd7b2 | |||
241e44e19d | |||
99561166e2 | |||
0e95774f30 | |||
011af15866 | |||
77a13786d1 | |||
d0e4c1c44a | |||
1c8d6bf96e | |||
95c5fb7e83 | |||
2165a8f677 | |||
aa52ceeeca | |||
78e57394c9 | |||
5f9f670546 | |||
4cac5c1b1c | |||
8d6c8494c4 | |||
3fb7375a42 | |||
c64a72ea9d | |||
c8c481fda0 | |||
bafa94c6ac |
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,5 +1,6 @@
|
|||||||
.nogit/
|
.nogit/
|
||||||
node_modules/
|
node_modules/
|
||||||
|
dist/
|
||||||
coverage/
|
coverage/
|
||||||
public/
|
public/
|
||||||
pages/
|
pages/
|
||||||
|
2
dist/index.d.ts
vendored
2
dist/index.d.ts
vendored
@ -1,2 +0,0 @@
|
|||||||
export * from './smartuniverse.classes.universe';
|
|
||||||
export * from './smartuniverse.classes.universeclient';
|
|
8
dist/index.js
vendored
8
dist/index.js
vendored
@ -1,8 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
function __export(m) {
|
|
||||||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
|
|
||||||
}
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
__export(require("./smartuniverse.classes.universe"));
|
|
||||||
__export(require("./smartuniverse.classes.universeclient"));
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHNEQUFpRDtBQUNqRCw0REFBdUQifQ==
|
|
3
dist/smartuniverse.classes.manager.d.ts
vendored
3
dist/smartuniverse.classes.manager.d.ts
vendored
@ -1,3 +0,0 @@
|
|||||||
export declare class UniverseManager {
|
|
||||||
registerMember(): Promise<void>;
|
|
||||||
}
|
|
18
dist/smartuniverse.classes.manager.js
vendored
18
dist/smartuniverse.classes.manager.js
vendored
@ -1,18 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
||||||
return new (P || (P = Promise))(function (resolve, reject) {
|
|
||||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
||||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
||||||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
|
||||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
||||||
});
|
|
||||||
};
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
class UniverseManager {
|
|
||||||
registerMember() {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.UniverseManager = UniverseManager;
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnR1bml2ZXJzZS5jbGFzc2VzLm1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydHVuaXZlcnNlLmNsYXNzZXMubWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBSUE7SUFFZSxjQUFjOztRQUUzQixDQUFDO0tBQUE7Q0FDRjtBQUxELDBDQUtDIn0=
|
|
26
dist/smartuniverse.classes.universe.d.ts
vendored
26
dist/smartuniverse.classes.universe.d.ts
vendored
@ -1,26 +0,0 @@
|
|||||||
import { UniverseManager } from './smartuniverse.classes.manager';
|
|
||||||
import { UniverseStore } from './smartuniverse.classes.universestore';
|
|
||||||
export interface ISmartUniverseConstructorOptions {
|
|
||||||
messageExpiryInMilliseconds: number;
|
|
||||||
}
|
|
||||||
export interface IServerGetMessagesRequestBody {
|
|
||||||
youngerThan: number;
|
|
||||||
}
|
|
||||||
export interface IServerPutMessageRequestBody {
|
|
||||||
message: string;
|
|
||||||
payload: any;
|
|
||||||
}
|
|
||||||
export declare class Universe {
|
|
||||||
universeStore: UniverseStore;
|
|
||||||
universeManager: UniverseManager;
|
|
||||||
private options;
|
|
||||||
private universeVersionStore;
|
|
||||||
private readonly universeVersion;
|
|
||||||
private smartexpressServer;
|
|
||||||
constructor(optionsArg: ISmartUniverseConstructorOptions);
|
|
||||||
/**
|
|
||||||
* initiates a server
|
|
||||||
*/
|
|
||||||
initServer(portArg: number | string): Promise<void>;
|
|
||||||
stopServer(): Promise<void>;
|
|
||||||
}
|
|
69
dist/smartuniverse.classes.universe.js
vendored
69
dist/smartuniverse.classes.universe.js
vendored
@ -1,69 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
||||||
return new (P || (P = Promise))(function (resolve, reject) {
|
|
||||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
||||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
||||||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
|
||||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
||||||
});
|
|
||||||
};
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
const plugins = require("./smartuniverse.plugins");
|
|
||||||
const smartexpress_1 = require("smartexpress");
|
|
||||||
const smartuniverse_classes_manager_1 = require("./smartuniverse.classes.manager");
|
|
||||||
const smartuniverse_classes_universestore_1 = require("./smartuniverse.classes.universestore");
|
|
||||||
const paths = require("./smartuniverse.paths");
|
|
||||||
class Universe {
|
|
||||||
get universeVersion() {
|
|
||||||
if (this.universeVersionStore) {
|
|
||||||
return this.universeVersionStore;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
const packageJson = plugins.smartfile.fs.toObjectSync(paths.packageJson);
|
|
||||||
this.universeVersionStore = packageJson.version;
|
|
||||||
return this.universeVersionStore;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
constructor(optionsArg) {
|
|
||||||
this.options = optionsArg;
|
|
||||||
this.universeStore = new smartuniverse_classes_universestore_1.UniverseStore(this.options.messageExpiryInMilliseconds);
|
|
||||||
this.universeManager = new smartuniverse_classes_manager_1.UniverseManager();
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* initiates a server
|
|
||||||
*/
|
|
||||||
initServer(portArg) {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
this.smartexpressServer = new plugins.smartexpress.Server({
|
|
||||||
cors: true,
|
|
||||||
defaultAnswer: `smartuniverse server ${this.universeVersion}`,
|
|
||||||
forceSsl: false,
|
|
||||||
port: portArg
|
|
||||||
});
|
|
||||||
// route handling
|
|
||||||
// adds messages
|
|
||||||
const addMessageHandler = new smartexpress_1.Handler('PUT', request => {
|
|
||||||
const requestBody = request.body;
|
|
||||||
this.universeStore.addMessage(requestBody.message, requestBody.payload);
|
|
||||||
console.log(requestBody);
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
// gets messages
|
|
||||||
const readMessageHandler = new smartexpress_1.Handler('GET', request => {
|
|
||||||
const requestBody = request.body;
|
|
||||||
this.universeStore.readMessagesYoungerThan(requestBody.since);
|
|
||||||
});
|
|
||||||
const messageRoute = new smartexpress_1.Route(this.smartexpressServer, 'message');
|
|
||||||
messageRoute.addHandler(addMessageHandler);
|
|
||||||
messageRoute.addHandler(readMessageHandler);
|
|
||||||
yield this.smartexpressServer.start();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
stopServer() {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
yield this.smartexpressServer.stop();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.Universe = Universe;
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnR1bml2ZXJzZS5jbGFzc2VzLnVuaXZlcnNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnR1bml2ZXJzZS5jbGFzc2VzLnVuaXZlcnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSxtREFBbUQ7QUFFbkQsK0NBQXNEO0FBRXRELG1GQUFrRTtBQUVsRSwrRkFBc0U7QUFDdEUsK0NBQStDO0FBZS9DO0lBVUUsSUFBWSxlQUFlO1FBQ3pCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7WUFDOUIsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztRQUNuQyxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3pFLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDO1lBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDbkMsQ0FBQztJQUNILENBQUM7SUFJRCxZQUFZLFVBQTRDO1FBQ3RELElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDO1FBQzFCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxtREFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksK0NBQWUsRUFBRSxDQUFDO0lBRS9DLENBQUM7SUFFRDs7T0FFRztJQUNVLFVBQVUsQ0FBQyxPQUF3Qjs7WUFDOUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7Z0JBQ3hELElBQUksRUFBRSxJQUFJO2dCQUNWLGFBQWEsRUFBRSx3QkFBd0IsSUFBSSxDQUFDLGVBQWUsRUFBRTtnQkFDN0QsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsSUFBSSxFQUFFLE9BQU87YUFDZCxDQUFDLENBQUM7WUFFSCxpQkFBaUI7WUFDakIsZ0JBQWdCO1lBQ2hCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxzQkFBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsRUFBRTtnQkFDckQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDakMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3hFLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDZCxDQUFDLENBQUMsQ0FBQztZQUVILGdCQUFnQjtZQUNoQixNQUFNLGtCQUFrQixHQUFHLElBQUksc0JBQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUU7Z0JBQ3RELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hFLENBQUMsQ0FBQyxDQUFBO1lBRUYsTUFBTSxZQUFZLEdBQUcsSUFBSSxvQkFBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNuRSxZQUFZLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDM0MsWUFBWSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBRTVDLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hDLENBQUM7S0FBQTtJQUVZLFVBQVU7O1lBQ3JCLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3ZDLENBQUM7S0FBQTtDQUNGO0FBakVELDRCQWlFQyJ9
|
|
@ -1,9 +0,0 @@
|
|||||||
export interface IClientOptions {
|
|
||||||
serverAddress: string;
|
|
||||||
}
|
|
||||||
export declare class UniverseClient {
|
|
||||||
options: any;
|
|
||||||
constructor(optionsArg: IClientOptions);
|
|
||||||
sendMessage(messageArg: any, payloadArg: any): Promise<void>;
|
|
||||||
getMessageObservable(): void;
|
|
||||||
}
|
|
31
dist/smartuniverse.classes.universeclient.js
vendored
31
dist/smartuniverse.classes.universeclient.js
vendored
@ -1,31 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
||||||
return new (P || (P = Promise))(function (resolve, reject) {
|
|
||||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
||||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
||||||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
|
||||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
||||||
});
|
|
||||||
};
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
const plugins = require("./smartuniverse.plugins");
|
|
||||||
class UniverseClient {
|
|
||||||
constructor(optionsArg) {
|
|
||||||
this.options = optionsArg;
|
|
||||||
}
|
|
||||||
sendMessage(messageArg, payloadArg) {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
const requestBody = {
|
|
||||||
message: messageArg,
|
|
||||||
payload: payloadArg
|
|
||||||
};
|
|
||||||
yield plugins.smartrequest.post(this.options.serverAddress, {
|
|
||||||
requestBody: requestBody
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
getMessageObservable() {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.UniverseClient = UniverseClient;
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnR1bml2ZXJzZS5jbGFzc2VzLnVuaXZlcnNlY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnR1bml2ZXJzZS5jbGFzc2VzLnVuaXZlcnNlY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSxtREFBbUQ7QUFTbkQ7SUFHRSxZQUFZLFVBQTBCO1FBQ3BDLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDO0lBQzVCLENBQUM7SUFFWSxXQUFXLENBQUMsVUFBVSxFQUFFLFVBQVU7O1lBQzdDLE1BQU0sV0FBVyxHQUFHO2dCQUNsQixPQUFPLEVBQUUsVUFBVTtnQkFDbkIsT0FBTyxFQUFFLFVBQVU7YUFDcEIsQ0FBQTtZQUNELE1BQU0sT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUU7Z0JBQzFELFdBQVcsRUFBRSxXQUFXO2FBQ3pCLENBQUMsQ0FBQTtRQUNKLENBQUM7S0FBQTtJQUVNLG9CQUFvQjtJQUUzQixDQUFDO0NBQ0Y7QUFwQkQsd0NBb0JDIn0=
|
|
17
dist/smartuniverse.classes.universemessage.d.ts
vendored
17
dist/smartuniverse.classes.universemessage.d.ts
vendored
@ -1,17 +0,0 @@
|
|||||||
import { Timer, TimeStamp } from 'smarttime';
|
|
||||||
import { UniverseStore } from './smartuniverse.classes.universestore';
|
|
||||||
export declare class UniverseMessage {
|
|
||||||
/**
|
|
||||||
* public and unique id
|
|
||||||
* numeric ascending
|
|
||||||
* adheres to time in milliseconds
|
|
||||||
* avoids duplications though
|
|
||||||
*/
|
|
||||||
id: number;
|
|
||||||
universeStore: UniverseStore;
|
|
||||||
timestamp: TimeStamp;
|
|
||||||
message: string;
|
|
||||||
attachedPayload: any;
|
|
||||||
destructionTimer: Timer;
|
|
||||||
constructor(parentUniverseStore: UniverseStore, messageArg: string, attachedPayloadArg: any, selfdestructAfterArg: number);
|
|
||||||
}
|
|
27
dist/smartuniverse.classes.universemessage.js
vendored
27
dist/smartuniverse.classes.universemessage.js
vendored
@ -1,27 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
||||||
return new (P || (P = Promise))(function (resolve, reject) {
|
|
||||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
||||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
||||||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
|
||||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
||||||
});
|
|
||||||
};
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
const smarttime_1 = require("smarttime");
|
|
||||||
class UniverseMessage {
|
|
||||||
constructor(parentUniverseStore, messageArg, attachedPayloadArg, selfdestructAfterArg) {
|
|
||||||
this.universeStore = parentUniverseStore;
|
|
||||||
this.timestamp = new smarttime_1.TimeStamp();
|
|
||||||
this.message = messageArg;
|
|
||||||
this.attachedPayload = attachedPayloadArg;
|
|
||||||
this.destructionTimer = new smarttime_1.Timer(selfdestructAfterArg);
|
|
||||||
this.destructionTimer.start();
|
|
||||||
// set up self destruction by removing this from the parent messageStore
|
|
||||||
this.destructionTimer.completed.then(() => __awaiter(this, void 0, void 0, function* () {
|
|
||||||
this.universeStore.messageStore.remove(this);
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.UniverseMessage = UniverseMessage;
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnR1bml2ZXJzZS5jbGFzc2VzLnVuaXZlcnNlbWVzc2FnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0dW5pdmVyc2UuY2xhc3Nlcy51bml2ZXJzZW1lc3NhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUVBLHlDQUE2QztBQUc3QztJQWNFLFlBQVksbUJBQWtDLEVBQUUsVUFBa0IsRUFBRSxrQkFBdUIsRUFBRSxvQkFBNEI7UUFDdkgsSUFBSSxDQUFDLGFBQWEsR0FBRyxtQkFBbUIsQ0FBQztRQUN6QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUkscUJBQVMsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDO1FBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUcsa0JBQWtCLENBQUM7UUFDMUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksaUJBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1FBQ3ZELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUU3Qix3RUFBd0U7UUFDeEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBUyxFQUFFO1lBQzlDLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUEsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGO0FBM0JELDBDQTJCQyJ9
|
|
20
dist/smartuniverse.classes.universestore.d.ts
vendored
20
dist/smartuniverse.classes.universestore.d.ts
vendored
@ -1,20 +0,0 @@
|
|||||||
import * as plugins from './smartuniverse.plugins';
|
|
||||||
import { UniverseMessage } from './smartuniverse.classes.universemessage';
|
|
||||||
import { Observable } from 'rxjs';
|
|
||||||
export declare class UniverseStore {
|
|
||||||
standardMessageExpiry: number;
|
|
||||||
destructionTime: number;
|
|
||||||
messageStore: plugins.lik.Objectmap<UniverseMessage>;
|
|
||||||
private lastId;
|
|
||||||
constructor(standardMessageExpiryArg: number);
|
|
||||||
/**
|
|
||||||
* add a message to the UniverseStore
|
|
||||||
* @param messageArg
|
|
||||||
* @param attachedPayloadArg
|
|
||||||
*/
|
|
||||||
addMessage(messageArg: any, attachedPayloadArg: any): void;
|
|
||||||
/**
|
|
||||||
* Read a message from the UniverseStore
|
|
||||||
*/
|
|
||||||
readMessagesYoungerThan(unixTimeArg?: number): Observable<UniverseMessage>;
|
|
||||||
}
|
|
34
dist/smartuniverse.classes.universestore.js
vendored
34
dist/smartuniverse.classes.universestore.js
vendored
@ -1,34 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
const smartuniverse_classes_universemessage_1 = require("./smartuniverse.classes.universemessage");
|
|
||||||
const lik_1 = require("lik");
|
|
||||||
const smartrx_1 = require("smartrx");
|
|
||||||
class UniverseStore {
|
|
||||||
constructor(standardMessageExpiryArg) {
|
|
||||||
this.destructionTime = 60000;
|
|
||||||
this.messageStore = new lik_1.Objectmap();
|
|
||||||
this.lastId = 0; // stores the last id
|
|
||||||
this.standardMessageExpiry = standardMessageExpiryArg;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* add a message to the UniverseStore
|
|
||||||
* @param messageArg
|
|
||||||
* @param attachedPayloadArg
|
|
||||||
*/
|
|
||||||
addMessage(messageArg, attachedPayloadArg) {
|
|
||||||
this.messageStore.add(new smartuniverse_classes_universemessage_1.UniverseMessage(this, messageArg, attachedPayloadArg, this.destructionTime));
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Read a message from the UniverseStore
|
|
||||||
*/
|
|
||||||
readMessagesYoungerThan(unixTimeArg) {
|
|
||||||
const messageObservable = smartrx_1.rxjs.Observable
|
|
||||||
.from(this.messageStore.getArray())
|
|
||||||
.filter(messageArg => {
|
|
||||||
return messageArg.timestamp.isYoungerThanMilliSeconds(this.destructionTime);
|
|
||||||
});
|
|
||||||
return messageObservable;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.UniverseStore = UniverseStore;
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnR1bml2ZXJzZS5jbGFzc2VzLnVuaXZlcnNlc3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydHVuaXZlcnNlLmNsYXNzZXMudW5pdmVyc2VzdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLG1HQUEwRTtBQUUxRSw2QkFBK0I7QUFHL0IscUNBQThCO0FBRTlCO0lBTUUsWUFBWSx3QkFBZ0M7UUFKckMsb0JBQWUsR0FBVyxLQUFLLENBQUM7UUFDaEMsaUJBQVksR0FBRyxJQUFJLGVBQVMsRUFBbUIsQ0FBQztRQUMvQyxXQUFNLEdBQVcsQ0FBQyxDQUFDLENBQUMscUJBQXFCO1FBRy9DLElBQUksQ0FBQyxxQkFBcUIsR0FBRyx3QkFBd0IsQ0FBQztJQUN4RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFVBQVUsQ0FBQyxVQUFVLEVBQUUsa0JBQWtCO1FBQzlDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksdURBQWUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBQ3pHLENBQUM7SUFFRDs7T0FFRztJQUNJLHVCQUF1QixDQUFDLFdBQW9CO1FBQ2pELE1BQU0saUJBQWlCLEdBQUcsY0FBSSxDQUFDLFVBQVU7YUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7YUFDbEMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ25CLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM5RSxDQUFDLENBQUMsQ0FBQztRQUNMLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztJQUUzQixDQUFDO0NBQ0Y7QUEvQkQsc0NBK0JDIn0=
|
|
1
dist/smartuniverse.cli.d.ts
vendored
1
dist/smartuniverse.cli.d.ts
vendored
@ -1 +0,0 @@
|
|||||||
export {};
|
|
21
dist/smartuniverse.cli.js
vendored
21
dist/smartuniverse.cli.js
vendored
@ -1,21 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
||||||
return new (P || (P = Promise))(function (resolve, reject) {
|
|
||||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
||||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
||||||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
|
||||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
||||||
});
|
|
||||||
};
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
const plugins = require("./smartuniverse.plugins");
|
|
||||||
const index_1 = require("./index");
|
|
||||||
process.env.CLI = 'true';
|
|
||||||
const universeCli = new plugins.smartcli.Smartcli();
|
|
||||||
universeCli.standardTask().then((argvArg) => __awaiter(this, void 0, void 0, function* () {
|
|
||||||
const standardUniverse = new index_1.Universe({
|
|
||||||
messageExpiryInMilliseconds: 60000
|
|
||||||
});
|
|
||||||
yield standardUniverse.initServer(8765);
|
|
||||||
}));
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnR1bml2ZXJzZS5jbGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydHVuaXZlcnNlLmNsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUEsbURBQW1EO0FBRW5ELG1DQUFtQztBQUVuQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUM7QUFFekIsTUFBTSxXQUFXLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBRXBELFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBTSxPQUFPLEVBQUMsRUFBRTtJQUM5QyxNQUFNLGdCQUFnQixHQUFHLElBQUksZ0JBQVEsQ0FBQztRQUNwQywyQkFBMkIsRUFBRSxLQUFLO0tBQ25DLENBQUMsQ0FBQztJQUNILE1BQU0sZ0JBQWdCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBRTFDLENBQUMsQ0FBQSxDQUFDLENBQUMifQ==
|
|
1
dist/smartuniverse.paths.d.ts
vendored
1
dist/smartuniverse.paths.d.ts
vendored
@ -1 +0,0 @@
|
|||||||
export declare const packageJson: string;
|
|
5
dist/smartuniverse.paths.js
vendored
5
dist/smartuniverse.paths.js
vendored
@ -1,5 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
const plugins = require("./smartuniverse.plugins");
|
|
||||||
exports.packageJson = plugins.path.join(__dirname, '../package.json');
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnR1bml2ZXJzZS5wYXRocy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0dW5pdmVyc2UucGF0aHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxtREFBbUQ7QUFFdEMsUUFBQSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGlCQUFpQixDQUFDLENBQUMifQ==
|
|
10
dist/smartuniverse.plugins.d.ts
vendored
10
dist/smartuniverse.plugins.d.ts
vendored
@ -1,10 +0,0 @@
|
|||||||
import * as lik from 'lik';
|
|
||||||
import * as path from 'path';
|
|
||||||
import * as smartcli from 'smartcli';
|
|
||||||
import * as smartexpress from 'smartexpress';
|
|
||||||
import * as smartfile from 'smartfile';
|
|
||||||
import * as smartrequest from 'smartrequest';
|
|
||||||
import * as smartrx from 'smartrx';
|
|
||||||
import * as smartsocket from 'smartsocket';
|
|
||||||
import * as smarttime from 'smarttime';
|
|
||||||
export { lik, path, smartcli, smartexpress, smartfile, smartrx, smartrequest, smartsocket, smarttime };
|
|
21
dist/smartuniverse.plugins.js
vendored
21
dist/smartuniverse.plugins.js
vendored
@ -1,21 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
const lik = require("lik");
|
|
||||||
exports.lik = lik;
|
|
||||||
const path = require("path");
|
|
||||||
exports.path = path;
|
|
||||||
const smartcli = require("smartcli");
|
|
||||||
exports.smartcli = smartcli;
|
|
||||||
const smartexpress = require("smartexpress");
|
|
||||||
exports.smartexpress = smartexpress;
|
|
||||||
const smartfile = require("smartfile");
|
|
||||||
exports.smartfile = smartfile;
|
|
||||||
const smartrequest = require("smartrequest");
|
|
||||||
exports.smartrequest = smartrequest;
|
|
||||||
const smartrx = require("smartrx");
|
|
||||||
exports.smartrx = smartrx;
|
|
||||||
const smartsocket = require("smartsocket");
|
|
||||||
exports.smartsocket = smartsocket;
|
|
||||||
const smarttime = require("smarttime");
|
|
||||||
exports.smarttime = smarttime;
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnR1bml2ZXJzZS5wbHVnaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnR1bml2ZXJzZS5wbHVnaW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMkJBQTJCO0FBVWxCLGtCQUFHO0FBVFosNkJBQTZCO0FBU2Ysb0JBQUk7QUFSbEIscUNBQXFDO0FBUWpCLDRCQUFRO0FBUDVCLDZDQUE2QztBQU9mLG9DQUFZO0FBTjFDLHVDQUF1QztBQU1LLDhCQUFTO0FBTHJELDZDQUE2QztBQUttQixvQ0FBWTtBQUo1RSxtQ0FBbUM7QUFJb0IsMEJBQU87QUFIOUQsMkNBQTJDO0FBR21DLGtDQUFXO0FBRnpGLHVDQUF1QztBQUVvRCw4QkFBUyJ9
|
|
@ -1,7 +1,9 @@
|
|||||||
{
|
{
|
||||||
"npmci": {
|
"npmci": {
|
||||||
"npmGlobalTools": [
|
"npmGlobalTools": [
|
||||||
"npmts"
|
"@gitzone/npmts",
|
||||||
]
|
"ts-node"
|
||||||
|
],
|
||||||
|
"npmAccessLevel": "public"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
13
package.json
13
package.json
@ -1,27 +1,30 @@
|
|||||||
{
|
{
|
||||||
"name": "smartuniverse",
|
"name": "@pushrocks/smartuniverse",
|
||||||
"version": "1.0.4",
|
"version": "1.0.13",
|
||||||
"description": "messaging service for your micro services",
|
"description": "messaging service for your micro services",
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
"typings": "dist/index.d.ts",
|
"typings": "dist/index.d.ts",
|
||||||
"author": "Lossless GmbH",
|
"author": "Lossless GmbH",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "(npmts)",
|
"test": "ts-node test/test.ts",
|
||||||
|
"build": "(npmts)",
|
||||||
"format": "(gitzone format)"
|
"format": "(gitzone format)"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@types/node": "^9.6.0",
|
||||||
"tapbundle": "^2.0.0"
|
"tapbundle": "^2.0.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"lik": "^2.0.5",
|
"lik": "^2.0.5",
|
||||||
"rxjs": "^5.5.7",
|
"rxjs": "^5.5.8",
|
||||||
"smartcli": "^2.0.12",
|
"smartcli": "^2.0.12",
|
||||||
"smartexpress": "^1.0.21",
|
"smartexpress": "^1.0.21",
|
||||||
"smartfile": "^4.2.28",
|
"smartfile": "^4.2.28",
|
||||||
|
"smartq": "^1.1.8",
|
||||||
"smartrequest": "^1.0.8",
|
"smartrequest": "^1.0.8",
|
||||||
"smartrx": "^1.0.5",
|
"smartrx": "^1.0.5",
|
||||||
"smartsocket": "^1.1.13",
|
"smartsocket": "^1.1.19",
|
||||||
"smarttime": "^2.0.0"
|
"smarttime": "^2.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
33
readme.md
Normal file
33
readme.md
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
# smartuniverse
|
||||||
|
|
||||||
|
messaging service for your micro services
|
||||||
|
|
||||||
|
## Availabililty
|
||||||
|
|
||||||
|
[](https://www.npmjs.com/package/@pushrocks/smartuniverse)
|
||||||
|
[](https://GitLab.com/pushrocks/smartuniverse)
|
||||||
|
[](https://github.com/pushrocks/smartuniverse)
|
||||||
|
[](https://pushrocks.gitlab.io/smartuniverse/)
|
||||||
|
|
||||||
|
## Status for master
|
||||||
|
|
||||||
|
[](https://GitLab.com/pushrocks/smartuniverse/commits/master)
|
||||||
|
[](https://GitLab.com/pushrocks/smartuniverse/commits/master)
|
||||||
|
[](https://www.npmjs.com/package/@pushrocks/smartuniverse)
|
||||||
|
[](https://www.bithound.io/github/pushrocks/smartuniverse/master/dependencies/npm)
|
||||||
|
[](https://www.bithound.io/github/pushrocks/smartuniverse)
|
||||||
|
[](https://snyk.io/test/npm/@pushrocks/smartuniverse)
|
||||||
|
[](https://nodejs.org/dist/latest-v6.x/docs/api/)
|
||||||
|
[](https://nodejs.org/dist/latest-v6.x/docs/api/)
|
||||||
|
[](http://standardjs.com/)
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Use TypeScript for best in class instellisense.
|
||||||
|
|
||||||
|
For further information read the linked docs at the top of this README.
|
||||||
|
|
||||||
|
> licensed | **©** [Lossless GmbH](https://lossless.gmbh)
|
||||||
|
> | By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
|
||||||
|
|
||||||
|
[](https://push.rocks)
|
31
test/test.ts
31
test/test.ts
@ -2,35 +2,48 @@
|
|||||||
import { expect, tap } from 'tapbundle';
|
import { expect, tap } from 'tapbundle';
|
||||||
import * as smartuniverse from '../ts/index';
|
import * as smartuniverse from '../ts/index';
|
||||||
|
|
||||||
|
import { Observable } from 'rxjs';
|
||||||
|
|
||||||
let testUniverse: smartuniverse.Universe;
|
let testUniverse: smartuniverse.Universe;
|
||||||
let testUniverseClient: smartuniverse.UniverseClient
|
let testUniverseClient: smartuniverse.UniverseClient;
|
||||||
|
let testMessageObservable: Observable<smartuniverse.UniverseMessage>;
|
||||||
|
|
||||||
tap.test('first test', async () => {
|
tap.test('first test', async () => {
|
||||||
testUniverse = new smartuniverse.Universe({
|
testUniverse = new smartuniverse.Universe({
|
||||||
messageExpiryInMilliseconds: 5000
|
messageExpiryInMilliseconds: 1000
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
tap.test('add a message to the SmartUniverse', async () => {
|
tap.test('add a message to the SmartUniverse', async () => {
|
||||||
await testUniverse.initServer(8765);
|
await testUniverse.initServer(8765);
|
||||||
})
|
});
|
||||||
|
|
||||||
// testing message handling
|
// testing message handling
|
||||||
tap.test('create smartuniverse client', async () => {
|
tap.test('create smartuniverse client', async () => {
|
||||||
testUniverseClient = new smartuniverse.UniverseClient({
|
testUniverseClient = new smartuniverse.UniverseClient({
|
||||||
serverAddress: 'http://localhost:8765'
|
serverAddress: 'http://localhost:8765'
|
||||||
});
|
});
|
||||||
expect(testUniverseClient).to.be.instanceof(smartuniverse.UniverseClient)
|
expect(testUniverseClient).to.be.instanceof(smartuniverse.UniverseClient);
|
||||||
})
|
});
|
||||||
|
|
||||||
tap.test('should send a message correctly', async () => {
|
tap.test('should send a message correctly', async () => {
|
||||||
await testUniverseClient.sendMessage('greeting', {
|
await testUniverseClient.sendMessage('greeting', {
|
||||||
anyBool: true
|
anyBool: true
|
||||||
})
|
});
|
||||||
})
|
});
|
||||||
|
|
||||||
tap.test('should end the server correctly', async () => {
|
tap.test('should get a observable correctly', async () => {
|
||||||
|
testMessageObservable = testUniverseClient.getMessageObservable();
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test('should receive a message correctly', async () => {});
|
||||||
|
|
||||||
|
tap.test('should disconnect the client correctly', async () => {
|
||||||
|
testUniverseClient.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test('should end the server correctly', async tools => {
|
||||||
await testUniverse.stopServer();
|
await testUniverse.stopServer();
|
||||||
})
|
});
|
||||||
|
|
||||||
tap.start();
|
tap.start();
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
export * from './smartuniverse.classes.universe';
|
export * from './smartuniverse.classes.universe';
|
||||||
export * from './smartuniverse.classes.universeclient';
|
export * from './smartuniverse.classes.universeclient';
|
||||||
|
export * from './smartuniverse.classes.universemessage';
|
||||||
|
@ -1,10 +1,22 @@
|
|||||||
import * as plugins from './smartuniverse.plugins';
|
import * as plugins from './smartuniverse.plugins';
|
||||||
|
|
||||||
import { Objectmap } from 'lik';
|
import { Objectmap } from 'lik';
|
||||||
|
import { UniverseChannel } from './smartuniverse.classes.universechannel';
|
||||||
|
|
||||||
export class UniverseManager {
|
export class UniverseManager {
|
||||||
|
public channelStore = new Objectmap<UniverseChannel>();
|
||||||
|
|
||||||
public async registerMember () {
|
/**
|
||||||
|
* register a new member
|
||||||
|
*/
|
||||||
|
public async registerMember() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* register a new channel within the universe
|
||||||
|
* @param channelName the name of the channel
|
||||||
|
* @param authSecret the secret against which to verify members of the channel
|
||||||
|
*/
|
||||||
|
public async registerChannel(channelName: string, authSecret: string) {
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,10 @@ import * as plugins from './smartuniverse.plugins';
|
|||||||
import { Handler, Route, Server } from 'smartexpress';
|
import { Handler, Route, Server } from 'smartexpress';
|
||||||
|
|
||||||
import { UniverseManager } from './smartuniverse.classes.manager';
|
import { UniverseManager } from './smartuniverse.classes.manager';
|
||||||
|
import { UniverseChannel } from './smartuniverse.classes.universechannel';
|
||||||
import { UniverseMessage } from './smartuniverse.classes.universemessage';
|
import { UniverseMessage } from './smartuniverse.classes.universemessage';
|
||||||
import { UniverseStore } from './smartuniverse.classes.universestore';
|
import { UniverseStore } from './smartuniverse.classes.universestore';
|
||||||
|
|
||||||
import * as paths from './smartuniverse.paths';
|
import * as paths from './smartuniverse.paths';
|
||||||
|
|
||||||
export interface ISmartUniverseConstructorOptions {
|
export interface ISmartUniverseConstructorOptions {
|
||||||
@ -12,12 +14,14 @@ export interface ISmartUniverseConstructorOptions {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface IServerGetMessagesRequestBody {
|
export interface IServerGetMessagesRequestBody {
|
||||||
|
channel: string;
|
||||||
|
topic?: string;
|
||||||
youngerThan: number;
|
youngerThan: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IServerPutMessageRequestBody {
|
export interface IServerPutMessageRequestBody {
|
||||||
message: string,
|
message: string;
|
||||||
payload: any
|
payload: any;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Universe {
|
export class Universe {
|
||||||
@ -41,12 +45,12 @@ export class Universe {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private smartexpressServer: plugins.smartexpress.Server;
|
private smartexpressServer: plugins.smartexpress.Server;
|
||||||
|
private smartsocket: plugins.smartsocket.Smartsocket;
|
||||||
|
|
||||||
constructor(optionsArg: ISmartUniverseConstructorOptions) {
|
constructor(optionsArg: ISmartUniverseConstructorOptions) {
|
||||||
this.options = optionsArg;
|
this.options = optionsArg;
|
||||||
this.universeStore = new UniverseStore(this.options.messageExpiryInMilliseconds);
|
this.universeStore = new UniverseStore(this.options.messageExpiryInMilliseconds);
|
||||||
this.universeManager = new UniverseManager();
|
this.universeManager = new UniverseManager();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -60,7 +64,7 @@ export class Universe {
|
|||||||
port: portArg
|
port: portArg
|
||||||
});
|
});
|
||||||
|
|
||||||
// route handling
|
// message handling
|
||||||
// adds messages
|
// adds messages
|
||||||
const addMessageHandler = new Handler('PUT', request => {
|
const addMessageHandler = new Handler('PUT', request => {
|
||||||
const requestBody = request.body;
|
const requestBody = request.body;
|
||||||
@ -71,18 +75,36 @@ export class Universe {
|
|||||||
|
|
||||||
// gets messages
|
// gets messages
|
||||||
const readMessageHandler = new Handler('GET', request => {
|
const readMessageHandler = new Handler('GET', request => {
|
||||||
|
const done = plugins.smartq.defer<UniverseMessage[]>();
|
||||||
const requestBody = request.body;
|
const requestBody = request.body;
|
||||||
this.universeStore.readMessagesYoungerThan(requestBody.since);
|
const messageObservable = this.universeStore.readMessagesYoungerThan(requestBody.since);
|
||||||
})
|
messageObservable.toArray().subscribe(universeMessageArrayArg => {
|
||||||
|
done.resolve(universeMessageArrayArg);
|
||||||
|
});
|
||||||
|
return done.promise;
|
||||||
|
});
|
||||||
|
|
||||||
|
// create new Route for messages
|
||||||
const messageRoute = new Route(this.smartexpressServer, 'message');
|
const messageRoute = new Route(this.smartexpressServer, 'message');
|
||||||
messageRoute.addHandler(addMessageHandler);
|
messageRoute.addHandler(addMessageHandler);
|
||||||
messageRoute.addHandler(readMessageHandler);
|
messageRoute.addHandler(readMessageHandler);
|
||||||
|
|
||||||
|
const leaderElectionRoute = new Route(this.smartexpressServer, 'leadelection');
|
||||||
|
// TODO: implement Handlers for leader election
|
||||||
|
|
||||||
|
// add websocket upgrade
|
||||||
|
this.smartsocket = new plugins.smartsocket.Smartsocket({
|
||||||
|
port: 12345 // fix this within smartsocket
|
||||||
|
});
|
||||||
|
|
||||||
|
this.smartsocket.setExternalServer('express', this.smartexpressServer as any); // should work with express as well
|
||||||
|
this.smartsocket.start();
|
||||||
|
|
||||||
await this.smartexpressServer.start();
|
await this.smartexpressServer.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async stopServer () {
|
public async stopServer() {
|
||||||
|
await this.smartsocket.stop();
|
||||||
await this.smartexpressServer.stop();
|
await this.smartexpressServer.stop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
32
ts/smartuniverse.classes.universechannel.ts
Normal file
32
ts/smartuniverse.classes.universechannel.ts
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
import * as plugins from './smartuniverse.plugins';
|
||||||
|
|
||||||
|
import { Objectmap } from 'lik';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enables messages to stay within a certain scope.
|
||||||
|
*/
|
||||||
|
export class UniverseChannel {
|
||||||
|
/**
|
||||||
|
* stores the channels that are available within the universe
|
||||||
|
*/
|
||||||
|
public static channelStore = new Objectmap();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* creates new channels
|
||||||
|
* @param channelArg the name of the topic
|
||||||
|
* @param secretArg the secret thats used for a certain topic.
|
||||||
|
*/
|
||||||
|
public static createChannel = (channelArg: string, secretArg: string) => {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
credentials: {
|
||||||
|
user: string;
|
||||||
|
password: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* authenticates a client on the server side
|
||||||
|
*/
|
||||||
|
async authenticateClient() {}
|
||||||
|
}
|
@ -1,14 +1,27 @@
|
|||||||
import * as plugins from './smartuniverse.plugins';
|
import * as plugins from './smartuniverse.plugins';
|
||||||
|
|
||||||
import { Observable } from 'rxjs';
|
import { Observable } from 'rxjs';
|
||||||
import { IServerGetMessagesRequestBody, IServerPutMessageRequestBody } from './smartuniverse.classes.universe'
|
import { Smartsocket, SmartsocketClient } from 'smartsocket';
|
||||||
|
import * as url from 'url';
|
||||||
|
|
||||||
|
import {
|
||||||
|
IServerGetMessagesRequestBody,
|
||||||
|
IServerPutMessageRequestBody
|
||||||
|
} from './smartuniverse.classes.universe';
|
||||||
|
import { UniverseMessage } from './smartuniverse.classes.universemessage';
|
||||||
|
|
||||||
export interface IClientOptions {
|
export interface IClientOptions {
|
||||||
serverAddress: string
|
serverAddress: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* this class is for client side only!!!
|
||||||
|
* allows connecting to a universe server
|
||||||
|
*/
|
||||||
export class UniverseClient {
|
export class UniverseClient {
|
||||||
public options;
|
public options;
|
||||||
|
private socketClient: plugins.smartsocket.SmartsocketClient;
|
||||||
|
private observableIntake: plugins.smartrx.ObservableIntake<UniverseMessage>;
|
||||||
|
|
||||||
constructor(optionsArg: IClientOptions) {
|
constructor(optionsArg: IClientOptions) {
|
||||||
this.options = optionsArg;
|
this.options = optionsArg;
|
||||||
@ -18,13 +31,30 @@ export class UniverseClient {
|
|||||||
const requestBody = {
|
const requestBody = {
|
||||||
message: messageArg,
|
message: messageArg,
|
||||||
payload: payloadArg
|
payload: payloadArg
|
||||||
}
|
};
|
||||||
|
// TODO: User websocket connection if available
|
||||||
await plugins.smartrequest.post(this.options.serverAddress, {
|
await plugins.smartrequest.post(this.options.serverAddress, {
|
||||||
requestBody: requestBody
|
requestBody
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public getMessageObservable () {
|
public getMessageObservable() {
|
||||||
|
if (!this.socketClient && !this.observableIntake) {
|
||||||
|
const parsedURL = url.parse(this.options.serverAddress);
|
||||||
|
this.socketClient = new SmartsocketClient({
|
||||||
|
alias: process.env.SOCKET_ALIAS || 'someclient',
|
||||||
|
password: 'UniverseClient',
|
||||||
|
port: parseInt(parsedURL.port, 10),
|
||||||
|
role: 'UniverseClient',
|
||||||
|
url: parsedURL.hostname
|
||||||
|
});
|
||||||
|
this.observableIntake = new plugins.smartrx.ObservableIntake();
|
||||||
|
this.socketClient.connect();
|
||||||
|
}
|
||||||
|
return this.observableIntake.observable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public close() {
|
||||||
|
this.socketClient.disconnect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,9 @@ import * as plugins from './smartuniverse.plugins';
|
|||||||
import { Timer, TimeStamp } from 'smarttime';
|
import { Timer, TimeStamp } from 'smarttime';
|
||||||
import { UniverseStore } from './smartuniverse.classes.universestore';
|
import { UniverseStore } from './smartuniverse.classes.universestore';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* represents a message within a universe
|
||||||
|
*/
|
||||||
export class UniverseMessage {
|
export class UniverseMessage {
|
||||||
/**
|
/**
|
||||||
* public and unique id
|
* public and unique id
|
||||||
@ -12,22 +15,35 @@ export class UniverseMessage {
|
|||||||
*/
|
*/
|
||||||
public id: number;
|
public id: number;
|
||||||
public universeStore: UniverseStore;
|
public universeStore: UniverseStore;
|
||||||
public timestamp: TimeStamp;
|
public timestamp: TimeStamp; // when has this message been created
|
||||||
public message: string;
|
public topic: string; // enables unprotected grouping of messages for efficiency purposes.
|
||||||
public attachedPayload: any;
|
public message: string; // the actual message
|
||||||
public destructionTimer: Timer;
|
public attachedPayload: any; // any attached payloads. Can be of binary format.
|
||||||
|
public destructionTimer: Timer; // a timer to take care of message destruction
|
||||||
|
|
||||||
constructor(parentUniverseStore: UniverseStore, messageArg: string, attachedPayloadArg: any, selfdestructAfterArg: number) {
|
/**
|
||||||
|
* the constructor to create a universe message
|
||||||
|
* @param parentUniverseStore
|
||||||
|
* @param messageArg
|
||||||
|
* @param attachedPayloadArg
|
||||||
|
* @param selfdestructAfterArg
|
||||||
|
*/
|
||||||
|
constructor(
|
||||||
|
parentUniverseStore: UniverseStore,
|
||||||
|
messageArg: string,
|
||||||
|
attachedPayloadArg: any,
|
||||||
|
selfdestructAfterArg: number
|
||||||
|
) {
|
||||||
this.universeStore = parentUniverseStore;
|
this.universeStore = parentUniverseStore;
|
||||||
this.timestamp = new TimeStamp();
|
this.timestamp = new TimeStamp();
|
||||||
this.message = messageArg;
|
this.message = messageArg;
|
||||||
this.attachedPayload = attachedPayloadArg;
|
this.attachedPayload = attachedPayloadArg;
|
||||||
this.destructionTimer = new Timer(selfdestructAfterArg)
|
this.destructionTimer = new Timer(selfdestructAfterArg);
|
||||||
this.destructionTimer.start()
|
this.destructionTimer.start();
|
||||||
|
|
||||||
// set up self destruction by removing this from the parent messageStore
|
// set up self destruction by removing this from the parent messageStore
|
||||||
this.destructionTimer.completed.then(async () => {
|
this.destructionTimer.completed.then(async () => {
|
||||||
this.universeStore.messageStore.remove(this);
|
this.universeStore.messageStore.remove(this);
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,11 +2,14 @@ import * as plugins from './smartuniverse.plugins';
|
|||||||
|
|
||||||
import { UniverseMessage } from './smartuniverse.classes.universemessage';
|
import { UniverseMessage } from './smartuniverse.classes.universemessage';
|
||||||
|
|
||||||
import { Objectmap } from 'lik'
|
import { Objectmap } from 'lik';
|
||||||
|
|
||||||
import { Observable } from 'rxjs';
|
import { Observable } from 'rxjs';
|
||||||
import { rxjs } from 'smartrx'
|
import { rxjs } from 'smartrx';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* universe store handles the creation, storage and retrieval of messages.
|
||||||
|
*/
|
||||||
export class UniverseStore {
|
export class UniverseStore {
|
||||||
public standardMessageExpiry: number;
|
public standardMessageExpiry: number;
|
||||||
public destructionTime: number = 60000;
|
public destructionTime: number = 60000;
|
||||||
@ -23,19 +26,20 @@ export class UniverseStore {
|
|||||||
* @param attachedPayloadArg
|
* @param attachedPayloadArg
|
||||||
*/
|
*/
|
||||||
public addMessage(messageArg, attachedPayloadArg) {
|
public addMessage(messageArg, attachedPayloadArg) {
|
||||||
this.messageStore.add(new UniverseMessage(this, messageArg, attachedPayloadArg, this.destructionTime));
|
this.messageStore.add(
|
||||||
|
new UniverseMessage(this, messageArg, attachedPayloadArg, this.destructionTime)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read a message from the UniverseStore
|
* Read a message from the UniverseStore
|
||||||
*/
|
*/
|
||||||
public readMessagesYoungerThan(unixTimeArg?: number): Observable<UniverseMessage> {
|
public readMessagesYoungerThan(unixTimeArg?: number): Observable<UniverseMessage> {
|
||||||
const messageObservable = rxjs.Observable
|
const messageObservable = rxjs.Observable.from(this.messageStore.getArray()).filter(
|
||||||
.from(this.messageStore.getArray())
|
messageArg => {
|
||||||
.filter(messageArg => {
|
|
||||||
return messageArg.timestamp.isYoungerThanMilliSeconds(this.destructionTime);
|
return messageArg.timestamp.isYoungerThanMilliSeconds(this.destructionTime);
|
||||||
});
|
}
|
||||||
|
);
|
||||||
return messageObservable;
|
return messageObservable;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,5 +11,4 @@ universeCli.standardTask().then(async argvArg => {
|
|||||||
messageExpiryInMilliseconds: 60000
|
messageExpiryInMilliseconds: 60000
|
||||||
});
|
});
|
||||||
await standardUniverse.initServer(8765);
|
await standardUniverse.initServer(8765);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
@ -3,9 +3,21 @@ import * as path from 'path';
|
|||||||
import * as smartcli from 'smartcli';
|
import * as smartcli from 'smartcli';
|
||||||
import * as smartexpress from 'smartexpress';
|
import * as smartexpress from 'smartexpress';
|
||||||
import * as smartfile from 'smartfile';
|
import * as smartfile from 'smartfile';
|
||||||
|
import * as smartq from 'smartq';
|
||||||
import * as smartrequest from 'smartrequest';
|
import * as smartrequest from 'smartrequest';
|
||||||
import * as smartrx from 'smartrx';
|
import * as smartrx from 'smartrx';
|
||||||
import * as smartsocket from 'smartsocket';
|
import * as smartsocket from 'smartsocket';
|
||||||
import * as smarttime from 'smarttime';
|
import * as smarttime from 'smarttime';
|
||||||
|
|
||||||
export { lik, path, smartcli, smartexpress, smartfile, smartrx, smartrequest, smartsocket, smarttime };
|
export {
|
||||||
|
lik,
|
||||||
|
path,
|
||||||
|
smartcli,
|
||||||
|
smartexpress,
|
||||||
|
smartfile,
|
||||||
|
smartq,
|
||||||
|
smartrx,
|
||||||
|
smartrequest,
|
||||||
|
smartsocket,
|
||||||
|
smarttime
|
||||||
|
};
|
||||||
|
@ -2,5 +2,11 @@
|
|||||||
"extends": [
|
"extends": [
|
||||||
"tslint:latest",
|
"tslint:latest",
|
||||||
"tslint-config-prettier"
|
"tslint-config-prettier"
|
||||||
|
],
|
||||||
|
"rules": {
|
||||||
|
"semicolon": [
|
||||||
|
true,
|
||||||
|
"always"
|
||||||
]
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
34
yarn.lock
34
yarn.lock
@ -57,8 +57,8 @@
|
|||||||
"@types/express" "*"
|
"@types/express" "*"
|
||||||
|
|
||||||
"@types/lodash@^4.14.55", "@types/lodash@^4.14.97":
|
"@types/lodash@^4.14.55", "@types/lodash@^4.14.97":
|
||||||
version "4.14.105"
|
version "4.14.106"
|
||||||
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.105.tgz#9fcc4627a1f98f8f8fce79ddb2bff4afd97e959b"
|
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.106.tgz#6093e9a02aa567ddecfe9afadca89e53e5dce4dd"
|
||||||
|
|
||||||
"@types/mime@*":
|
"@types/mime@*":
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
@ -68,9 +68,9 @@
|
|||||||
version "3.0.3"
|
version "3.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
|
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
|
||||||
|
|
||||||
"@types/node@*":
|
"@types/node@*", "@types/node@^9.6.0":
|
||||||
version "9.4.7"
|
version "9.6.0"
|
||||||
resolved "http://registry.npmjs.org/@types/node/-/node-9.4.7.tgz#57d81cd98719df2c9de118f2d5f3b1120dcd7275"
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.0.tgz#d3480ee666df9784b1001a1872a2f6ccefb6c2d7"
|
||||||
|
|
||||||
"@types/q@0.x.x":
|
"@types/q@0.x.x":
|
||||||
version "0.0.37"
|
version "0.0.37"
|
||||||
@ -312,8 +312,8 @@ clone-stats@^1.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680"
|
resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680"
|
||||||
|
|
||||||
clone@^2.1.1:
|
clone@^2.1.1:
|
||||||
version "2.1.1"
|
version "2.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb"
|
resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
|
||||||
|
|
||||||
cloneable-readable@^1.0.0:
|
cloneable-readable@^1.0.0:
|
||||||
version "1.1.2"
|
version "1.1.2"
|
||||||
@ -501,8 +501,8 @@ engine.io@~3.1.0:
|
|||||||
uws "~9.14.0"
|
uws "~9.14.0"
|
||||||
|
|
||||||
es-abstract@^1.5.1:
|
es-abstract@^1.5.1:
|
||||||
version "1.10.0"
|
version "1.11.0"
|
||||||
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864"
|
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.11.0.tgz#cce87d518f0496893b1a30cd8461835535480681"
|
||||||
dependencies:
|
dependencies:
|
||||||
es-to-primitive "^1.1.1"
|
es-to-primitive "^1.1.1"
|
||||||
function-bind "^1.1.1"
|
function-bind "^1.1.1"
|
||||||
@ -1268,9 +1268,9 @@ restore-cursor@^2.0.0:
|
|||||||
onetime "^2.0.0"
|
onetime "^2.0.0"
|
||||||
signal-exit "^3.0.2"
|
signal-exit "^3.0.2"
|
||||||
|
|
||||||
rxjs@^5.4.3, rxjs@^5.5.2, rxjs@^5.5.7:
|
rxjs@^5.4.3, rxjs@^5.5.2, rxjs@^5.5.8:
|
||||||
version "5.5.7"
|
version "5.5.8"
|
||||||
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.7.tgz#afb3d1642b069b2fbf203903d6501d1acb4cda27"
|
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.8.tgz#b2b0809a57614ad6254c03d7446dea0d83ca3791"
|
||||||
dependencies:
|
dependencies:
|
||||||
symbol-observable "1.0.1"
|
symbol-observable "1.0.1"
|
||||||
|
|
||||||
@ -1427,7 +1427,7 @@ smartpath@^3.2.8:
|
|||||||
home "^1.0.1"
|
home "^1.0.1"
|
||||||
typings-global "^1.0.14"
|
typings-global "^1.0.14"
|
||||||
|
|
||||||
smartq@^1.1.1, smartq@^1.1.6:
|
smartq@^1.1.1, smartq@^1.1.6, smartq@^1.1.8:
|
||||||
version "1.1.8"
|
version "1.1.8"
|
||||||
resolved "https://registry.yarnpkg.com/smartq/-/smartq-1.1.8.tgz#7e2f3b9739eb5d6c9f45f2a86e339ec81e49e8d2"
|
resolved "https://registry.yarnpkg.com/smartq/-/smartq-1.1.8.tgz#7e2f3b9739eb5d6c9f45f2a86e339ec81e49e8d2"
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -1449,9 +1449,9 @@ smartrx@^1.0.5:
|
|||||||
smartq "^1.1.6"
|
smartq "^1.1.6"
|
||||||
typings-global "^1.0.23"
|
typings-global "^1.0.23"
|
||||||
|
|
||||||
smartsocket@^1.1.13:
|
smartsocket@^1.1.19:
|
||||||
version "1.1.13"
|
version "1.1.19"
|
||||||
resolved "https://registry.yarnpkg.com/smartsocket/-/smartsocket-1.1.13.tgz#7f9d611fa097734367139c88b1a24a95089d0ee4"
|
resolved "https://registry.yarnpkg.com/smartsocket/-/smartsocket-1.1.19.tgz#60d15ad1af4b2be03ca7a56ce075e52fa0e33e1f"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/shortid" "0.0.29"
|
"@types/shortid" "0.0.29"
|
||||||
"@types/socket.io" "^1.4.32"
|
"@types/socket.io" "^1.4.32"
|
||||||
@ -1461,7 +1461,7 @@ smartsocket@^1.1.13:
|
|||||||
nodehash "^1.0.4"
|
nodehash "^1.0.4"
|
||||||
shortid "^2.2.8"
|
shortid "^2.2.8"
|
||||||
smartdelay "^1.0.4"
|
smartdelay "^1.0.4"
|
||||||
smartq "^1.1.6"
|
smartq "^1.1.8"
|
||||||
socket.io "^2.0.4"
|
socket.io "^2.0.4"
|
||||||
socket.io-client "^2.0.4"
|
socket.io-client "^2.0.4"
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user