Compare commits
57 Commits
Author | SHA1 | Date | |
---|---|---|---|
4761ff31cf | |||
430c3ea13a | |||
6dd3782b0d | |||
06aa721247 | |||
f728c56016 | |||
f512acdfaa | |||
331a098851 | |||
a8053a6e20 | |||
a62f3eb750 | |||
4b53044e8f | |||
2db2c80130 | |||
8b23eaf194 | |||
a03c54001f | |||
7bc404ba21 | |||
ac2a1559b0 | |||
57b37cb327 | |||
8b17e814cc | |||
f4b8cde347 | |||
3189d4d274 | |||
c2d134a6ea | |||
7552dc1e9f | |||
fe91459510 | |||
0e0ffb7634 | |||
37bb052774 | |||
3c7683d40e | |||
c19f27e873 | |||
c1a03fec0f | |||
8b650c5ea7 | |||
4fc6e327ec | |||
7991baf2bf | |||
d033780015 | |||
eae46e6461 | |||
785acfaba4 | |||
5a4dceb75d | |||
a17834a8f0 | |||
01765fa50f | |||
547c159dc4 | |||
046d7d646d | |||
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/
|
||||
node_modules/
|
||||
dist/
|
||||
coverage/
|
||||
public/
|
||||
pages/
|
||||
|
@ -3,93 +3,123 @@ image: hosttoday/ht-docker-node:npmci
|
||||
|
||||
cache:
|
||||
paths:
|
||||
- .yarn/
|
||||
- .npmci_cache/
|
||||
key: "$CI_BUILD_STAGE"
|
||||
|
||||
stages:
|
||||
- security
|
||||
- test
|
||||
- release
|
||||
- trigger
|
||||
- pages
|
||||
- metadata
|
||||
|
||||
# ====================
|
||||
# security stage
|
||||
# ====================
|
||||
mirror:
|
||||
stage: security
|
||||
script:
|
||||
- npmci git mirror
|
||||
tags:
|
||||
- docker
|
||||
- notpriv
|
||||
|
||||
snyk:
|
||||
stage: security
|
||||
script:
|
||||
- npmci command yarn global add snyk
|
||||
- npmci command yarn install --ignore-scripts
|
||||
- npmci npm prepare
|
||||
- npmci command npm install -g snyk
|
||||
- npmci command npm install --ignore-scripts
|
||||
- npmci command snyk test
|
||||
tags:
|
||||
- docker
|
||||
- notpriv
|
||||
|
||||
testLEGACY:
|
||||
stage: test
|
||||
script:
|
||||
- npmci node install legacy
|
||||
- npmci npm install
|
||||
- npmci npm test
|
||||
coverage: /\d+.?\d+?\%\s*coverage/
|
||||
tags:
|
||||
- docker
|
||||
allow_failure: true
|
||||
# ====================
|
||||
# test stage
|
||||
# ====================
|
||||
|
||||
testLTS:
|
||||
stage: test
|
||||
script:
|
||||
- npmci npm prepare
|
||||
- npmci node install lts
|
||||
- npmci npm install
|
||||
- npmci npm test
|
||||
coverage: /\d+.?\d+?\%\s*coverage/
|
||||
tags:
|
||||
- docker
|
||||
- notpriv
|
||||
|
||||
testSTABLE:
|
||||
stage: test
|
||||
script:
|
||||
- npmci npm prepare
|
||||
- npmci node install stable
|
||||
- npmci npm install
|
||||
- npmci npm test
|
||||
coverage: /\d+.?\d+?\%\s*coverage/
|
||||
tags:
|
||||
- docker
|
||||
- notpriv
|
||||
|
||||
release:
|
||||
stage: release
|
||||
script:
|
||||
- npmci npm prepare
|
||||
- npmci node install stable
|
||||
- npmci npm publish
|
||||
only:
|
||||
- tags
|
||||
tags:
|
||||
- docker
|
||||
- notpriv
|
||||
|
||||
# ====================
|
||||
# metadata stage
|
||||
# ====================
|
||||
codequality:
|
||||
stage: metadata
|
||||
image: docker:stable
|
||||
allow_failure: true
|
||||
services:
|
||||
- docker:stable-dind
|
||||
script:
|
||||
- export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/')
|
||||
- docker run
|
||||
--env SOURCE_CODE="$PWD"
|
||||
--volume "$PWD":/code
|
||||
--volume /var/run/docker.sock:/var/run/docker.sock
|
||||
"registry.gitlab.com/gitlab-org/security-products/codequality:$SP_VERSION" /code
|
||||
artifacts:
|
||||
paths: [codeclimate.json]
|
||||
tags:
|
||||
- docker
|
||||
- priv
|
||||
|
||||
trigger:
|
||||
stage: trigger
|
||||
stage: metadata
|
||||
script:
|
||||
- npmci trigger
|
||||
only:
|
||||
- tags
|
||||
tags:
|
||||
- docker
|
||||
- notpriv
|
||||
|
||||
pages:
|
||||
image: hosttoday/ht-docker-node:npmci
|
||||
stage: pages
|
||||
stage: metadata
|
||||
script:
|
||||
- npmci command yarn global add npmpage
|
||||
- npmci command npmpage
|
||||
- npmci command npm install -g typedoc typescript
|
||||
- npmci npm prepare
|
||||
- npmci npm install
|
||||
- npmci command typedoc --module "commonjs" --target "ES2016" --out public/ ts/
|
||||
tags:
|
||||
- docker
|
||||
- notpriv
|
||||
only:
|
||||
- tags
|
||||
artifacts:
|
||||
expire_in: 1 week
|
||||
paths:
|
||||
- public
|
||||
allow_failure: true
|
||||
|
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
|
19
license
Normal file
19
license
Normal file
@ -0,0 +1,19 @@
|
||||
Copyright (c) 2018 Lossless GmbH (hello@lossless.com)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
@ -1,7 +1,17 @@
|
||||
{
|
||||
"gitzone": {
|
||||
"module": {
|
||||
"githost": "gitlab.com",
|
||||
"gitscope": "pushrocks",
|
||||
"gitrepo": "smartuniverse",
|
||||
"shortDescription": "messaging service for micro services",
|
||||
"npmPackagename": "@pushrocks/smartuniverse",
|
||||
"license": "MIT",
|
||||
"projectDomain": "push.rocks"
|
||||
}
|
||||
},
|
||||
"npmci": {
|
||||
"npmGlobalTools": [
|
||||
"npmts"
|
||||
]
|
||||
"npmGlobalTools": [],
|
||||
"npmAccessLevel": "public"
|
||||
}
|
||||
}
|
||||
}
|
3027
package-lock.json
generated
Normal file
3027
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
37
package.json
37
package.json
@ -1,27 +1,38 @@
|
||||
{
|
||||
"name": "smartuniverse",
|
||||
"version": "1.0.4",
|
||||
"name": "@pushrocks/smartuniverse",
|
||||
"version": "1.0.32",
|
||||
"private": false,
|
||||
"description": "messaging service for your micro services",
|
||||
"main": "dist/index.js",
|
||||
"typings": "dist/index.d.ts",
|
||||
"author": "Lossless GmbH",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
"test": "(npmts)",
|
||||
"test": "(tstest test/)",
|
||||
"build": "(tsbuild)",
|
||||
"format": "(gitzone format)"
|
||||
},
|
||||
"devDependencies": {
|
||||
"tapbundle": "^2.0.0"
|
||||
"@gitzone/tsbuild": "^2.1.8",
|
||||
"@gitzone/tstest": "^1.0.20",
|
||||
"@pushrocks/tapbundle": "^3.0.9",
|
||||
"@types/node": "^11.13.4",
|
||||
"tslint": "^5.15.0",
|
||||
"tslint-config-prettier": "^1.18.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"rxjs": "*"
|
||||
},
|
||||
"dependencies": {
|
||||
"lik": "^2.0.5",
|
||||
"rxjs": "^5.5.7",
|
||||
"smartcli": "^2.0.12",
|
||||
"smartexpress": "^1.0.21",
|
||||
"smartfile": "^4.2.28",
|
||||
"smartrequest": "^1.0.8",
|
||||
"smartrx": "^1.0.5",
|
||||
"smartsocket": "^1.1.13",
|
||||
"smarttime": "^2.0.0"
|
||||
"@pushrocks/lik": "^3.0.5",
|
||||
"@pushrocks/smartdelay": "^2.0.3",
|
||||
"@pushrocks/smartexpress": "^3.0.18",
|
||||
"@pushrocks/smartfile": "^7.0.2",
|
||||
"@pushrocks/smarthash": "^2.0.4",
|
||||
"@pushrocks/smartpromise": "^3.0.2",
|
||||
"@pushrocks/smartrequest": "^1.1.14",
|
||||
"@pushrocks/smartrx": "^2.0.3",
|
||||
"@pushrocks/smartsocket": "^1.1.27",
|
||||
"@pushrocks/smarttime": "^3.0.7"
|
||||
}
|
||||
}
|
||||
|
32
readme.md
Normal file
32
readme.md
Normal file
@ -0,0 +1,32 @@
|
||||
# @pushrocks/smartuniverse
|
||||
messaging service for micro services
|
||||
|
||||
## Availabililty and Links
|
||||
* [npmjs.org (npm package)](https://www.npmjs.com/package/@pushrocks/smartuniverse)
|
||||
* [gitlab.com (source)](https://gitlab.com/pushrocks/smartuniverse)
|
||||
* [github.com (source mirror)](https://github.com/pushrocks/smartuniverse)
|
||||
* [docs (typedoc)](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://snyk.io/test/npm/@pushrocks/smartuniverse)
|
||||
[](https://nodejs.org/dist/latest-v10.x/docs/api/)
|
||||
[](https://nodejs.org/dist/latest-v10.x/docs/api/)
|
||||
[](https://prettier.io/)
|
||||
|
||||
## Usage
|
||||
|
||||
Use TypeScript for best in class instellisense.
|
||||
|
||||
### What does 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.
|
||||
|
||||
For further information read the linked docs at the top of this readme.
|
||||
|
||||
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
|
||||
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
|
||||
|
||||
[](https://maintainedby.lossless.com)
|
40
test/test.ts
40
test/test.ts
@ -1,36 +1,54 @@
|
||||
// tslint:disable-next-line:no-implicit-dependencies
|
||||
import { expect, tap } from 'tapbundle';
|
||||
import { expect, tap } from '@pushrocks/tapbundle';
|
||||
import * as smartuniverse from '../ts/index';
|
||||
|
||||
import { Observable } from 'rxjs';
|
||||
|
||||
let testUniverse: smartuniverse.Universe;
|
||||
let testUniverseClient: smartuniverse.UniverseClient
|
||||
let testUniverseClient: smartuniverse.ClientUniverse;
|
||||
let testClientChannel: smartuniverse.ClientUniverseChannel;
|
||||
|
||||
tap.test('first test', async () => {
|
||||
testUniverse = new smartuniverse.Universe({
|
||||
messageExpiryInMilliseconds: 5000
|
||||
messageExpiryInMilliseconds: 1000
|
||||
});
|
||||
});
|
||||
|
||||
tap.test('add a message to the SmartUniverse', async () => {
|
||||
await testUniverse.initServer(8765);
|
||||
})
|
||||
});
|
||||
|
||||
// testing message handling
|
||||
tap.test('create smartuniverse client', async () => {
|
||||
testUniverseClient = new smartuniverse.UniverseClient({
|
||||
testUniverseClient = new smartuniverse.ClientUniverse({
|
||||
serverAddress: 'http://localhost:8765'
|
||||
});
|
||||
expect(testUniverseClient).to.be.instanceof(smartuniverse.UniverseClient)
|
||||
})
|
||||
expect(testUniverseClient).to.be.instanceof(smartuniverse.ClientUniverse);
|
||||
});
|
||||
|
||||
tap.test('should add a channel to the universe', async () => {
|
||||
await testUniverse.addChannel('testChannel', 'testPassword');
|
||||
});
|
||||
|
||||
tap.test('should get a observable correctly', async () => {
|
||||
testClientChannel = await testUniverseClient.getChannel('testChannel');
|
||||
expect(testClientChannel).to.be.instanceof(smartuniverse.ClientUniverseChannel);
|
||||
});
|
||||
|
||||
tap.test('should send a message correctly', async () => {
|
||||
await testUniverseClient.sendMessage('greeting', {
|
||||
anyBool: true
|
||||
})
|
||||
})
|
||||
});
|
||||
});
|
||||
|
||||
tap.test('should end the server correctly', async () => {
|
||||
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();
|
||||
})
|
||||
});
|
||||
|
||||
tap.start();
|
||||
|
11
ts/index.ts
11
ts/index.ts
@ -1,2 +1,11 @@
|
||||
// Client classes
|
||||
export * from './smartuniverse.classes.clientuniverse';
|
||||
export * from './smartuniverse.classes.clientuniversechannel';
|
||||
|
||||
// Server classes
|
||||
export * from './smartuniverse.classes.universe';
|
||||
export * from './smartuniverse.classes.universeclient';
|
||||
export * from './smartuniverse.classes.universecache';
|
||||
export * from './smartuniverse.classes.universechannel';
|
||||
export * from './smartuniverse.classes.universemessage';
|
||||
|
||||
export * from './interfaces';
|
||||
|
15
ts/interfaces/http.interfaces.ts
Normal file
15
ts/interfaces/http.interfaces.ts
Normal 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
3
ts/interfaces/index.ts
Normal file
@ -0,0 +1,3 @@
|
||||
export * from './http.interfaces';
|
||||
export * from './universechannel.interfaces';
|
||||
export * from './universemessage.interfaces';
|
1
ts/interfaces/universechannel.interfaces.ts
Normal file
1
ts/interfaces/universechannel.interfaces.ts
Normal file
@ -0,0 +1 @@
|
||||
export interface IUniverseChannel {}
|
1
ts/interfaces/universemessage.interfaces.ts
Normal file
1
ts/interfaces/universemessage.interfaces.ts
Normal file
@ -0,0 +1 @@
|
||||
export interface IUniverseMessage {}
|
74
ts/smartuniverse.classes.clientuniverse.ts
Normal file
74
ts/smartuniverse.classes.clientuniverse.ts
Normal file
@ -0,0 +1,74 @@
|
||||
import * as plugins from './smartuniverse.plugins';
|
||||
|
||||
import { Objectmap } from '@pushrocks/lik';
|
||||
import { Observable } from 'rxjs';
|
||||
import { Smartsocket, SmartsocketClient } from '@pushrocks/smartsocket';
|
||||
import * as url from 'url';
|
||||
|
||||
import * as interfaces from './interfaces';
|
||||
|
||||
import {
|
||||
ClientUniverseChannel,
|
||||
UniverseMessage
|
||||
} from './';
|
||||
|
||||
export interface IClientOptions {
|
||||
serverAddress: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* this class is for client side only!!!
|
||||
* allows connecting to a universe server
|
||||
*/
|
||||
export class ClientUniverse {
|
||||
public options;
|
||||
public socketClient: plugins.smartsocket.SmartsocketClient;
|
||||
public observableIntake: plugins.smartrx.ObservableIntake<UniverseMessage>;
|
||||
|
||||
public channelCache = new Objectmap<ClientUniverseChannel>();
|
||||
|
||||
constructor(optionsArg: IClientOptions) {
|
||||
this.options = optionsArg;
|
||||
}
|
||||
|
||||
public async sendMessage(messageArg, payloadArg) {
|
||||
const requestBody: interfaces.IUniverseMessage = {
|
||||
message: messageArg,
|
||||
payload: payloadArg
|
||||
};
|
||||
const requestBodyString = JSON.stringify(requestBody);
|
||||
// TODO: User websocket connection if available
|
||||
const response = await plugins.smartrequest.postJson(`${this.options.serverAddress}/sendmessage` , {
|
||||
requestBody: requestBodyString
|
||||
});
|
||||
}
|
||||
|
||||
public async getChannel(channelName: string, passphrase): Promise<ClientUniverseChannel> {
|
||||
await this.checkConnection();
|
||||
const clientUniverseChannel = await ClientUniverseChannel.createClientUniverseChannel(
|
||||
this,
|
||||
channelName
|
||||
);
|
||||
this.channelCache.add(clientUniverseChannel);
|
||||
return clientUniverseChannel;
|
||||
}
|
||||
|
||||
public close() {
|
||||
this.socketClient.disconnect();
|
||||
}
|
||||
|
||||
private async checkConnection() {
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
35
ts/smartuniverse.classes.clientuniversechannel.ts
Normal file
35
ts/smartuniverse.classes.clientuniversechannel.ts
Normal file
@ -0,0 +1,35 @@
|
||||
import * as plugins from './smartuniverse.plugins';
|
||||
import * as interfaces from './interfaces';
|
||||
|
||||
import { ClientUniverse } from './';
|
||||
|
||||
export class ClientUniverseChannel implements interfaces.IUniverseChannel {
|
||||
// ======
|
||||
// STATIC
|
||||
// ======
|
||||
public static async createClientUniverseChannel(
|
||||
clientUniverseArg: ClientUniverse,
|
||||
channelName: string
|
||||
): Promise<ClientUniverseChannel> {
|
||||
const clientChannel = new ClientUniverseChannel(clientUniverseArg);
|
||||
await clientChannel.transmitSubscription();
|
||||
return clientChannel;
|
||||
}
|
||||
|
||||
// ========
|
||||
// INSTANCE
|
||||
// ========
|
||||
|
||||
public clientUniverse: ClientUniverse;
|
||||
|
||||
constructor(clientUniverseArg: ClientUniverse) {
|
||||
this.clientUniverse = clientUniverseArg;
|
||||
}
|
||||
|
||||
/**
|
||||
* tells the universe about this instances interest into a channel
|
||||
*/
|
||||
public async transmitSubscription() {
|
||||
this.clientUniverse.socketClient;
|
||||
}
|
||||
}
|
21
ts/smartuniverse.classes.clientuniversemessage.ts
Normal file
21
ts/smartuniverse.classes.clientuniversemessage.ts
Normal file
@ -0,0 +1,21 @@
|
||||
import * as plugins from './smartuniverse.plugins';
|
||||
|
||||
import * as interfaces from './interfaces';
|
||||
|
||||
export class ClientUniverseMessage implements interfaces.IUniverseMessage {
|
||||
// ======
|
||||
// STATIC
|
||||
// ======
|
||||
public static createMessageFromPayload(messageArg: string, payloadArg: any) {
|
||||
|
||||
};
|
||||
|
||||
// ========
|
||||
// INSTANCE
|
||||
// ========
|
||||
constructor(messageArg, payloadArg) {}
|
||||
|
||||
getAsJsonForPayload () {
|
||||
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
import * as plugins from './smartuniverse.plugins';
|
||||
|
||||
import { Objectmap } from 'lik';
|
||||
|
||||
export class UniverseManager {
|
||||
|
||||
public async registerMember () {
|
||||
|
||||
}
|
||||
}
|
@ -1,36 +1,38 @@
|
||||
import * as plugins from './smartuniverse.plugins';
|
||||
|
||||
import { Handler, Route, Server } from 'smartexpress';
|
||||
import { Handler, Route, Server } from '@pushrocks/smartexpress';
|
||||
import { UniverseCache, UniverseChannel, UniverseMessage } from './';
|
||||
|
||||
import { UniverseManager } from './smartuniverse.classes.manager';
|
||||
import { UniverseMessage } from './smartuniverse.classes.universemessage';
|
||||
import { UniverseStore } from './smartuniverse.classes.universestore';
|
||||
import * as paths from './smartuniverse.paths';
|
||||
|
||||
import * as interfaces from './interfaces';
|
||||
|
||||
export interface ISmartUniverseConstructorOptions {
|
||||
messageExpiryInMilliseconds: number;
|
||||
}
|
||||
|
||||
export interface IServerGetMessagesRequestBody {
|
||||
youngerThan: number;
|
||||
}
|
||||
|
||||
export interface IServerPutMessageRequestBody {
|
||||
message: string,
|
||||
payload: any
|
||||
}
|
||||
|
||||
/**
|
||||
* main class that setsup a Universe
|
||||
*/
|
||||
export class Universe {
|
||||
// subinstances
|
||||
public universeStore: UniverseStore;
|
||||
public universeManager: UniverseManager;
|
||||
public universeCache: UniverseCache;
|
||||
|
||||
// options
|
||||
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 get universeVersion() {
|
||||
|
||||
/**
|
||||
* get the currently running version of smartuniverse
|
||||
*/
|
||||
public get universeVersion() {
|
||||
if (this.universeVersionStore) {
|
||||
return this.universeVersionStore;
|
||||
} else {
|
||||
@ -40,49 +42,82 @@ export class Universe {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* the smartexpress server used
|
||||
*/
|
||||
private smartexpressServer: plugins.smartexpress.Server;
|
||||
|
||||
|
||||
/**
|
||||
* the smartsocket used
|
||||
*/
|
||||
private smartsocket: plugins.smartsocket.Smartsocket;
|
||||
|
||||
constructor(optionsArg: ISmartUniverseConstructorOptions) {
|
||||
this.options = optionsArg;
|
||||
this.universeStore = new UniverseStore(this.options.messageExpiryInMilliseconds);
|
||||
this.universeManager = new UniverseManager();
|
||||
this.universeCache = new UniverseCache(this.options.messageExpiryInMilliseconds);
|
||||
}
|
||||
|
||||
/**
|
||||
* adds a channel to the Universe
|
||||
*/
|
||||
public async addChannel(nameArg: string, passphraseArg: string) {
|
||||
const newChannel = UniverseChannel.createChannel(this.universeCache, nameArg, passphraseArg);
|
||||
}
|
||||
|
||||
/**
|
||||
* initiates a server
|
||||
*/
|
||||
public async initServer(portArg: number | string) {
|
||||
// lets create the base smartexpress server
|
||||
this.smartexpressServer = new plugins.smartexpress.Server({
|
||||
cors: true,
|
||||
defaultAnswer: `smartuniverse server ${this.universeVersion}`,
|
||||
defaultAnswer: async () => {
|
||||
return `smartuniverse server ${this.universeVersion}`;
|
||||
},
|
||||
forceSsl: false,
|
||||
port: portArg
|
||||
});
|
||||
|
||||
// route handling
|
||||
// adds messages
|
||||
const addMessageHandler = new Handler('PUT', request => {
|
||||
const requestBody = request.body;
|
||||
this.universeStore.addMessage(requestBody.message, requestBody.payload);
|
||||
console.log(requestBody);
|
||||
return true;
|
||||
// lets create the http request route
|
||||
this.smartexpressServer.addRoute('/sendmessage', new Handler('POST', async (req, res) => {
|
||||
this.universeCache.addMessage(req.body);
|
||||
}));
|
||||
|
||||
// add websocket upgrade
|
||||
this.smartsocket = new plugins.smartsocket.Smartsocket({
|
||||
port: 12345 // fix this within smartsocket
|
||||
});
|
||||
|
||||
// gets messages
|
||||
const readMessageHandler = new Handler('GET', request => {
|
||||
const requestBody = request.body;
|
||||
this.universeStore.readMessagesYoungerThan(requestBody.since);
|
||||
})
|
||||
// add a role for the clients
|
||||
const ClientRole = new plugins.smartsocket.SocketRole({
|
||||
name: 'clientuniverse',
|
||||
passwordHash: 'clientuniverse' // authentication happens on another level
|
||||
});
|
||||
|
||||
const messageRoute = new Route(this.smartexpressServer, 'message');
|
||||
messageRoute.addHandler(addMessageHandler);
|
||||
messageRoute.addHandler(readMessageHandler);
|
||||
// add the role to smartsocket
|
||||
this.smartsocket.addSocketRoles([ClientRole]);
|
||||
|
||||
const SubscriptionSocketFunction = new plugins.smartsocket.SocketFunction({
|
||||
allowedRoles: [ClientRole],
|
||||
funcName: 'channelSubscription',
|
||||
funcDef: () => {} // TODO: implement an action upon connection of clients
|
||||
});
|
||||
|
||||
// add smartsocket to the running smartexpress app
|
||||
this.smartsocket.setExternalServer('express', this.smartexpressServer as any);
|
||||
|
||||
// start the socket
|
||||
this.smartsocket.start();
|
||||
|
||||
// start the smartexpress instance
|
||||
await this.smartexpressServer.start();
|
||||
}
|
||||
|
||||
public async stopServer () {
|
||||
/**
|
||||
* stop everything
|
||||
*/
|
||||
public async stopServer() {
|
||||
await this.smartsocket.stop();
|
||||
await this.smartexpressServer.stop();
|
||||
}
|
||||
}
|
||||
|
63
ts/smartuniverse.classes.universecache.ts
Normal file
63
ts/smartuniverse.classes.universecache.ts
Normal file
@ -0,0 +1,63 @@
|
||||
import * as plugins from './smartuniverse.plugins';
|
||||
|
||||
import { UniverseChannel } from './smartuniverse.classes.universechannel';
|
||||
import { UniverseMessage } from './smartuniverse.classes.universemessage';
|
||||
|
||||
import { Objectmap } from '@pushrocks/lik';
|
||||
|
||||
import { Observable, from } from 'rxjs';
|
||||
import { filter } from 'rxjs/operators';
|
||||
import { rxjs } from '@pushrocks/smartrx';
|
||||
|
||||
/**
|
||||
* universe store handles the creation, storage and retrieval of messages.
|
||||
*/
|
||||
export class UniverseCache {
|
||||
// ========
|
||||
// INSTANCE
|
||||
// ========
|
||||
public standardMessageExpiry: number;
|
||||
public destructionTime: number = 60000;
|
||||
|
||||
/**
|
||||
* stores messages for this instance
|
||||
*/
|
||||
public messageMap = new Objectmap<UniverseMessage>();
|
||||
|
||||
/**
|
||||
* stores the channels that are available within the universe
|
||||
*/
|
||||
public channelMap = new Objectmap<UniverseChannel>();
|
||||
|
||||
/**
|
||||
* allows messages to be processed in a blacklist mode for further analysis
|
||||
*/
|
||||
public blackListChannel = new UniverseChannel(this, 'blacklist', 'nada');
|
||||
|
||||
constructor(standardMessageExpiryArg: number) {
|
||||
this.standardMessageExpiry = standardMessageExpiryArg;
|
||||
}
|
||||
|
||||
/**
|
||||
* add a message to the UniverseCache
|
||||
* @param messageArg
|
||||
* @param attachedPayloadArg
|
||||
*/
|
||||
public async addMessage(messageArg: UniverseMessage) {
|
||||
messageArg.setUniverseCache(this);
|
||||
UniverseChannel.authorizeAMessageForAChannel(this, messageArg);
|
||||
this.messageMap.add(messageArg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Read a message from the UniverseCache
|
||||
*/
|
||||
public readMessagesYoungerThan(unixTimeArg?: number): Observable<UniverseMessage> {
|
||||
const messageObservable = from(this.messageMap.getArray()).pipe(
|
||||
filter(messageArg => {
|
||||
return messageArg.timestamp.isYoungerThanMilliSeconds(this.destructionTime);
|
||||
})
|
||||
);
|
||||
return messageObservable;
|
||||
}
|
||||
}
|
92
ts/smartuniverse.classes.universechannel.ts
Normal file
92
ts/smartuniverse.classes.universechannel.ts
Normal file
@ -0,0 +1,92 @@
|
||||
import * as plugins from './smartuniverse.plugins';
|
||||
|
||||
import { Objectmap } from '@pushrocks/lik';
|
||||
import { UniverseCache } from './smartuniverse.classes.universecache';
|
||||
import { UniverseMessage } from './smartuniverse.classes.universemessage';
|
||||
|
||||
/**
|
||||
* enables messages to stay within a certain scope.
|
||||
*/
|
||||
export class UniverseChannel {
|
||||
// ======
|
||||
// STATIC
|
||||
// ======
|
||||
|
||||
/**
|
||||
* creates new channels
|
||||
* @param channelArg the name of the topic
|
||||
* @param passphraseArg the secret thats used for a certain topic.
|
||||
*/
|
||||
public static createChannel(
|
||||
universeCacheArg: UniverseCache,
|
||||
channelNameArg: string,
|
||||
passphraseArg: string
|
||||
) {
|
||||
const newChannel = new UniverseChannel(universeCacheArg, channelNameArg, passphraseArg);
|
||||
universeCacheArg.channelMap.add(newChannel);
|
||||
return newChannel;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns boolean wether certain channel exists
|
||||
*/
|
||||
public static async doesChannelExists(universeCacheArg: UniverseCache, channelNameArg: string) {
|
||||
const channel = universeCacheArg.channelMap.find(channelArg => {
|
||||
return channelArg.name === channelNameArg;
|
||||
});
|
||||
if (channel) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static authorizeAMessageForAChannel(
|
||||
universeCacheArg: UniverseCache,
|
||||
universeMessageArg: UniverseMessage
|
||||
) {
|
||||
const foundChannel = universeCacheArg.channelMap.find(universeChannel => {
|
||||
const result = universeChannel.authenticate(universeMessageArg);
|
||||
return result;
|
||||
});
|
||||
if (foundChannel) {
|
||||
universeMessageArg.authenticated = true;
|
||||
universeMessageArg.universeChannelList.add(foundChannel);
|
||||
return foundChannel;
|
||||
} else {
|
||||
universeMessageArg.authenticated = false;
|
||||
universeMessageArg.universeChannelList.add(universeCacheArg.blackListChannel);
|
||||
}
|
||||
}
|
||||
|
||||
// ========
|
||||
// INSTANCE
|
||||
// ========
|
||||
/**
|
||||
* the name of the channel
|
||||
*/
|
||||
public name: string;
|
||||
public universeCacheInstance: UniverseCache;
|
||||
|
||||
/**
|
||||
* the passphrase for the channel
|
||||
*/
|
||||
public passphrase: string;
|
||||
|
||||
constructor(universeCacheArg: UniverseCache, channelNameArg: string, passphraseArg: string) {
|
||||
this.name = channelNameArg;
|
||||
this.passphrase = passphraseArg;
|
||||
}
|
||||
|
||||
/**
|
||||
* authenticates a client on the server side
|
||||
*/
|
||||
public authenticate(universeMessageArg: UniverseMessage): boolean {
|
||||
return (
|
||||
this.name === universeMessageArg.requestedChannelName &&
|
||||
this.passphrase === universeMessageArg.requestedChannelPassphrase
|
||||
);
|
||||
}
|
||||
|
||||
public pushToClients(messageArg: UniverseMessage) {}
|
||||
}
|
@ -1,30 +0,0 @@
|
||||
import * as plugins from './smartuniverse.plugins';
|
||||
|
||||
import { Observable } from 'rxjs';
|
||||
import { IServerGetMessagesRequestBody, IServerPutMessageRequestBody } from './smartuniverse.classes.universe'
|
||||
|
||||
export interface IClientOptions {
|
||||
serverAddress: string
|
||||
}
|
||||
|
||||
export class UniverseClient {
|
||||
public options;
|
||||
|
||||
constructor(optionsArg: IClientOptions) {
|
||||
this.options = optionsArg;
|
||||
}
|
||||
|
||||
public async sendMessage(messageArg, payloadArg) {
|
||||
const requestBody = {
|
||||
message: messageArg,
|
||||
payload: payloadArg
|
||||
}
|
||||
await plugins.smartrequest.post(this.options.serverAddress, {
|
||||
requestBody: requestBody
|
||||
})
|
||||
}
|
||||
|
||||
public getMessageObservable () {
|
||||
|
||||
}
|
||||
}
|
@ -1,8 +1,16 @@
|
||||
import * as plugins from './smartuniverse.plugins';
|
||||
|
||||
import { Timer, TimeStamp } from 'smarttime';
|
||||
import { UniverseStore } from './smartuniverse.classes.universestore';
|
||||
import { Objectmap } from '@pushrocks/lik';
|
||||
|
||||
import { Timer, TimeStamp } from '@pushrocks/smarttime';
|
||||
import { Universe } from './smartuniverse.classes.universe';
|
||||
import { UniverseChannel } from './smartuniverse.classes.universechannel';
|
||||
import { UniverseCache } from './smartuniverse.classes.universecache';
|
||||
|
||||
/**
|
||||
* represents a message within a universe
|
||||
* acts as a container to save message states like authentication status
|
||||
*/
|
||||
export class UniverseMessage {
|
||||
/**
|
||||
* public and unique id
|
||||
@ -11,23 +19,97 @@ export class UniverseMessage {
|
||||
* avoids duplications though
|
||||
*/
|
||||
public id: number;
|
||||
public universeStore: UniverseStore;
|
||||
public timestamp: TimeStamp;
|
||||
public message: string;
|
||||
public attachedPayload: any;
|
||||
public destructionTimer: Timer;
|
||||
|
||||
constructor(parentUniverseStore: UniverseStore, messageArg: string, attachedPayloadArg: any, selfdestructAfterArg: number) {
|
||||
this.universeStore = parentUniverseStore;
|
||||
/**
|
||||
* the UniverseCache the message is attached to
|
||||
*/
|
||||
public universeCache: UniverseCache;
|
||||
|
||||
/**
|
||||
* requestedChannelName
|
||||
*/
|
||||
public requestedChannelName: string;
|
||||
public requestedChannelPassphrase: string;
|
||||
|
||||
/**
|
||||
* enables unprotected grouping of messages for efficiency purposes.
|
||||
*/
|
||||
public universeChannelList = new Objectmap<UniverseChannel>();
|
||||
|
||||
/**
|
||||
* wether the message is authenticated
|
||||
*/
|
||||
public authenticated: boolean = null;
|
||||
|
||||
/**
|
||||
* time of creation
|
||||
*/
|
||||
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
|
||||
|
||||
/**
|
||||
* the constructor to create a universe message
|
||||
* @param messageArg
|
||||
* @param attachedPayloadArg
|
||||
*/
|
||||
constructor(
|
||||
messageArg: string,
|
||||
requestedChannelNameArg: string,
|
||||
passphraseArg: string,
|
||||
attachedPayloadArg: any
|
||||
) {
|
||||
this.timestamp = new TimeStamp();
|
||||
this.message = messageArg;
|
||||
this.requestedChannelName = requestedChannelNameArg;
|
||||
this.requestedChannelPassphrase = passphraseArg;
|
||||
this.attachedPayload = attachedPayloadArg;
|
||||
this.destructionTimer = new Timer(selfdestructAfterArg)
|
||||
this.destructionTimer.start()
|
||||
// prevent memory issues
|
||||
this.fallBackDestruction();
|
||||
}
|
||||
|
||||
// set up self destruction by removing this from the parent messageStore
|
||||
this.destructionTimer.completed.then(async () => {
|
||||
this.universeStore.messageStore.remove(this);
|
||||
})
|
||||
public setUniverseCache(universeCacheArg: UniverseCache) {
|
||||
this.universeCache = universeCacheArg;
|
||||
}
|
||||
|
||||
public setDestructionTimer(selfdestructAfterArg: number) {
|
||||
if (selfdestructAfterArg) {
|
||||
this.destructionTimer = new Timer(selfdestructAfterArg);
|
||||
this.destructionTimer.start();
|
||||
|
||||
// set up self destruction by removing this from the parent messageCache
|
||||
this.destructionTimer.completed.then(async () => {
|
||||
this.universeCache.messageMap.remove(this);
|
||||
});
|
||||
} else {
|
||||
this.fallBackDestruction();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* handles bad messages for further analysis
|
||||
*/
|
||||
handleAsBadMessage() {
|
||||
console.log('received a bad message');
|
||||
}
|
||||
|
||||
/**
|
||||
* prevents memory leaks if channels have no default
|
||||
*/
|
||||
private fallBackDestruction() {
|
||||
plugins.smartdelay.delayFor(1000).then(() => {
|
||||
if (!this.destructionTimer) {
|
||||
this.setDestructionTimer(6000);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -1,41 +0,0 @@
|
||||
import * as plugins from './smartuniverse.plugins';
|
||||
|
||||
import { UniverseMessage } from './smartuniverse.classes.universemessage';
|
||||
|
||||
import { Objectmap } from 'lik'
|
||||
|
||||
import { Observable } from 'rxjs';
|
||||
import { rxjs } from 'smartrx'
|
||||
|
||||
export class UniverseStore {
|
||||
public standardMessageExpiry: number;
|
||||
public destructionTime: number = 60000;
|
||||
public messageStore = new Objectmap<UniverseMessage>();
|
||||
private lastId: number = 0; // stores the last id
|
||||
|
||||
constructor(standardMessageExpiryArg: number) {
|
||||
this.standardMessageExpiry = standardMessageExpiryArg;
|
||||
}
|
||||
|
||||
/**
|
||||
* add a message to the UniverseStore
|
||||
* @param messageArg
|
||||
* @param attachedPayloadArg
|
||||
*/
|
||||
public addMessage(messageArg, attachedPayloadArg) {
|
||||
this.messageStore.add(new UniverseMessage(this, messageArg, attachedPayloadArg, this.destructionTime));
|
||||
}
|
||||
|
||||
/**
|
||||
* Read a message from the UniverseStore
|
||||
*/
|
||||
public readMessagesYoungerThan(unixTimeArg?: number): Observable<UniverseMessage> {
|
||||
const messageObservable = rxjs.Observable
|
||||
.from(this.messageStore.getArray())
|
||||
.filter(messageArg => {
|
||||
return messageArg.timestamp.isYoungerThanMilliSeconds(this.destructionTime);
|
||||
});
|
||||
return messageObservable;
|
||||
|
||||
}
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
import * as plugins from './smartuniverse.plugins';
|
||||
|
||||
import { Universe } from './index';
|
||||
|
||||
process.env.CLI = 'true';
|
||||
|
||||
const universeCli = new plugins.smartcli.Smartcli();
|
||||
|
||||
universeCli.standardTask().then(async argvArg => {
|
||||
const standardUniverse = new Universe({
|
||||
messageExpiryInMilliseconds: 60000
|
||||
});
|
||||
await standardUniverse.initServer(8765);
|
||||
|
||||
});
|
@ -1,11 +1,29 @@
|
||||
import * as lik from 'lik';
|
||||
// node native
|
||||
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 };
|
||||
export { path };
|
||||
|
||||
// pushrocks scope
|
||||
import * as lik from '@pushrocks/lik';
|
||||
import * as smarthash from '@pushrocks/smarthash';
|
||||
import * as smartdelay from '@pushrocks/smartdelay';
|
||||
import * as smartexpress from '@pushrocks/smartexpress';
|
||||
import * as smartfile from '@pushrocks/smartfile';
|
||||
import * as smartpromise from '@pushrocks/smartpromise';
|
||||
import * as smartrequest from '@pushrocks/smartrequest';
|
||||
import * as smartrx from '@pushrocks/smartrx';
|
||||
import * as smartsocket from '@pushrocks/smartsocket';
|
||||
import * as smarttime from '@pushrocks/smarttime';
|
||||
|
||||
export {
|
||||
lik,
|
||||
smarthash,
|
||||
smartdelay,
|
||||
smartexpress,
|
||||
smartfile,
|
||||
smartpromise,
|
||||
smartrx,
|
||||
smartrequest,
|
||||
smartsocket,
|
||||
smarttime
|
||||
};
|
||||
|
19
tslint.json
19
tslint.json
@ -1,6 +1,17 @@
|
||||
{
|
||||
"extends": [
|
||||
"tslint:latest",
|
||||
"tslint-config-prettier"
|
||||
]
|
||||
"extends": ["tslint:latest", "tslint-config-prettier"],
|
||||
"rules": {
|
||||
"semicolon": [true, "always"],
|
||||
"no-console": false,
|
||||
"ordered-imports": false,
|
||||
"object-literal-sort-keys": false,
|
||||
"member-ordering": {
|
||||
"options":{
|
||||
"order": [
|
||||
"static-method"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"defaultSeverity": "warning"
|
||||
}
|
||||
|
Reference in New Issue
Block a user