Compare commits

..

28 Commits

Author SHA1 Message Date
0aa073f2a7 1.1.10 2017-07-15 23:16:26 +02:00
7170e58457 update smartsocket class to use standard class method definition 2017-07-15 23:16:22 +02:00
cccee35f2c 1.1.9 2017-07-07 22:38:14 +02:00
118ec84ec5 update docs 2017-07-07 22:38:10 +02:00
dd31eea263 update tests 2017-07-07 22:10:03 +02:00
477429143d 1.1.8 2017-07-07 22:03:22 +02:00
ea6fa14133 remove taskbuffer 2017-07-07 22:03:18 +02:00
02065e36a6 update to latest standards 2017-07-07 22:02:19 +02:00
f34358db81 update README 2016-09-26 16:59:06 +02:00
fddf54b2b1 1.1.7 2016-09-26 00:28:45 +02:00
e1dbdc1a15 improve README 2016-09-26 00:28:39 +02:00
f3031a1d4e 1.1.6 2016-09-26 00:23:28 +02:00
47ca497d48 improve README 2016-09-26 00:23:17 +02:00
c7e3c4537b 1.1.5 2016-09-05 00:34:13 +02:00
62b36ab859 fix scoping of socket roles 2016-09-05 00:34:09 +02:00
4563aade16 small syntax fix 2016-09-04 22:20:33 +02:00
47596bfa59 1.1.4 2016-09-03 16:21:00 +02:00
6543d60019 added docs 2016-09-03 16:03:57 +02:00
f0aba45cec 1.1.3 2016-09-03 00:41:52 +02:00
f327fa2784 updated dependencies and exported socketConnection 2016-09-03 00:41:49 +02:00
983b4672fd 1.1.2 2016-08-16 04:48:47 +02:00
c81a41b365 now authenticating sockets by checking the password hash 2016-08-16 04:48:42 +02:00
abe4d22226 1.1.1 2016-08-15 03:47:36 +02:00
87cc238345 update README 2016-08-15 03:47:32 +02:00
475cd12904 1.1.0 2016-08-15 02:36:24 +02:00
84f33fa447 now working in both directions so mesh setups work. 2016-08-15 02:36:17 +02:00
180ae23c9a 1.0.7 2016-08-15 01:38:38 +02:00
7f0fff0bf4 updated tests. Data now flows correctly between socket endpoints 2016-08-15 01:38:28 +02:00
38 changed files with 1848 additions and 744 deletions

3
.gitignore vendored
View File

@ -1,3 +1,4 @@
node_modules/ node_modules/
coverage/ coverage/
docs/ pages/

View File

@ -1,20 +1,31 @@
image: hosttoday/ht-docker-node:npmts # gitzone standard
image: hosttoday/ht-docker-node:npmci
cache:
paths:
- .yarn/
key: "$CI_BUILD_STAGE"
stages: stages:
- test - test
- release - release
- trigger
- pages
testLEGACY: testLEGACY:
stage: test stage: test
script: script:
- npmci test legacy - npmci test legacy
coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- docker - docker
allow_failure: true
testLTS: testLTS:
stage: test stage: test
script: script:
- npmci test lts - npmci test lts
coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- docker - docker
@ -22,15 +33,40 @@ testSTABLE:
stage: test stage: test
script: script:
- npmci test stable - npmci test stable
coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- docker - docker
release: release:
stage: release stage: release
environment: npmjs-com_registry
script: script:
- npmci publish - npmci publish
only: only:
- tags - tags
tags: tags:
- docker - docker
trigger:
stage: trigger
script:
- npmci trigger
only:
- tags
tags:
- docker
pages:
image: hosttoday/ht-docker-node:npmci
stage: pages
script:
- npmci command yarn global add npmpage
- npmci command npmpage
tags:
- docker
only:
- tags
artifacts:
expire_in: 1 week
paths:
- public
allow_failure: true

View File

@ -1,67 +1,29 @@
# smartsocket # smartsocket
easy and secure websocket communication, Typescript ready easy and secure websocket communication, TypeScript ready
## Status ## Availabililty
[![build status](https://gitlab.com/pushrocks/smartsocket/badges/master/build.svg)](https://gitlab.com/pushrocks/smartsocket/commits/master) [![npm](https://pushrocks.gitlab.io/assets/repo-button-npm.svg)](https://www.npmjs.com/package/smartsocket)
[![git](https://pushrocks.gitlab.io/assets/repo-button-git.svg)](https://GitLab.com/pushrocks/smartsocket)
[![git](https://pushrocks.gitlab.io/assets/repo-button-mirror.svg)](https://github.com/pushrocks/smartsocket)
[![docs](https://pushrocks.gitlab.io/assets/repo-button-docs.svg)](https://pushrocks.gitlab.io/smartsocket/)
## Status for master
[![build status](https://GitLab.com/pushrocks/smartsocket/badges/master/build.svg)](https://GitLab.com/pushrocks/smartsocket/commits/master)
[![coverage report](https://GitLab.com/pushrocks/smartsocket/badges/master/coverage.svg)](https://GitLab.com/pushrocks/smartsocket/commits/master)
[![npm downloads per month](https://img.shields.io/npm/dm/smartsocket.svg)](https://www.npmjs.com/package/smartsocket)
[![Dependency Status](https://david-dm.org/pushrocks/smartsocket.svg)](https://david-dm.org/pushrocks/smartsocket)
[![bitHound Dependencies](https://www.bithound.io/github/pushrocks/smartsocket/badges/dependencies.svg)](https://www.bithound.io/github/pushrocks/smartsocket/master/dependencies/npm)
[![bitHound Code](https://www.bithound.io/github/pushrocks/smartsocket/badges/code.svg)](https://www.bithound.io/github/pushrocks/smartsocket)
[![TypeScript](https://img.shields.io/badge/TypeScript-2.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/)
[![node](https://img.shields.io/badge/node->=%206.x.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/)
[![JavaScript Style Guide](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](http://standardjs.com/)
## Usage ## Usage
We recommend the use of typescript. Use TypeScript for best in class instellisense.
Under the hood we use socket.io and shortid for managed data exchange.
### Serverside For further information read the linked docs at the top of this README.
```typescript
import * as smartsocket from "smartsocket";
let mySmartsocket = new smartsocket.Smartsocket({ > MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
port: 3000 // the port smartsocket will listen on | By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
});
let mySocketRole = new smartsocket.SocketRole({ [![repo-footer](https://pushrocks.gitlab.io/assets/repo-footer.svg)](https://push.rocks)
name: "someRoleName",
passwordHash: "someHashedString"
});
let mySocketFunction = new smartsocket.SocketFunction({
name:"newService",
func:(data) => {
}, the function to execute
roles:[mySocketRole] // all roles that have access to a specific function
});
mySmartsocket.registerRole(mySocketRole);
mySmartsocket.clientCall.select("client1","restart",data)
.then((responseData) => {
});
```
#### Client side
```typescript
import * as smartsocket from "smartsocket";
let mySmartsocketClient = new smartsocket.SmartsocketClient({
url: "somedomain.com", // url, note: will only work over https, no http supported.
port: 3000
role:"dockerhost", // some role, in this example a dockerhost vm,
password:"somePassword",
alias:"client1"
});
let mySocketFunction2 = new smartsocket.SocketFunction({
name:"restart",
func:(data) => {}, the function to execute
});
mySmartsocketClient.registerFunction(mySocketFunction2);
mySmartsocketClient.serverCall("newService",data)
.then((responseData) => {
});;
```
> **NOTE:**
you can easily chain dependent requests on eiter the server or client side with promises.
`data` is always a js object that you can design for your specific needs.
It supports buffers for large binary data network exchange.

9
dist/index.d.ts vendored
View File

@ -1,4 +1,5 @@
export * from "./smartsocket.classes.smartsocket"; export * from './smartsocket.classes.smartsocket';
export * from "./smartsocket.classes.smartsocketclient"; export * from './smartsocket.classes.smartsocketclient';
export * from "./smartsocket.classes.socketfunction"; export * from './smartsocket.classes.socketfunction';
export * from "./smartsocket.classes.socketrole"; export * from './smartsocket.classes.socketrole';
export * from './smartsocket.classes.socketconnection';

6
dist/index.js vendored
View File

@ -2,9 +2,13 @@
function __export(m) { function __export(m) {
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
} }
Object.defineProperty(exports, "__esModule", { value: true });
// export main classes
__export(require("./smartsocket.classes.smartsocket")); __export(require("./smartsocket.classes.smartsocket"));
__export(require("./smartsocket.classes.smartsocketclient")); __export(require("./smartsocket.classes.smartsocketclient"));
// export further classes and objects
__export(require("./smartsocket.classes.socketfunction")); __export(require("./smartsocket.classes.socketfunction"));
__export(require("./smartsocket.classes.socketrole")); __export(require("./smartsocket.classes.socketrole"));
__export(require("./smartsocket.classes.socketconnection"));
// need something more exposed? Create an issue on GitLab! // need something more exposed? Create an issue on GitLab!
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBRUEsaUJBQWMsbUNBQW1DLENBQUMsRUFBQTtBQUNsRCxpQkFBYyx5Q0FBeUMsQ0FBQyxFQUFBO0FBQ3hELGlCQUFjLHNDQUFzQyxDQUFDLEVBQUE7QUFDckQsaUJBQWMsa0NBQWtDLENBQUMsRUFBQTtBQUVqRCwwREFBMEQifQ== //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUVBLHNCQUFzQjtBQUN0Qix1REFBaUQ7QUFDakQsNkRBQXVEO0FBRXZELHFDQUFxQztBQUNyQywwREFBb0Q7QUFDcEQsc0RBQWdEO0FBQ2hELDREQUFzRDtBQUV0RCwwREFBMEQifQ==

View File

@ -1,6 +1,7 @@
/// <reference types="socket.io" /> /// <reference types="socket.io" />
import { Objectmap } from "lik"; import { Objectmap } from 'lik';
import { SocketConnection } from "./smartsocket.classes.socketconnection"; import { SocketConnection } from './smartsocket.classes.socketconnection';
import { SocketRole } from './smartsocket.classes.socketrole';
export interface ISmartsocketConstructorOptions { export interface ISmartsocketConstructorOptions {
port: number; port: number;
} }
@ -8,15 +9,26 @@ export declare class Smartsocket {
options: ISmartsocketConstructorOptions; options: ISmartsocketConstructorOptions;
io: SocketIO.Server; io: SocketIO.Server;
openSockets: Objectmap<SocketConnection>; openSockets: Objectmap<SocketConnection>;
socketRoles: Objectmap<SocketRole>;
constructor(optionsArg: ISmartsocketConstructorOptions); constructor(optionsArg: ISmartsocketConstructorOptions);
/**
* starts listening to incoming sockets:
*/
startServer(): Promise<void>;
/**
* closes the server
*/
closeServer(): Promise<void>;
/**
* allows call to specific client.
*/
clientCall(functionNameArg: string, dataArg: any, targetSocketConnectionArg: SocketConnection): Promise<{}>;
/**
* adds socketRoles
*/
addSocketRoles(socketRolesArray: SocketRole[]): void;
/** /**
* the standard handler for new socket connections * the standard handler for new socket connections
*/ */
private _handleSocketConnection(socketArg); private _handleSocketConnection(socketArg);
/**
* starts listening to incling sockets:
*/
startServer: () => void;
closeServer: () => void;
clientCall(): void;
} }

View File

@ -1,32 +1,78 @@
"use strict"; "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("./smartsocket.plugins"); const plugins = require("./smartsocket.plugins");
// classes // classes
const lik_1 = require("lik"); const lik_1 = require("lik");
const smartsocket_classes_socketconnection_1 = require("./smartsocket.classes.socketconnection"); const smartsocket_classes_socketconnection_1 = require("./smartsocket.classes.socketconnection");
; const smartsocket_classes_socketrequest_1 = require("./smartsocket.classes.socketrequest");
class Smartsocket { class Smartsocket {
constructor(optionsArg) { constructor(optionsArg) {
this.openSockets = new lik_1.Objectmap(); this.openSockets = new lik_1.Objectmap();
this.socketRoles = new lik_1.Objectmap();
this.options = optionsArg;
}
/** /**
* starts listening to incling sockets: * starts listening to incoming sockets:
*/ */
this.startServer = () => { startServer() {
return __awaiter(this, void 0, void 0, function* () {
this.io = plugins.socketIo(this.options.port); this.io = plugins.socketIo(this.options.port);
this.io.on("connection", (socketArg) => { this.io.on('connection', (socketArg) => {
this._handleSocketConnection(socketArg); this._handleSocketConnection(socketArg);
}); });
}; });
this.closeServer = () => { }
/**
* closes the server
*/
closeServer() {
return __awaiter(this, void 0, void 0, function* () {
this.openSockets.forEach((socketObjectArg) => { this.openSockets.forEach((socketObjectArg) => {
plugins.beautylog.log(`disconnect socket with >>alias ${socketObjectArg.alias}`); plugins.beautylog.log(`disconnect socket with >>alias ${socketObjectArg.alias}`);
socketObjectArg.socket.disconnect(); socketObjectArg.socket.disconnect();
}); });
this.openSockets.wipe(); this.openSockets.wipe();
this.io.close(); this.io.close();
}; });
this.options = optionsArg; }
// communication
/**
* allows call to specific client.
*/
clientCall(functionNameArg, dataArg, targetSocketConnectionArg) {
let done = plugins.smartq.defer();
let socketRequest = new smartsocket_classes_socketrequest_1.SocketRequest({
side: 'requesting',
originSocketConnection: targetSocketConnectionArg,
shortId: plugins.shortid.generate(),
funcCallData: {
funcName: functionNameArg,
funcDataArg: dataArg
}
});
socketRequest.dispatch()
.then((dataArg) => {
done.resolve(dataArg.funcDataArg);
});
return done.promise;
}
/**
* adds socketRoles
*/
addSocketRoles(socketRolesArray) {
for (let socketRole of socketRolesArray) {
this.socketRoles.add(socketRole);
}
return;
} }
;
/** /**
* the standard handler for new socket connections * the standard handler for new socket connections
*/ */
@ -35,18 +81,20 @@ class Smartsocket {
alias: undefined, alias: undefined,
authenticated: false, authenticated: false,
role: undefined, role: undefined,
side: 'server',
smartsocketHost: this,
socket: socketArg socket: socketArg
}); });
plugins.beautylog.log("Socket connected. Trying to authenticate..."); plugins.beautylog.log('Socket connected. Trying to authenticate...');
this.openSockets.add(socketConnection); this.openSockets.add(socketConnection);
socketConnection.authenticate() socketConnection.authenticate()
.then(socketConnection.listenToFunctionRequests); .then(() => {
} return socketConnection.listenToFunctionRequests();
; })
// communication .catch((err) => {
clientCall() { console.log(err);
// TODO: target specific client and initiate response });
} }
} }
exports.Smartsocket = Smartsocket; exports.Smartsocket = Smartsocket;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zbWFydHNvY2tldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0c29ja2V0LmNsYXNzZXMuc21hcnRzb2NrZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE1BQVksT0FBTyxXQUFNLHVCQUF1QixDQUFDLENBQUE7QUFHakQsVUFBVTtBQUNWLHNCQUEwQixLQUFLLENBQUMsQ0FBQTtBQUdoQyx1REFBaUMsd0NBQXdDLENBQUMsQ0FBQTtBQUt6RSxDQUFDO0FBRUY7SUFJSSxZQUFZLFVBQTBDO1FBRHRELGdCQUFXLEdBQUcsSUFBSSxlQUFTLEVBQW9CLENBQUM7UUFxQmhEOztXQUVHO1FBRUgsZ0JBQVcsR0FBRztZQUNWLElBQUksQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLFNBQVM7Z0JBQy9CLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM1QyxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQTtRQUNELGdCQUFXLEdBQUc7WUFDVixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGVBQWlDO2dCQUN2RCxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxrQ0FBa0MsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQ2pGLGVBQWUsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDeEMsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEIsQ0FBQyxDQUFDO1FBcENFLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDO0lBQzlCLENBQUM7O0lBRUQ7O09BRUc7SUFDSyx1QkFBdUIsQ0FBQyxTQUFTO1FBQ3JDLElBQUksZ0JBQWdCLEdBQXNCLElBQUksdURBQWdCLENBQUM7WUFDM0QsS0FBSyxFQUFDLFNBQVM7WUFDZixhQUFhLEVBQUMsS0FBSztZQUNuQixJQUFJLEVBQUMsU0FBUztZQUNkLE1BQU0sRUFBQyxTQUFTO1NBQ25CLENBQUMsQ0FBQztRQUNILE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLDZDQUE2QyxDQUFDLENBQUE7UUFDcEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN2QyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUU7YUFDMUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDekQsQ0FBQzs7SUFxQkQsZ0JBQWdCO0lBQ2hCLFVBQVU7UUFFTiw2REFBNkQ7SUFDakUsQ0FBQztBQUNMLENBQUM7QUFoRFksbUJBQVcsY0FnRHZCLENBQUEifQ== //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zbWFydHNvY2tldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0c29ja2V0LmNsYXNzZXMuc21hcnRzb2NrZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBLGlEQUFnRDtBQUdoRCxVQUFVO0FBQ1YsNkJBQStCO0FBRS9CLGlHQUF5RTtBQUN6RSwyRkFBbUU7QUFPbkU7SUFLRSxZQUFhLFVBQTBDO1FBRnZELGdCQUFXLEdBQUcsSUFBSSxlQUFTLEVBQW9CLENBQUE7UUFDL0MsZ0JBQVcsR0FBRyxJQUFJLGVBQVMsRUFBYyxDQUFBO1FBRXZDLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFBO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNHLFdBQVc7O1lBQ2YsSUFBSSxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDN0MsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUMsU0FBUztnQkFDakMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQ3pDLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQztLQUFBO0lBRUQ7O09BRUc7SUFDRyxXQUFXOztZQUNmLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsZUFBaUM7Z0JBQ3pELE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQTtnQkFDaEYsZUFBZSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQTtZQUNyQyxDQUFDLENBQUMsQ0FBQTtZQUNGLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUE7WUFDdkIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUNqQixDQUFDO0tBQUE7SUFFRCxnQkFBZ0I7SUFFaEI7O09BRUc7SUFDSCxVQUFVLENBQUUsZUFBdUIsRUFBRSxPQUFZLEVBQUUseUJBQTJDO1FBQzVGLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDakMsSUFBSSxhQUFhLEdBQUcsSUFBSSxpREFBYSxDQUFDO1lBQ3BDLElBQUksRUFBRSxZQUFZO1lBQ2xCLHNCQUFzQixFQUFFLHlCQUF5QjtZQUNqRCxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUU7WUFDbkMsWUFBWSxFQUFFO2dCQUNaLFFBQVEsRUFBRSxlQUFlO2dCQUN6QixXQUFXLEVBQUUsT0FBTzthQUNyQjtTQUNGLENBQUMsQ0FBQTtRQUNGLGFBQWEsQ0FBQyxRQUFRLEVBQUU7YUFDckIsSUFBSSxDQUFDLENBQUMsT0FBNEI7WUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDbkMsQ0FBQyxDQUFDLENBQUE7UUFDSixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtJQUNyQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjLENBQUUsZ0JBQThCO1FBQzVDLEdBQUcsQ0FBQyxDQUFDLElBQUksVUFBVSxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUNsQyxDQUFDO1FBQ0QsTUFBTSxDQUFBO0lBQ1IsQ0FBQztJQUVEOztPQUVHO0lBQ0ssdUJBQXVCLENBQUUsU0FBUztRQUN4QyxJQUFJLGdCQUFnQixHQUFxQixJQUFJLHVEQUFnQixDQUFDO1lBQzVELEtBQUssRUFBRSxTQUFTO1lBQ2hCLGFBQWEsRUFBRSxLQUFLO1lBQ3BCLElBQUksRUFBRSxTQUFTO1lBQ2YsSUFBSSxFQUFFLFFBQVE7WUFDZCxlQUFlLEVBQUUsSUFBSTtZQUNyQixNQUFNLEVBQUUsU0FBUztTQUNsQixDQUFDLENBQUE7UUFDRixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFBO1FBQ3BFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFDdEMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFO2FBQzVCLElBQUksQ0FBQztZQUNKLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyx3QkFBd0IsRUFBRSxDQUFBO1FBQ3BELENBQUMsQ0FBQzthQUNELEtBQUssQ0FBQyxDQUFDLEdBQUc7WUFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ2xCLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztDQUVGO0FBdkZELGtDQXVGQyJ9

View File

@ -1,7 +1,4 @@
/// <reference types="q" /> import { SocketConnection } from './smartsocket.classes.socketconnection';
import * as plugins from "./smartsocket.plugins";
import { ISocketFunctionCall } from "./smartsocket.classes.socketfunction";
import { SocketConnection } from "./smartsocket.classes.socketconnection";
/** /**
* interface for class SmartsocketClient * interface for class SmartsocketClient
*/ */
@ -23,7 +20,7 @@ export declare class SmartsocketClient {
/** /**
* connect the client to the server * connect the client to the server
*/ */
connect(): plugins.q.Promise<{}>; connect(): Promise<{}>;
disconnect(): plugins.q.Promise<{}>; disconnect(): Promise<{}>;
serverCall(functionNameArg: string, dataArg: ISocketFunctionCall): plugins.q.Promise<{}>; serverCall(functionNameArg: string, dataArg: any): Promise<{}>;
} }

View File

@ -1,4 +1,5 @@
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const plugins = require("./smartsocket.plugins"); const plugins = require("./smartsocket.plugins");
// import classes // import classes
const smartsocket_classes_socketconnection_1 = require("./smartsocket.classes.socketconnection"); const smartsocket_classes_socketconnection_1 = require("./smartsocket.classes.socketconnection");
@ -11,47 +12,49 @@ class SmartsocketClient {
this.serverPort = optionsArg.port; this.serverPort = optionsArg.port;
this.serverPassword = optionsArg.password; this.serverPassword = optionsArg.password;
} }
;
/** /**
* connect the client to the server * connect the client to the server
*/ */
connect() { connect() {
let done = plugins.q.defer(); let done = plugins.smartq.defer();
plugins.beautylog.log("trying to connect..."); plugins.beautylog.log('trying to connect...');
let socketUrl = `${this.serverUrl}:${this.serverPort}`; let socketUrl = `${this.serverUrl}:${this.serverPort}`;
this.socketConnection = new smartsocket_classes_socketconnection_1.SocketConnection({ this.socketConnection = new smartsocket_classes_socketconnection_1.SocketConnection({
alias: this.alias, alias: this.alias,
authenticated: false, authenticated: false,
role: undefined, role: undefined,
side: 'client',
smartsocketHost: null,
socket: plugins.socketIoClient(socketUrl, { multiplex: false }) socket: plugins.socketIoClient(socketUrl, { multiplex: false })
}); });
this.socketConnection.socket.on("requestAuth", () => { this.socketConnection.socket.on('requestAuth', () => {
console.log("server requested authentication"); console.log('server requested authentication');
this.socketConnection.socket.emit("dataAuth", { this.socketConnection.socket.emit('dataAuth', {
role: this.role, role: this.role,
password: this.serverPassword, password: this.serverPassword,
alias: this.alias alias: this.alias
}); });
this.socketConnection.socket.on("authenticated", () => { this.socketConnection.socket.on('authenticated', () => {
console.log("client is authenticated"); console.log('client is authenticated');
this.socketConnection.authenticated = true;
this.socketConnection.listenToFunctionRequests();
done.resolve(); done.resolve();
}); });
}); });
return done.promise; return done.promise;
} }
;
disconnect() { disconnect() {
let done = plugins.q.defer(); let done = plugins.smartq.defer();
this.socketConnection.socket.disconnect(); this.socketConnection.socket.disconnect();
this.socketConnection = undefined; this.socketConnection = undefined;
plugins.beautylog.ok("disconnected!"); plugins.beautylog.ok('disconnected!');
done.resolve(); done.resolve();
return done.promise; return done.promise;
} }
serverCall(functionNameArg, dataArg) { serverCall(functionNameArg, dataArg) {
let done = plugins.q.defer(); let done = plugins.smartq.defer();
let socketRequest = new smartsocket_classes_socketrequest_1.SocketRequest({ let socketRequest = new smartsocket_classes_socketrequest_1.SocketRequest({
side: "requesting", side: 'requesting',
originSocketConnection: this.socketConnection, originSocketConnection: this.socketConnection,
shortId: plugins.shortid.generate(), shortId: plugins.shortid.generate(),
funcCallData: { funcCallData: {
@ -60,12 +63,11 @@ class SmartsocketClient {
} }
}); });
socketRequest.dispatch() socketRequest.dispatch()
.then(() => { .then((dataArg) => {
done.resolve(); done.resolve(dataArg.funcDataArg);
}); });
return done.promise; return done.promise;
} }
;
} }
exports.SmartsocketClient = SmartsocketClient; exports.SmartsocketClient = SmartsocketClient;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zbWFydHNvY2tldGNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0c29ja2V0LmNsYXNzZXMuc21hcnRzb2NrZXRjbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE1BQVksT0FBTyxXQUFNLHVCQUl6QixDQUFDLENBSitDO0FBT2hELGlCQUFpQjtBQUNqQix1REFBaUMsd0NBQXdDLENBQUMsQ0FBQTtBQUUxRSxvREFBOEIscUNBQXFDLENBQUMsQ0FBQTtBQVlwRTtJQU9JLFlBQVksVUFBb0M7UUFDNUMsSUFBSSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQzlCLElBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztRQUM1QixJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUE7UUFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQTtJQUM3QyxDQUFDOztJQUVEOztPQUVHO0lBQ0gsT0FBTztRQUNILElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDN0IsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUM5QyxJQUFJLFNBQVMsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLHVEQUFnQixDQUFDO1lBQ3pDLEtBQUssRUFBQyxJQUFJLENBQUMsS0FBSztZQUNoQixhQUFhLEVBQUMsS0FBSztZQUNuQixJQUFJLEVBQUMsU0FBUztZQUNkLE1BQU0sRUFBRSxPQUFPLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBQyxFQUFDLFNBQVMsRUFBQyxLQUFLLEVBQUMsQ0FBQztTQUM5RCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUU7WUFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDMUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNmLFFBQVEsRUFBRSxJQUFJLENBQUMsY0FBYztnQkFDN0IsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2FBQ3BCLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGVBQWUsRUFBQztnQkFDNUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbkIsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUM7O0lBQ0QsVUFBVTtRQUNOLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO1FBQ2xDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUM7SUFDRCxVQUFVLENBQUMsZUFBc0IsRUFBQyxPQUEyQjtRQUN6RCxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdCLElBQUksYUFBYSxHQUFHLElBQUksaURBQWEsQ0FBQztZQUNsQyxJQUFJLEVBQUMsWUFBWTtZQUNqQixzQkFBc0IsRUFBQyxJQUFJLENBQUMsZ0JBQWdCO1lBQzVDLE9BQU8sRUFBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRTtZQUNsQyxZQUFZLEVBQUM7Z0JBQ1QsUUFBUSxFQUFFLGVBQWU7Z0JBQ3pCLFdBQVcsRUFBQyxPQUFPO2FBQ3RCO1NBQ0osQ0FBQyxDQUFDO1FBQ0gsYUFBYSxDQUFDLFFBQVEsRUFBRTthQUNuQixJQUFJLENBQUM7WUFDRixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUM7UUFDUCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN4QixDQUFDOztBQUVMLENBQUM7QUFwRVkseUJBQWlCLG9CQW9FN0IsQ0FBQSJ9 //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zbWFydHNvY2tldGNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0c29ja2V0LmNsYXNzZXMuc21hcnRzb2NrZXRjbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxpREFBZ0Q7QUFPaEQsaUJBQWlCO0FBQ2pCLGlHQUF5RTtBQUV6RSwyRkFBbUU7QUFZbkU7SUFPRSxZQUFZLFVBQXFDO1FBQy9DLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQTtRQUM3QixJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUE7UUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFBO1FBQy9CLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQTtRQUNqQyxJQUFJLENBQUMsY0FBYyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUE7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTztRQUNMLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDakMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtRQUM3QyxJQUFJLFNBQVMsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBQ3RELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLHVEQUFnQixDQUFDO1lBQzNDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixhQUFhLEVBQUUsS0FBSztZQUNwQixJQUFJLEVBQUUsU0FBUztZQUNmLElBQUksRUFBRSxRQUFRO1lBQ2QsZUFBZSxFQUFFLElBQUk7WUFDckIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDO1NBQ2hFLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRTtZQUM3QyxPQUFPLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxDQUFDLENBQUE7WUFDOUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUM1QyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsUUFBUSxFQUFFLElBQUksQ0FBQyxjQUFjO2dCQUM3QixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7YUFDbEIsQ0FBQyxDQUFBO1lBQ0YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsZUFBZSxFQUFFO2dCQUMvQyxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLENBQUE7Z0JBQ3RDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFBO2dCQUMxQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsd0JBQXdCLEVBQUUsQ0FBQTtnQkFDaEQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO1lBQ2hCLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUE7UUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtJQUNyQixDQUFDO0lBQ0QsVUFBVTtRQUNSLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDakMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUN6QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFBO1FBQ2pDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFBO1FBQ3JDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO0lBQ3JCLENBQUM7SUFDRCxVQUFVLENBQUUsZUFBdUIsRUFBRSxPQUFZO1FBQy9DLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDakMsSUFBSSxhQUFhLEdBQUcsSUFBSSxpREFBYSxDQUFDO1lBQ3BDLElBQUksRUFBRSxZQUFZO1lBQ2xCLHNCQUFzQixFQUFFLElBQUksQ0FBQyxnQkFBZ0I7WUFDN0MsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFO1lBQ25DLFlBQVksRUFBRTtnQkFDWixRQUFRLEVBQUUsZUFBZTtnQkFDekIsV0FBVyxFQUFFLE9BQU87YUFDckI7U0FDRixDQUFDLENBQUE7UUFDRixhQUFhLENBQUMsUUFBUSxFQUFFO2FBQ3JCLElBQUksQ0FBQyxDQUFDLE9BQTRCO1lBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQ25DLENBQUMsQ0FBQyxDQUFBO1FBQ0osTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7SUFDckIsQ0FBQztDQUVGO0FBeEVELDhDQXdFQyJ9

View File

@ -1,8 +1,12 @@
/// <reference types="socket.io" /> /// <reference types="socket.io" />
/// <reference types="socket.io-client" /> /// <reference types="socket.io-client" />
/// <reference types="q" /> import { Objectmap } from 'lik';
import * as plugins from "./smartsocket.plugins"; import { Smartsocket } from './smartsocket.classes.smartsocket';
import { SocketRole } from "./smartsocket.classes.socketrole"; import { SocketRole } from './smartsocket.classes.socketrole';
/**
* defines is a SocketConnection is server or client side. Important for mesh setups.
*/
export declare type TSocketConnectionSide = 'server' | 'client';
/** /**
* interface for constructor of class SocketConnection * interface for constructor of class SocketConnection
*/ */
@ -10,31 +14,36 @@ export interface ISocketConnectionConstructorOptions {
alias: string; alias: string;
authenticated: boolean; authenticated: boolean;
role: SocketRole; role: SocketRole;
side: TSocketConnectionSide;
smartsocketHost: Smartsocket;
socket: SocketIO.Socket | SocketIOClient.Socket; socket: SocketIO.Socket | SocketIOClient.Socket;
} }
/** /**
* interface for authentication data * interface for authentication data
*/ */
export interface ISocketConnectionAuthenticationObject { export interface ISocketConnectionAuthenticationObject {
role: "coreflowContainer"; role: 'coreflowContainer';
password: "somePassword"; password: 'somePassword';
alias: "coreflow1"; alias: 'coreflow1';
} }
export declare let allSocketConnections: Objectmap<SocketConnection>;
/** /**
* class SocketConnection represents a websocket connection * class SocketConnection represents a websocket connection
*/ */
export declare class SocketConnection { export declare class SocketConnection {
alias: string; alias: string;
side: TSocketConnectionSide;
authenticated: boolean; authenticated: boolean;
role: SocketRole; role: SocketRole;
socket: SocketIO.Socket | SocketIOClient.Socket; smartsocketHost: Smartsocket;
socket: any;
constructor(optionsArg: ISocketConnectionConstructorOptions); constructor(optionsArg: ISocketConnectionConstructorOptions);
/** /**
* authenticate the socket * authenticate the socket
*/ */
authenticate(): plugins.q.Promise<{}>; authenticate(): Promise<{}>;
/** /**
* listen to function requests * listen to function requests
*/ */
listenToFunctionRequests(): plugins.q.Promise<{}>; listenToFunctionRequests(): Promise<{}>;
} }

View File

@ -1,66 +1,73 @@
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const plugins = require("./smartsocket.plugins"); const plugins = require("./smartsocket.plugins");
const helpers = require("./smartsocket.helpers"); const helpers = require("./smartsocket.helpers");
const lik_1 = require("lik");
const smartsocket_classes_socketrequest_1 = require("./smartsocket.classes.socketrequest"); const smartsocket_classes_socketrequest_1 = require("./smartsocket.classes.socketrequest");
;
// export classes // export classes
exports.allSocketConnections = new lik_1.Objectmap();
/** /**
* class SocketConnection represents a websocket connection * class SocketConnection represents a websocket connection
*/ */
class SocketConnection { class SocketConnection {
constructor(optionsArg) { constructor(optionsArg) {
this.authenticated = false;
this.alias = optionsArg.alias; this.alias = optionsArg.alias;
this.authenticated = optionsArg.authenticated; this.authenticated = optionsArg.authenticated;
this.role = optionsArg.role; this.role = optionsArg.role;
this.side = optionsArg.side;
this.smartsocketHost = optionsArg.smartsocketHost;
this.socket = optionsArg.socket; this.socket = optionsArg.socket;
// standard behaviour that is always true // standard behaviour that is always true
this.socket.on("disconnect", () => { exports.allSocketConnections.add(this);
plugins.beautylog.info(`Client ${this.alias} disconnected`); this.socket.on('disconnect', () => {
plugins.beautylog.info(`SocketConnection with >alias ${this.alias} on >side ${this.side} disconnected`);
exports.allSocketConnections.remove(this);
}); });
} }
;
// authenticating -------------------------- // authenticating --------------------------
/** /**
* authenticate the socket * authenticate the socket
*/ */
authenticate() { authenticate() {
let done = plugins.q.defer(); let done = plugins.smartq.defer();
this.socket.on("dataAuth", dataArg => { this.socket.on('dataAuth', (dataArg) => {
plugins.beautylog.log("received authentication data. now hashing and comparing..."); plugins.beautylog.log('received authentication data. now hashing and comparing...');
this.socket.removeListener("dataAuth", () => { }); this.socket.removeListener('dataAuth', () => { });
if ((true)) { if (helpers.checkPasswordForRole(dataArg, this.smartsocketHost)) {
this.alias = dataArg.alias; this.alias = dataArg.alias;
this.authenticated = true; this.authenticated = true;
this.role = helpers.getSocketRoleByName(dataArg.role); this.role = helpers.getSocketRoleByName(dataArg.role, this.smartsocketHost);
this.socket.emit("authenticated"); this.socket.emit('authenticated');
plugins.beautylog.ok(`socket with >>alias ${this.alias} >>role ${this.role} is authenticated!`); plugins.beautylog.ok(`socket with >>alias ${this.alias} >>role ${this.role} is authenticated!`);
done.resolve(this); done.resolve(this);
} }
else { else {
this.authenticated = false;
this.socket.disconnect(); this.socket.disconnect();
done.reject("not authenticated"); done.reject('not authenticated');
} }
;
}); });
this.socket.emit("requestAuth"); this.socket.emit('requestAuth');
return done.promise; return done.promise;
} }
;
// listening ------------------------------- // listening -------------------------------
/** /**
* listen to function requests * listen to function requests
*/ */
listenToFunctionRequests() { listenToFunctionRequests() {
let done = plugins.q.defer(); let done = plugins.smartq.defer();
if (this.authenticated) { if (this.authenticated) {
this.socket.on("function", (dataArg) => { this.socket.on('function', (dataArg) => {
// check if requested function is available to the socket's scope // check if requested function is available to the socket's scope
plugins.beautylog.log('function request received');
let referencedFunction = this.role.allowedFunctions.find((socketFunctionArg) => { let referencedFunction = this.role.allowedFunctions.find((socketFunctionArg) => {
return socketFunctionArg.name === dataArg.funcCallData.funcName; return socketFunctionArg.name === dataArg.funcCallData.funcName;
}); });
if (referencedFunction !== undefined) { if (referencedFunction !== undefined) {
plugins.beautylog.ok('function in access scope');
let localSocketRequest = new smartsocket_classes_socketrequest_1.SocketRequest({ let localSocketRequest = new smartsocket_classes_socketrequest_1.SocketRequest({
side: "responding", side: 'responding',
originSocketConnection: this, originSocketConnection: this,
shortId: dataArg.shortId, shortId: dataArg.shortId,
funcCallData: dataArg.funcCallData funcCallData: dataArg.funcCallData
@ -68,23 +75,24 @@ class SocketConnection {
localSocketRequest.createResponse(); // takes care of creating response and sending it back localSocketRequest.createResponse(); // takes care of creating response and sending it back
} }
else { else {
plugins.beautylog.warn("function not existent or out of access scope"); plugins.beautylog.warn('function not existent or out of access scope');
} }
;
}); });
this.socket.on("functionResponse", (dataArg) => { this.socket.on('functionResponse', (dataArg) => {
plugins.beautylog.info(`received response for request with id ${dataArg.shortId}`);
let targetSocketRequest = helpers.getSocketRequestById(dataArg.shortId); let targetSocketRequest = helpers.getSocketRequestById(dataArg.shortId);
targetSocketRequest.handleResponse(dataArg); targetSocketRequest.handleResponse(dataArg);
}); });
plugins.beautylog.log(`now listening to function requests for ${this.alias}`);
done.resolve(this);
} }
else { else {
done.reject("socket needs to be authenticated first"); let errMessage;
plugins.beautylog.error(errMessage);
done.reject(errMessage);
} }
;
return done.promise; return done.promise;
} }
;
} }
exports.SocketConnection = SocketConnection; exports.SocketConnection = SocketConnection;
; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRjb25uZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRjb25uZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsaURBQWdEO0FBQ2hELGlEQUFnRDtBQUVoRCw2QkFBK0I7QUFLL0IsMkZBQWdIO0FBK0JoSCxpQkFBaUI7QUFDTixRQUFBLG9CQUFvQixHQUFHLElBQUksZUFBUyxFQUFvQixDQUFBO0FBRW5FOztHQUVHO0FBQ0g7SUFPRSxZQUFhLFVBQStDO1FBSjVELGtCQUFhLEdBQVksS0FBSyxDQUFBO1FBSzVCLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQTtRQUM3QixJQUFJLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUE7UUFDN0MsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFBO1FBQzNCLElBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQTtRQUMzQixJQUFJLENBQUMsZUFBZSxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUE7UUFDakQsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFBO1FBRS9CLHlDQUF5QztRQUN6Qyw0QkFBb0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFO1lBQzNCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxJQUFJLENBQUMsS0FBSyxhQUFhLElBQUksQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFBO1lBQ3ZHLDRCQUFvQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNuQyxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCw0Q0FBNEM7SUFFNUM7O09BRUc7SUFDSCxZQUFZO1FBQ1YsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUE4QztZQUN4RSxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyw0REFBNEQsQ0FBQyxDQUFBO1lBQ25GLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFBO1lBQ2pELEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEUsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFBO2dCQUMxQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQTtnQkFDekIsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUE7Z0JBQzNFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFBO2dCQUNqQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsSUFBSSxDQUFDLEtBQUssV0FBVyxJQUFJLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxDQUFBO2dCQUMvRixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ3BCLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDTixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQTtnQkFDMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQTtnQkFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO1lBQ2xDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO0lBQ3JCLENBQUM7SUFFRCw0Q0FBNEM7SUFFNUM7O09BRUc7SUFDSCx3QkFBd0I7UUFDdEIsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUNqQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFpQztnQkFDM0QsaUVBQWlFO2dCQUNqRSxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxDQUFBO2dCQUNsRCxJQUFJLGtCQUFrQixHQUFtQixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLGlCQUFpQjtvQkFDekYsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQTtnQkFDakUsQ0FBQyxDQUFDLENBQUE7Z0JBQ0YsRUFBRSxDQUFDLENBQUMsa0JBQWtCLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztvQkFDckMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtvQkFDakQsSUFBSSxrQkFBa0IsR0FBRyxJQUFJLGlEQUFhLENBQUM7d0JBQ3pDLElBQUksRUFBRSxZQUFZO3dCQUNsQixzQkFBc0IsRUFBRSxJQUFJO3dCQUM1QixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87d0JBQ3hCLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtxQkFDbkMsQ0FBQyxDQUFBO29CQUNGLGtCQUFrQixDQUFDLGNBQWMsRUFBRSxDQUFBLENBQUMsc0RBQXNEO2dCQUM1RixDQUFDO2dCQUFDLElBQUksQ0FBQyxDQUFDO29CQUNOLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLDhDQUE4QyxDQUFDLENBQUE7Z0JBQ3hFLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQTtZQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGtCQUFrQixFQUFFLENBQUMsT0FBaUM7Z0JBQ25FLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLHlDQUF5QyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtnQkFDbEYsSUFBSSxtQkFBbUIsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUN2RSxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDN0MsQ0FBQyxDQUFDLENBQUE7WUFDRixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQywwQ0FBMEMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7WUFDN0UsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNwQixDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixJQUFJLFVBQW9ELENBQUE7WUFDeEQsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUN6QixDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7SUFDckIsQ0FBQztDQUlGO0FBOUZELDRDQThGQyJ9
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRjb25uZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRjb25uZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxNQUFZLE9BQU8sV0FBTSx1QkFBdUIsQ0FBQyxDQUFBO0FBQ2pELE1BQVksT0FBTyxXQUFNLHVCQUF1QixDQUFDLENBQUE7QUFJakQsb0RBQTJFLHFDQUFxQyxDQUFDLENBQUE7QUFhaEgsQ0FBQztBQVdGLGlCQUFpQjtBQUVqQjs7R0FFRztBQUNIO0lBS0ksWUFBWSxVQUErQztRQUN2RCxJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDOUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDO1FBQzlDLElBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztRQUM1QixJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFFaEMseUNBQXlDO1FBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRTtZQUN6QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxLQUFLLGVBQWUsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7SUFFRCw0Q0FBNEM7SUFFNUM7O09BRUc7SUFDSCxZQUFZO1FBQ1IsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsT0FBTztZQUM5QixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO1lBQ3BGLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ2xELEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNULElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQTtnQkFDMUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQ2xDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLHVCQUF1QixJQUFJLENBQUMsS0FBSyxXQUFXLElBQUksQ0FBQyxJQUFJLG9CQUFvQixDQUFDLENBQUM7Z0JBQ2hHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkIsQ0FBQztZQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUNyQyxDQUFDO1lBQUEsQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDaEMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQzs7SUFFRCw0Q0FBNEM7SUFFNUM7O09BRUc7SUFDSCx3QkFBd0I7UUFDcEIsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixFQUFFLENBQUEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUEsQ0FBQztZQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFnQztnQkFDeEQsaUVBQWlFO2dCQUNqRSxJQUFJLGtCQUFrQixHQUFrQixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLGlCQUFpQjtvQkFDdEYsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQztnQkFDcEUsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsRUFBRSxDQUFBLENBQUMsa0JBQWtCLEtBQUssU0FBUyxDQUFDLENBQUEsQ0FBQztvQkFDakMsSUFBSSxrQkFBa0IsR0FBRyxJQUFJLGlEQUFhLENBQUM7d0JBQ3ZDLElBQUksRUFBQyxZQUFZO3dCQUNqQixzQkFBc0IsRUFBQyxJQUFJO3dCQUMzQixPQUFPLEVBQUMsT0FBTyxDQUFDLE9BQU87d0JBQ3ZCLFlBQVksRUFBQyxPQUFPLENBQUMsWUFBWTtxQkFDcEMsQ0FBQyxDQUFDO29CQUNILGtCQUFrQixDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsdURBQXVEO2dCQUNoRyxDQUFDO2dCQUFDLElBQUksQ0FBQyxDQUFDO29CQUNKLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLDhDQUE4QyxDQUFDLENBQUM7Z0JBQzNFLENBQUM7Z0JBQUEsQ0FBQztZQUNOLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxPQUFnQztnQkFDaEUsSUFBSSxtQkFBbUIsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN4RSxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEQsQ0FBQyxDQUFDLENBQUE7UUFDTixDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDSixJQUFJLENBQUMsTUFBTSxDQUFDLHdDQUF3QyxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUFBLENBQUM7UUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN4QixDQUFDOztBQUlMLENBQUM7QUFoRlksd0JBQWdCLG1CQWdGNUIsQ0FBQTtBQUFBLENBQUMifQ==

View File

@ -1,7 +1,5 @@
/// <reference types="q" /> import { Objectmap } from 'lik';
import * as plugins from "./smartsocket.plugins"; import { SocketRole } from './smartsocket.classes.socketrole';
import { Objectmap } from "lik";
import { SocketRole } from "./smartsocket.classes.socketrole";
/** /**
* interface of the contructor options of class SocketFunction * interface of the contructor options of class SocketFunction
*/ */
@ -35,12 +33,12 @@ export declare class SocketFunction {
* the constructor for SocketFunction * the constructor for SocketFunction
*/ */
constructor(optionsArg: ISocketFunctionConstructorOptions); constructor(optionsArg: ISocketFunctionConstructorOptions);
/**
* invokes the function of this SocketFunction
*/
invoke(dataArg: ISocketFunctionCall): Promise<any>;
/** /**
* notifies a role about access to this SocketFunction * notifies a role about access to this SocketFunction
*/ */
private _notifyRole(socketRoleArg); private _notifyRole(socketRoleArg);
/**
* invokes the function of this SocketFunction
*/
invoke(dataArg: ISocketFunctionCall): plugins.q.Promise<any>;
} }

View File

@ -1,9 +1,8 @@
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const plugins = require("./smartsocket.plugins"); const plugins = require("./smartsocket.plugins");
// import classes // import classes
const lik_1 = require("lik"); const lik_1 = require("lik");
;
;
// export objects // export objects
exports.allSocketFunctions = new lik_1.Objectmap(); exports.allSocketFunctions = new lik_1.Objectmap();
// export classes // export classes
@ -21,25 +20,21 @@ class SocketFunction {
for (let socketRoleArg of this.roles) { for (let socketRoleArg of this.roles) {
this._notifyRole(socketRoleArg); this._notifyRole(socketRoleArg);
} }
;
exports.allSocketFunctions.add(this); // map instance with Objectmap exports.allSocketFunctions.add(this); // map instance with Objectmap
} }
;
/**
* notifies a role about access to this SocketFunction
*/
_notifyRole(socketRoleArg) {
socketRoleArg.addSocketFunction(this);
}
/** /**
* invokes the function of this SocketFunction * invokes the function of this SocketFunction
*/ */
invoke(dataArg) { invoke(dataArg) {
let done = plugins.q.defer(); let done = plugins.smartq.defer();
if (dataArg.funcName === this.name) { if (dataArg.funcName === this.name) {
this.funcDef(dataArg.funcDataArg) this.funcDef(dataArg.funcDataArg)
.then((resultData) => { .then((resultData) => {
done.resolve(resultData); let funcResponseData = {
funcName: this.name,
funcDataArg: resultData
};
done.resolve(funcResponseData);
}); });
} }
else { else {
@ -47,7 +42,12 @@ class SocketFunction {
} }
return done.promise; return done.promise;
} }
; /**
* notifies a role about access to this SocketFunction
*/
_notifyRole(socketRoleArg) {
socketRoleArg.addSocketFunction(this);
}
} }
exports.SocketFunction = SocketFunction; exports.SocketFunction = SocketFunction;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRmdW5jdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0c29ja2V0LmNsYXNzZXMuc29ja2V0ZnVuY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE1BQVksT0FBTyxXQUFNLHVCQUF1QixDQUFDLENBQUE7QUFFakQsaUJBQWlCO0FBQ2pCLHNCQUEwQixLQUFLLENBQUMsQ0FBQTtBQVkvQixDQUFDO0FBUUQsQ0FBQztBQVNGLGlCQUFpQjtBQUNOLDBCQUFrQixHQUFHLElBQUksZUFBUyxFQUFrQixDQUFDO0FBRWhFLGlCQUFpQjtBQUVqQjs7R0FFRztBQUNIO0lBS0k7O09BRUc7SUFDSCxZQUFZLFVBQTZDO1FBQ3JELElBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztRQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDbEMsSUFBSSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDO1FBQ3JDLEdBQUcsQ0FBQyxDQUFDLElBQUksYUFBYSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUFBLENBQUM7UUFDRiwwQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyw4QkFBOEI7SUFDaEUsQ0FBQzs7SUFFRDs7T0FFRztJQUNLLFdBQVcsQ0FBQyxhQUF3QjtRQUN4QyxhQUFhLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLE9BQTJCO1FBQzlCLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDN0IsRUFBRSxDQUFBLENBQUMsT0FBTyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQztZQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7aUJBQzVCLElBQUksQ0FBQyxDQUFDLFVBQWM7Z0JBQ2pCLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFFWCxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDSixNQUFNLElBQUksS0FBSyxDQUFDLCtEQUErRCxDQUFDLENBQUM7UUFDckYsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUM7O0FBRUwsQ0FBQztBQTFDWSxzQkFBYyxpQkEwQzFCLENBQUEifQ== //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRmdW5jdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0c29ja2V0LmNsYXNzZXMuc29ja2V0ZnVuY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxpREFBZ0Q7QUFFaEQsaUJBQWlCO0FBQ2pCLDZCQUErQjtBQTZCL0IsaUJBQWlCO0FBQ04sUUFBQSxrQkFBa0IsR0FBRyxJQUFJLGVBQVMsRUFBa0IsQ0FBQTtBQUUvRCxpQkFBaUI7QUFFakI7O0dBRUc7QUFDSDtJQUtFOztPQUVHO0lBQ0gsWUFBYSxVQUE2QztRQUN4RCxJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUE7UUFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFBO1FBQ2pDLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQTtRQUNwQyxHQUFHLENBQUMsQ0FBQyxJQUFJLGFBQWEsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQ2pDLENBQUM7UUFDRCwwQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyw4QkFBOEI7SUFDN0QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFFLE9BQTRCO1FBQ2xDLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDakMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7aUJBQzlCLElBQUksQ0FBQyxDQUFDLFVBQWU7Z0JBQ3BCLElBQUksZ0JBQWdCLEdBQXdCO29CQUMxQyxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUk7b0JBQ25CLFdBQVcsRUFBRSxVQUFVO2lCQUN4QixDQUFBO2dCQUNELElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtZQUNoQyxDQUFDLENBQUMsQ0FBQTtRQUVOLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsK0RBQStELENBQUMsQ0FBQTtRQUNsRixDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7SUFDckIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssV0FBVyxDQUFFLGFBQXlCO1FBQzVDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUN2QyxDQUFDO0NBQ0Y7QUE3Q0Qsd0NBNkNDIn0=

View File

@ -1,10 +1,9 @@
/// <reference types="q" /> import * as plugins from './smartsocket.plugins';
import * as plugins from "./smartsocket.plugins"; import { ISocketFunctionCall } from './smartsocket.classes.socketfunction';
import { ISocketFunctionCall } from "./smartsocket.classes.socketfunction"; import { Objectmap } from 'lik';
import { Objectmap } from "lik"; import { SocketConnection } from './smartsocket.classes.socketconnection';
import { SocketConnection } from "./smartsocket.classes.socketconnection"; export declare type TSocketRequestStatus = 'new' | 'pending' | 'finished';
export declare type TSocketRequestStatus = "new" | "pending" | "finished"; export declare type TSocketRequestSide = 'requesting' | 'responding';
export declare type TSocketRequestSide = "requesting" | "responding";
/** /**
* interface of constructor of class SocketRequest * interface of constructor of class SocketRequest
*/ */
@ -29,12 +28,12 @@ export declare class SocketRequest {
shortid: string; shortid: string;
originSocketConnection: SocketConnection; originSocketConnection: SocketConnection;
funcCallData: ISocketFunctionCall; funcCallData: ISocketFunctionCall;
done: plugins.q.Deferred<{}>; done: plugins.smartq.Deferred<{}>;
constructor(optionsArg: SocketRequestConstructorOptions); constructor(optionsArg: SocketRequestConstructorOptions);
/** /**
* dispatches a socketrequest from the requesting to the receiving side * dispatches a socketrequest from the requesting to the receiving side
*/ */
dispatch(): plugins.q.Promise<{}>; dispatch(): Promise<{}>;
/** /**
* handles the response that is received by the requesting side * handles the response that is received by the requesting side
*/ */

View File

@ -1,23 +1,22 @@
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const plugins = require("./smartsocket.plugins"); const plugins = require("./smartsocket.plugins");
const helpers = require("./smartsocket.helpers"); const helpers = require("./smartsocket.helpers");
// import classes // import classes
const lik_1 = require("lik"); const lik_1 = require("lik");
;
;
// export objects // export objects
exports.allSocketRequests = new lik_1.Objectmap(); exports.allSocketRequests = new lik_1.Objectmap();
// export classes // export classes
class SocketRequest { class SocketRequest {
constructor(optionsArg) { constructor(optionsArg) {
this.status = "new"; this.status = 'new';
this.done = plugins.q.defer(); this.done = plugins.smartq.defer();
this.side = optionsArg.side; this.side = optionsArg.side;
this.shortid = optionsArg.shortId; this.shortid = optionsArg.shortId;
this.funcCallData = optionsArg.funcCallData; this.funcCallData = optionsArg.funcCallData;
this.originSocketConnection = optionsArg.originSocketConnection;
exports.allSocketRequests.add(this); exports.allSocketRequests.add(this);
} }
;
// requesting -------------------------- // requesting --------------------------
/** /**
* dispatches a socketrequest from the requesting to the receiving side * dispatches a socketrequest from the requesting to the receiving side
@ -27,15 +26,15 @@ class SocketRequest {
funcCallData: this.funcCallData, funcCallData: this.funcCallData,
shortId: this.shortid shortId: this.shortid
}; };
this.originSocketConnection.socket.emit("function", requestData); this.originSocketConnection.socket.emit('function', requestData);
return this.done.promise; return this.done.promise;
} }
;
/** /**
* handles the response that is received by the requesting side * handles the response that is received by the requesting side
*/ */
handleResponse(responseDataArg) { handleResponse(responseDataArg) {
this.done.resolve(responseDataArg); plugins.beautylog.log('handling response!');
this.done.resolve(responseDataArg.funcCallData);
exports.allSocketRequests.remove(this); exports.allSocketRequests.remove(this);
} }
// responding -------------------------- // responding --------------------------
@ -44,17 +43,18 @@ class SocketRequest {
*/ */
createResponse() { createResponse() {
let targetSocketFunction = helpers.getSocketFunctionByName(this.funcCallData.funcName); let targetSocketFunction = helpers.getSocketFunctionByName(this.funcCallData.funcName);
plugins.beautylog.info(`invoking ${targetSocketFunction.name}`);
targetSocketFunction.invoke(this.funcCallData) targetSocketFunction.invoke(this.funcCallData)
.then((resultData) => { .then((resultData) => {
plugins.beautylog.log('got resultData. Sending it to requesting party.');
let requestData = { let requestData = {
funcCallData: resultData, funcCallData: resultData,
shortId: this.shortid shortId: this.shortid
}; };
this.originSocketConnection.socket.emit("functionResponse", requestData); this.originSocketConnection.socket.emit('functionResponse', requestData);
exports.allSocketRequests.remove(this); exports.allSocketRequests.remove(this);
}); });
} }
} }
exports.SocketRequest = SocketRequest; exports.SocketRequest = SocketRequest;
; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRyZXF1ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRyZXF1ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsaURBQWdEO0FBQ2hELGlEQUFnRDtBQUtoRCxpQkFBaUI7QUFDakIsNkJBQStCO0FBMkIvQixpQkFBaUI7QUFDTixRQUFBLGlCQUFpQixHQUFHLElBQUksZUFBUyxFQUFpQixDQUFBO0FBRTdELGlCQUFpQjtBQUNqQjtJQU9FLFlBQWEsVUFBMkM7UUFOeEQsV0FBTSxHQUF5QixLQUFLLENBQUE7UUFLcEMsU0FBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUE7UUFFM0IsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFBO1FBQzNCLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQTtRQUNqQyxJQUFJLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUE7UUFDM0MsSUFBSSxDQUFDLHNCQUFzQixHQUFHLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQTtRQUMvRCx5QkFBaUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDN0IsQ0FBQztJQUVELHdDQUF3QztJQUV4Qzs7T0FFRztJQUNILFFBQVE7UUFDTixJQUFJLFdBQVcsR0FBNkI7WUFDMUMsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQy9CLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztTQUN0QixDQUFBO1FBQ0QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFBO1FBQ2hFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjLENBQUUsZUFBeUM7UUFDdkQsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtRQUMzQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDL0MseUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ2hDLENBQUM7SUFFRCx3Q0FBd0M7SUFFeEM7O09BRUc7SUFDSCxjQUFjO1FBQ1osSUFBSSxvQkFBb0IsR0FBbUIsT0FBTyxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDdEcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQy9ELG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO2FBQzNDLElBQUksQ0FBQyxDQUFDLFVBQVU7WUFDZixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxpREFBaUQsQ0FBQyxDQUFBO1lBQ3hFLElBQUksV0FBVyxHQUE2QjtnQkFDMUMsWUFBWSxFQUFFLFVBQVU7Z0JBQ3hCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTzthQUN0QixDQUFBO1lBQ0QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsV0FBVyxDQUFDLENBQUE7WUFDeEUseUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2hDLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztDQUNGO0FBekRELHNDQXlEQyJ9
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRyZXF1ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRyZXF1ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxNQUFZLE9BQU8sV0FBTSx1QkFBdUIsQ0FBQyxDQUFBO0FBQ2pELE1BQVksT0FBTyxXQUFNLHVCQUF1QixDQUFDLENBQUE7QUFLakQsaUJBQWlCO0FBQ2pCLHNCQUEwQixLQUFLLENBQUMsQ0FBQTtBQWdCL0IsQ0FBQztBQVNELENBQUM7QUFFRixnQkFBZ0I7QUFDTCx5QkFBaUIsR0FBRyxJQUFJLGVBQVMsRUFBaUIsQ0FBQztBQUU5RCxpQkFBaUI7QUFDakI7SUFPSSxZQUFZLFVBQTJDO1FBTnZELFdBQU0sR0FBeUIsS0FBSyxDQUFDO1FBS3JDLFNBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRXJCLElBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztRQUM1QixJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDbEMsSUFBSSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDO1FBQzVDLHlCQUFpQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDOztJQUVELHdDQUF3QztJQUV4Qzs7T0FFRztJQUNILFFBQVE7UUFDSixJQUFJLFdBQVcsR0FBNkI7WUFDeEMsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQy9CLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztTQUN4QixDQUFBO1FBQ0QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUM3QixDQUFDOztJQUVEOztPQUVHO0lBQ0gsY0FBYyxDQUFDLGVBQXlDO1FBQ3BELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ25DLHlCQUFpQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsd0NBQXdDO0lBRXhDOztPQUVHO0lBQ0gsY0FBYztRQUNWLElBQUksb0JBQW9CLEdBQW1CLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZHLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO2FBQ3pDLElBQUksQ0FBQyxDQUFDLFVBQVU7WUFDYixJQUFJLFdBQVcsR0FBNkI7Z0JBQ3hDLFlBQVksRUFBRSxVQUFVO2dCQUN4QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87YUFDeEIsQ0FBQTtZQUNELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3hFLHlCQUFpQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7QUFDTCxDQUFDO0FBckRZLHFCQUFhLGdCQXFEekIsQ0FBQTtBQUFBLENBQUMifQ==

View File

@ -1,6 +1,5 @@
import { Objectmap } from "lik"; import { Objectmap } from "lik";
import { SocketFunction } from "./smartsocket.classes.socketfunction"; import { SocketFunction } from "./smartsocket.classes.socketfunction";
export declare let allSocketRoles: Objectmap<SocketRole>;
/** /**
* interface for class SocketRole * interface for class SocketRole
*/ */

View File

@ -1,7 +1,7 @@
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true });
// import classes // import classes
const lik_1 = require("lik"); const lik_1 = require("lik");
exports.allSocketRoles = new lik_1.Objectmap();
/** /**
* A socketrole defines access to certain routines. * A socketrole defines access to certain routines.
*/ */
@ -10,7 +10,6 @@ class SocketRole {
this.allowedFunctions = new lik_1.Objectmap(); this.allowedFunctions = new lik_1.Objectmap();
this.name = optionsArg.name; this.name = optionsArg.name;
this.passwordHash = optionsArg.passwordHash; this.passwordHash = optionsArg.passwordHash;
exports.allSocketRoles.add(this);
} }
; ;
addSocketFunction(socketFunctionArg) { addSocketFunction(socketFunctionArg) {
@ -18,4 +17,4 @@ class SocketRole {
} }
} }
exports.SocketRole = SocketRole; exports.SocketRole = SocketRole;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRyb2xlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRyb2xlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFFQSxpQkFBaUI7QUFDakIsc0JBQTBCLEtBQUssQ0FBQyxDQUFBO0FBSXJCLHNCQUFjLEdBQUcsSUFBSSxlQUFTLEVBQWMsQ0FBQztBQVd4RDs7R0FFRztBQUNIO0lBSUksWUFBWSxVQUE2QjtRQUR6QyxxQkFBZ0IsR0FBRyxJQUFJLGVBQVMsRUFBa0IsQ0FBQztRQUUvQyxJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDO1FBQzVDLHNCQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLENBQUM7O0lBQ0QsaUJBQWlCLENBQUMsaUJBQWdDO1FBQzlDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0FBQ0wsQ0FBQztBQVpZLGtCQUFVLGFBWXRCLENBQUEifQ== //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRyb2xlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRyb2xlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsaUJBQWlCO0FBQ2pCLDZCQUFnQztBQVloQzs7R0FFRztBQUNIO0lBSUksWUFBWSxVQUE2QjtRQUR6QyxxQkFBZ0IsR0FBRyxJQUFJLGVBQVMsRUFBa0IsQ0FBQztRQUUvQyxJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDO0lBQ2hELENBQUM7SUFBQSxDQUFDO0lBQ0YsaUJBQWlCLENBQUMsaUJBQWdDO1FBQzlDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0NBQ0o7QUFYRCxnQ0FXQyJ9

View File

@ -1,6 +1,9 @@
import { Smartsocket } from "./smartsocket.classes.smartsocket";
import { SocketFunction } from "./smartsocket.classes.socketfunction"; import { SocketFunction } from "./smartsocket.classes.socketfunction";
import { ISocketConnectionAuthenticationObject } from "./smartsocket.classes.socketconnection";
import { SocketRequest, TSocketRequestSide } from "./smartsocket.classes.socketrequest"; import { SocketRequest, TSocketRequestSide } from "./smartsocket.classes.socketrequest";
import { SocketRole } from "./smartsocket.classes.socketrole"; import { SocketRole } from "./smartsocket.classes.socketrole";
export declare let checkPasswordForRole: (dataArg: ISocketConnectionAuthenticationObject, referenceSmartsocket: Smartsocket) => boolean;
export declare let getSocketFunctionByName: (functionNameArg: string) => SocketFunction; export declare let getSocketFunctionByName: (functionNameArg: string) => SocketFunction;
/** /**
* get corresponding Socketrequest instance by shortId * get corresponding Socketrequest instance by shortId
@ -9,4 +12,4 @@ export declare let getSocketRequestById: (shortIdArg: string, requestSide?: TSoc
/** /**
* get corresponding SocketRole instance by name * get corresponding SocketRole instance by name
*/ */
export declare let getSocketRoleByName: (socketRoleNameArg: string) => SocketRole; export declare let getSocketRoleByName: (socketRoleNameArg: string, referenceSmartsocket: Smartsocket) => SocketRole;

View File

@ -1,7 +1,14 @@
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const plugins = require("./smartsocket.plugins");
const smartsocket_classes_socketfunction_1 = require("./smartsocket.classes.socketfunction"); const smartsocket_classes_socketfunction_1 = require("./smartsocket.classes.socketfunction");
const smartsocket_classes_socketrequest_1 = require("./smartsocket.classes.socketrequest"); const smartsocket_classes_socketrequest_1 = require("./smartsocket.classes.socketrequest");
const smartsocket_classes_socketrole_1 = require("./smartsocket.classes.socketrole"); // SocketConnection helpers
exports.checkPasswordForRole = (dataArg, referenceSmartsocket) => {
let targetPasswordHash = exports.getSocketRoleByName(dataArg.role, referenceSmartsocket).passwordHash;
let computedCompareHash = plugins.nodehash.sha256FromStringSync(dataArg.password);
return targetPasswordHash === computedCompareHash;
};
// SocketFunction helpers // SocketFunction helpers
exports.getSocketFunctionByName = (functionNameArg) => { exports.getSocketFunctionByName = (functionNameArg) => {
return smartsocket_classes_socketfunction_1.allSocketFunctions.find((socketFunctionArg) => { return socketFunctionArg.name === functionNameArg; }); return smartsocket_classes_socketfunction_1.allSocketFunctions.find((socketFunctionArg) => { return socketFunctionArg.name === functionNameArg; });
@ -17,7 +24,7 @@ exports.getSocketRequestById = (shortIdArg, requestSide) => {
/** /**
* get corresponding SocketRole instance by name * get corresponding SocketRole instance by name
*/ */
exports.getSocketRoleByName = (socketRoleNameArg) => { exports.getSocketRoleByName = (socketRoleNameArg, referenceSmartsocket) => {
return smartsocket_classes_socketrole_1.allSocketRoles.find((socketRoleArg) => { return socketRoleArg.name === socketRoleNameArg; }); return referenceSmartsocket.socketRoles.find((socketRoleArg) => { return socketRoleArg.name === socketRoleNameArg; });
}; };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0c29ja2V0LmhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUlBLHFEQUFtRCxzQ0FBc0MsQ0FBQyxDQUFBO0FBRTFGLG9EQUFxRSxxQ0FBcUMsQ0FBQyxDQUFBO0FBQzNHLGlEQUEyQyxrQ0FBa0MsQ0FBQyxDQUFBO0FBRTlFLHlCQUF5QjtBQUNkLCtCQUF1QixHQUFHLENBQUMsZUFBdUI7SUFDekQsTUFBTSxDQUFDLHVEQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLGlCQUFpQixPQUFPLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakgsQ0FBQyxDQUFBO0FBRUQsd0JBQXdCO0FBRXhCOztHQUVHO0FBQ1EsNEJBQW9CLEdBQUcsQ0FBQyxVQUFpQixFQUFDLFdBQStCO0lBQ2hGLE1BQU0sQ0FBQyxxREFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsT0FBTSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxLQUFLLFVBQVUsQ0FBQSxDQUFBLENBQUMsQ0FBQyxDQUFBO0FBQ3pHLENBQUMsQ0FBQTtBQUVELHFCQUFxQjtBQUVyQjs7R0FFRztBQUNRLDJCQUFtQixHQUFHLENBQUMsaUJBQXlCO0lBQ3ZELE1BQU0sQ0FBQywrQ0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsT0FBTyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxpQkFBaUIsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ3RHLENBQUMsQ0FBQyJ9 //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0c29ja2V0LmhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxpREFBaUQ7QUFJakQsNkZBQTBGO0FBRTFGLDJGQUEyRztBQUczRywyQkFBMkI7QUFDaEIsUUFBQSxvQkFBb0IsR0FBRyxDQUFDLE9BQThDLEVBQUUsb0JBQWdDO0lBQy9HLElBQUksa0JBQWtCLEdBQUcsMkJBQW1CLENBQUMsT0FBTyxDQUFDLElBQUksRUFBQyxvQkFBb0IsQ0FBQyxDQUFDLFlBQVksQ0FBQztJQUM3RixJQUFJLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2xGLE1BQU0sQ0FBQyxrQkFBa0IsS0FBSyxtQkFBbUIsQ0FBQztBQUN0RCxDQUFDLENBQUE7QUFHRCx5QkFBeUI7QUFDZCxRQUFBLHVCQUF1QixHQUFHLENBQUMsZUFBdUI7SUFDekQsTUFBTSxDQUFDLHVEQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLGlCQUFpQixPQUFPLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakgsQ0FBQyxDQUFBO0FBRUQsd0JBQXdCO0FBRXhCOztHQUVHO0FBQ1EsUUFBQSxvQkFBb0IsR0FBRyxDQUFDLFVBQWtCLEVBQUUsV0FBZ0M7SUFDbkYsTUFBTSxDQUFDLHFEQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLGdCQUFnQixPQUFPLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEtBQUssVUFBVSxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDM0csQ0FBQyxDQUFBO0FBRUQscUJBQXFCO0FBRXJCOztHQUVHO0FBQ1EsUUFBQSxtQkFBbUIsR0FBRyxDQUFDLGlCQUF5QixFQUFDLG9CQUFnQztJQUN4RixNQUFNLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsT0FBTyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxpQkFBaUIsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ3hILENBQUMsQ0FBQyJ9

View File

@ -1,8 +1,8 @@
import "typings-global"; import 'typings-global';
export import beautylog = require("beautylog"); export import beautylog = require('beautylog');
export import lik = require("lik"); export import lik = require('lik');
export import q = require("q"); export import nodehash = require('nodehash');
export import shortid = require("shortid"); export import smartq = require('smartq');
export import socketIo = require("socket.io"); export import shortid = require('shortid');
export import socketIoClient = require("socket.io-client"); export import socketIo = require('socket.io');
export import taskbuffer = require("taskbuffer"); export import socketIoClient = require('socket.io-client');

View File

@ -1,10 +1,11 @@
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true });
require("typings-global"); require("typings-global");
exports.beautylog = require("beautylog"); exports.beautylog = require("beautylog");
exports.lik = require("lik"); exports.lik = require("lik");
exports.q = require("q"); exports.nodehash = require("nodehash");
exports.smartq = require("smartq");
exports.shortid = require("shortid"); exports.shortid = require("shortid");
exports.socketIo = require("socket.io"); exports.socketIo = require("socket.io");
exports.socketIoClient = require("socket.io-client"); exports.socketIoClient = require("socket.io-client");
exports.taskbuffer = require("taskbuffer"); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQucGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0c29ja2V0LnBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwwQkFBdUI7QUFDdkIseUNBQThDO0FBQzlDLDZCQUFtQztBQUNuQyx1Q0FBNEM7QUFDNUMsbUNBQXdDO0FBQ3hDLHFDQUEwQztBQUMxQyx3Q0FBNkM7QUFDN0MscURBQTBEIn0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQucGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0c29ja2V0LnBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLFFBQU8sZ0JBQWdCLENBQUMsQ0FBQTtBQUNWLGlCQUFTLFdBQVcsV0FBVyxDQUFDLENBQUM7QUFDakMsV0FBRyxXQUFZLEtBQUssQ0FBQyxDQUFDO0FBQ3RCLFNBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztBQUNqQixlQUFPLFdBQVcsU0FBUyxDQUFDLENBQUM7QUFDN0IsZ0JBQVEsV0FBVyxXQUFXLENBQUMsQ0FBQztBQUNoQyxzQkFBYyxXQUFXLGtCQUFrQixDQUFDLENBQUM7QUFDN0Msa0JBQVUsV0FBVyxZQUFZLENBQUMsQ0FBQyJ9

111
docs/index.md Normal file
View File

@ -0,0 +1,111 @@
# smartsocket
easy and secure websocket communication, TypeScript ready
## Availabililty
[![npm](https://pushrocks.gitlab.io/assets/repo-button-npm.svg)](https://www.npmjs.com/package/smartsocket)
[![git](https://pushrocks.gitlab.io/assets/repo-button-git.svg)](https://GitLab.com/pushrocks/smartsocket)
[![git](https://pushrocks.gitlab.io/assets/repo-button-mirror.svg)](https://github.com/pushrocks/smartsocket)
[![docs](https://pushrocks.gitlab.io/assets/repo-button-docs.svg)](https://pushrocks.gitlab.io/smartsocket/)
## Status for master
[![build status](https://GitLab.com/pushrocks/smartsocket/badges/master/build.svg)](https://GitLab.com/pushrocks/smartsocket/commits/master)
[![coverage report](https://GitLab.com/pushrocks/smartsocket/badges/master/coverage.svg)](https://GitLab.com/pushrocks/smartsocket/commits/master)
[![npm downloads per month](https://img.shields.io/npm/dm/smartsocket.svg)](https://www.npmjs.com/package/smartsocket)
[![Dependency Status](https://david-dm.org/pushrocks/smartsocket.svg)](https://david-dm.org/pushrocks/smartsocket)
[![bitHound Dependencies](https://www.bithound.io/github/pushrocks/smartsocket/badges/dependencies.svg)](https://www.bithound.io/github/pushrocks/smartsocket/master/dependencies/npm)
[![bitHound Code](https://www.bithound.io/github/pushrocks/smartsocket/badges/code.svg)](https://www.bithound.io/github/pushrocks/smartsocket)
[![TypeScript](https://img.shields.io/badge/TypeScript-2.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/)
[![node](https://img.shields.io/badge/node->=%206.x.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/)
[![JavaScript Style Guide](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](http://standardjs.com/)
## Usage
Use TypeScript for best in class instellisense.
Under the hood we use socket.io and shortid for managed data exchange.
### Serverside
```typescript
import * as smartsocket from "smartsocket";
import * as q from q // q is a promise library
// The "Smartsocket" listens on a port and can receive new "SocketConnection" requests.
let mySmartsocket = new smartsocket.Smartsocket({
port: 3000 // the port smartsocket will listen on
});
// A "SocketRole" can be referenced by "SocketFunction"s.
// All "SocketRequest"s carry authentication data for a specific "SocketRole".
// "SocketFunction"s know which "SocketRole"s are allowed to execute them
let mySocketRole = new smartsocket.SocketRole({
name: "someRoleName",
passwordHash: "someHashedString"
});
// A "SocketFunction" executes a referenced function and passes in any data of the corresponding "SocketRequest".
// The referenced function must return a promise and resolve with data of type any.
// Any "SocketRequest" carries a unique identifier. If the referenced function's promise resolved any passed on argument will be returned to the requesting party
let testSocketFunction1 = new smartsocket.SocketFunction({
funcName:"testSocketFunction1",
funcDef:(data) => {
console.log('testSocketFunction1 executed successfully!')
},
allowedRoles:[mySocketRole] // all roles that have access to a specific function
});
// A "Smartsocket" exposes a .clientCall() that gets
// 1. the name of the "SocketFunction" on the client side
// 2. the data to pass in
// 3. And a target "SocketConnection" (there can be multiple connections at once)
// any unique id association is done internally
mySmartsocket.clientCall("restart",data,someTargetConnection)
.then((responseData) => {
});
```
#### Client side
```typescript
import * as smartsocket from "smartsocket";
// A "SmartsocketClient" is different from a "Smartsocket" in that it doesn't expose any public address.
// Thus any new "SocketConnection"s must be innitiated from a "SmartsocketClient".
let testSmartsocketClient = new smartsocket.SmartsocketClient({
port: testConfig.port,
url: "http://localhost",
password: "testPassword",
alias: "testClient1",
role: "testRole1"
});
// You can .connect() and .disconnect() from a "Smartsocket"
testSmartsocketClient.connect()
.then(() => {
done();
});
// The client can also specify "SocketFunction"s. It can also specify "SocketRole"s in case a client connects to multiple servers at once
let testSocketFunction2 = new smartsocket.SocketFunction({
funcName: "testSocketFunction2",
funcDef: (data) => {}, // the function to execute, has to return promise
allowedRoles:[]
});
// A "SmartsocketClient" can call functions on the serverside using .serverCall() analog to the "Smartsocket"'s .clientCall method.
mySmartsocketClient.serverCall("function",functionCallData)
.then((functionResponseData) => { // the functionResponseData comes from the server... awesome, right?
});;
```
> **NOTE:**
you can easily chain dependent requests on either the server or client side with promises.
`data` is always a js object that you can design for your specific needs.
It supports buffers for large binary data network exchange.
For further information read the linked docs at the top of this README.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
[![repo-footer](https://pushrocks.gitlab.io/assets/repo-footer.svg)](https://push.rocks)

View File

@ -1,5 +1,8 @@
{ {
"npmts":{ "npmts":{},
"coverageTreshold":50 "npmci": {
"globalNpmTools": [
"npmts"
]
} }
} }

View File

@ -1,7 +1,7 @@
{ {
"name": "smartsocket", "name": "smartsocket",
"version": "1.0.6", "version": "1.1.10",
"description": "easy and secure websocket communication, Typescript ready", "description": "easy and secure websocket communication, TypeScript ready",
"main": "dist/index.js", "main": "dist/index.js",
"typings": "dist/index.d.ts", "typings": "dist/index.d.ts",
"scripts": { "scripts": {
@ -18,21 +18,19 @@
}, },
"homepage": "https://gitlab.com/pushrocks/smartsocket#README", "homepage": "https://gitlab.com/pushrocks/smartsocket#README",
"dependencies": { "dependencies": {
"@types/q": "0.x.x", "@types/shortid": "0.0.29",
"@types/shortid": "0.0.27", "@types/socket.io": "^1.4.29",
"@types/socket.io": "^1.4.26", "@types/socket.io-client": "^1.4.29",
"@types/socket.io-client": "^1.4.26", "beautylog": "^6.1.10",
"beautylog": "^5.0.20", "lik": "^1.0.38",
"lik": "^1.0.15", "nodehash": "^1.0.4",
"q": "^1.4.1", "shortid": "^2.2.8",
"shortid": "^2.2.6", "smartq": "^1.1.6",
"socket.io": "^1.4.8", "socket.io": "^2.0.3",
"socket.io-client": "^1.4.8", "socket.io-client": "^2.0.3",
"taskbuffer": "^1.0.7" "typings-global": "^1.0.19"
}, },
"devDependencies": { "devDependencies": {
"npmts-g": "^5.2.8", "tapbundle": "^1.1.0"
"should": "^11.0.0",
"typings-test": "^1.0.1"
} }
} }

2
test/test.d.ts vendored
View File

@ -1,2 +0,0 @@
import "typings-test";
import "should";

View File

@ -1,75 +0,0 @@
"use strict";
require("typings-test");
require("should");
const smartsocket = require("../dist/index");
const q = require("q");
let testSmartsocket;
let testSmartsocketClient;
let testSocketFunction1;
let testConfig = {
port: 3000
};
describe("smartsocket", function () {
describe("class Smartsocket", function () {
it("should create a new smartsocket", function () {
testSmartsocket = new smartsocket.Smartsocket({ port: testConfig.port });
testSmartsocket.should.be.instanceOf(smartsocket.Smartsocket);
});
it("should start listening when .started is called", function () {
testSmartsocket.startServer();
});
});
describe("class SocketRole", function () {
});
describe("class SocketFunction", function () {
it("should register a new Function", function () {
testSocketFunction1 = new smartsocket.SocketFunction({
funcName: "testFunction1",
funcDef: () => {
let done = q.defer();
return done.promise;
},
allowedRoles: []
});
});
});
describe("class SmartsocketClient", function () {
it("should react to a new websocket connection from client", function (done) {
this.timeout(10000);
testSmartsocketClient = new smartsocket.SmartsocketClient({
port: testConfig.port,
url: "http://localhost",
password: "testPassword",
alias: "testClient1",
role: undefined
});
testSmartsocketClient.connect()
.then(() => {
done();
});
});
it("client should disconnect and reconnect", function (done) {
this.timeout(10000);
testSmartsocketClient.disconnect()
.then(() => {
let done = q.defer();
setTimeout(() => {
testSmartsocketClient.connect()
.then(done.resolve);
}, 0);
return done.promise;
})
.then(() => {
done();
});
});
it("2 clients should connect in parallel", function () {
});
});
describe("terminating smartsocket", function () {
it("should close the server", function () {
testSmartsocket.closeServer();
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLFFBQU8sY0FBYyxDQUFDLENBQUE7QUFDdEIsUUFBTyxRQUFRLENBQUMsQ0FBQTtBQUVoQixNQUFPLFdBQVcsV0FBVyxlQUFlLENBQUMsQ0FBQztBQUM5QyxNQUFPLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztBQUV4QixJQUFJLGVBQXdDLENBQUM7QUFDN0MsSUFBSSxxQkFBb0QsQ0FBQztBQUN6RCxJQUFJLG1CQUE4QyxDQUFDO0FBRW5ELElBQUksVUFBVSxHQUFHO0lBQ2IsSUFBSSxFQUFFLElBQUk7Q0FDYixDQUFBO0FBRUQsUUFBUSxDQUFDLGFBQWEsRUFBRTtJQUNwQixRQUFRLENBQUMsbUJBQW1CLEVBQUU7UUFDMUIsRUFBRSxDQUFDLGlDQUFpQyxFQUFFO1lBQ2xDLGVBQWUsR0FBRyxJQUFJLFdBQVcsQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDekUsZUFBZSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNsRSxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyxnREFBZ0QsRUFBRTtZQUNqRCxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQztJQUNILFFBQVEsQ0FBQyxrQkFBa0IsRUFBRTtJQUU3QixDQUFDLENBQUMsQ0FBQTtJQUNGLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRTtRQUM3QixFQUFFLENBQUMsZ0NBQWdDLEVBQUU7WUFDakMsbUJBQW1CLEdBQUcsSUFBSSxXQUFXLENBQUMsY0FBYyxDQUFDO2dCQUNqRCxRQUFRLEVBQUMsZUFBZTtnQkFDeEIsT0FBTyxFQUFFO29CQUNMLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDckIsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQ3hCLENBQUM7Z0JBQ0QsWUFBWSxFQUFDLEVBQUU7YUFDbEIsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQztJQUNILFFBQVEsQ0FBQyx5QkFBeUIsRUFBRTtRQUNoQyxFQUFFLENBQUMsd0RBQXdELEVBQUUsVUFBVSxJQUFJO1lBQ3ZFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEIscUJBQXFCLEdBQUcsSUFBSSxXQUFXLENBQUMsaUJBQWlCLENBQUM7Z0JBQ3RELElBQUksRUFBRSxVQUFVLENBQUMsSUFBSTtnQkFDckIsR0FBRyxFQUFFLGtCQUFrQjtnQkFDdkIsUUFBUSxFQUFFLGNBQWM7Z0JBQ3hCLEtBQUssRUFBRSxhQUFhO2dCQUNwQixJQUFJLEVBQUUsU0FBUzthQUNsQixDQUFDLENBQUM7WUFDSCxxQkFBcUIsQ0FBQyxPQUFPLEVBQUU7aUJBQzFCLElBQUksQ0FBQztnQkFDRixJQUFJLEVBQUUsQ0FBQztZQUNYLENBQUMsQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsd0NBQXdDLEVBQUUsVUFBVSxJQUFJO1lBQ3ZELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEIscUJBQXFCLENBQUMsVUFBVSxFQUFFO2lCQUM3QixJQUFJLENBQUM7Z0JBQ0YsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNyQixVQUFVLENBQUM7b0JBQ1AscUJBQXFCLENBQUMsT0FBTyxFQUFFO3lCQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUMzQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7Z0JBQ0wsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDeEIsQ0FBQyxDQUFDO2lCQUNELElBQUksQ0FBQztnQkFDRixJQUFJLEVBQUUsQ0FBQztZQUNYLENBQUMsQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsc0NBQXNDLEVBQUU7UUFFM0MsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQztJQUNILFFBQVEsQ0FBQyx5QkFBeUIsRUFBRTtRQUNoQyxFQUFFLENBQUMseUJBQXlCLEVBQUU7WUFDMUIsZUFBZSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUMsQ0FBQyJ9

View File

@ -1,79 +1,113 @@
import "typings-test"; import { expect, tap } from 'tapbundle'
import "should";
import socketIoClient = require("socket.io-client");
import smartsocket = require("../dist/index");
import q = require("q");
let testSmartsocket: smartsocket.Smartsocket; import socketIoClient = require('socket.io-client')
let testSmartsocketClient: smartsocket.SmartsocketClient; import smartsocket = require('../dist/index')
let testSocketFunction1:smartsocket.SocketFunction; import smartq = require('smartq')
import nodehash = require('nodehash')
let testSmartsocket: smartsocket.Smartsocket
let testSmartsocketClient: smartsocket.SmartsocketClient
let testSocketRole1: smartsocket.SocketRole
let testSocketFunction1: smartsocket.SocketFunction
let testConfig = { let testConfig = {
port: 3000 port: 3000
} }
describe("smartsocket", function () { // class smartsocket
describe("class Smartsocket", function () { tap.test('should create a new smartsocket', async () => {
it("should create a new smartsocket", function () { testSmartsocket = new smartsocket.Smartsocket({ port: testConfig.port })
testSmartsocket = new smartsocket.Smartsocket({ port: testConfig.port }); expect(testSmartsocket).be.instanceOf(smartsocket.Smartsocket)
testSmartsocket.should.be.instanceOf(smartsocket.Smartsocket);
});
it("should start listening when .started is called", function () {
testSmartsocket.startServer();
});
});
describe("class SocketRole", function(){
}) })
describe("class SocketFunction", function () {
it("should register a new Function", function () { tap.test('should start listening when .started is called', async () => {
testSmartsocket.startServer()
})
// class socketrole
tap.test('should add a socketrole', async () => {
testSocketRole1 = new smartsocket.SocketRole({
name: 'testRole1',
passwordHash: nodehash.sha256FromStringSync('testPassword')
})
testSmartsocket.addSocketRoles([ testSocketRole1 ])
})
// class SocketFunction
tap.test('should register a new Function', async () => {
testSocketFunction1 = new smartsocket.SocketFunction({ testSocketFunction1 = new smartsocket.SocketFunction({
funcName:"testFunction1", funcName: 'testFunction1',
funcDef: () => { funcDef: async (dataArg) => {
let done = q.defer(); return dataArg
return done.promise;
}, },
allowedRoles:[] allowedRoles: [ testSocketRole1 ]
}); })
}); })
});
describe("class SmartsocketClient", function () { // class SmartsocketClient
it("should react to a new websocket connection from client", function (done) { tap.test('should react to a new websocket connection from client', async () => {
this.timeout(10000); let done = smartq.defer()
testSmartsocketClient = new smartsocket.SmartsocketClient({ testSmartsocketClient = new smartsocket.SmartsocketClient({
port: testConfig.port, port: testConfig.port,
url: "http://localhost", url: 'http://localhost',
password: "testPassword", password: 'testPassword',
alias: "testClient1", alias: 'testClient1',
role: undefined role: 'testRole1'
}); })
testSmartsocketClient.connect() testSmartsocketClient.connect()
.then(() => { .then(() => {
done(); done.resolve()
}); })
}); await done.promise
it("client should disconnect and reconnect", function (done) { })
this.timeout(10000); tap.test('client should disconnect and reconnect', async () => {
let done = smartq.defer()
testSmartsocketClient.disconnect() testSmartsocketClient.disconnect()
.then(() => { .then(() => {
let done = q.defer(); let done = smartq.defer()
setTimeout(() => { setTimeout(() => {
testSmartsocketClient.connect() testSmartsocketClient.connect()
.then(done.resolve) .then(done.resolve)
}, 0) }, 0)
return done.promise; return done.promise
}) })
.then(() => { .then(() => {
done(); done.resolve()
});
});
it("2 clients should connect in parallel", function () {
});
});
describe("terminating smartsocket", function () {
it("should close the server", function () {
testSmartsocket.closeServer();
});
}) })
}); await done.promise
})
tap.test('2 clients should connect in parallel', async () => {
// nothing here
})
tap.test('should be able to make a functionCall from client to server', async () => {
let done = smartq.defer()
testSmartsocketClient.serverCall('testFunction1', {
value1: 'hello'
}).then((dataArg) => {
console.log(dataArg)
done.resolve()
})
await done.promise
})
tap.test('should be able to make a functionCall from server to client', async () => {
let done = smartq.defer()
let targetSocket = (() => {
return smartsocket.allSocketConnections.find((socketConnectionArg) => {
return socketConnectionArg.alias === 'testClient1'
})
})()
testSmartsocket.clientCall('testFunction1', {
value1: 'helloFromServer'
}, targetSocket).then((dataArg) => {
console.log(dataArg)
done.resolve()
})
})
// terminate
tap.test('should close the server', async () => {
testSmartsocket.closeServer()
})
tap.start()

View File

@ -1,8 +1,12 @@
import * as plugins from "./smartsocket.plugins"; import * as plugins from './smartsocket.plugins'
export * from "./smartsocket.classes.smartsocket"; // export main classes
export * from "./smartsocket.classes.smartsocketclient"; export * from './smartsocket.classes.smartsocket'
export * from "./smartsocket.classes.socketfunction"; export * from './smartsocket.classes.smartsocketclient'
export * from "./smartsocket.classes.socketrole";
// export further classes and objects
export * from './smartsocket.classes.socketfunction'
export * from './smartsocket.classes.socketrole'
export * from './smartsocket.classes.socketconnection'
// need something more exposed? Create an issue on GitLab! // need something more exposed? Create an issue on GitLab!

View File

@ -1,24 +1,80 @@
import * as plugins from "./smartsocket.plugins"; import * as plugins from './smartsocket.plugins'
import * as helpers from "./smartsocket.helpers"; import * as helpers from './smartsocket.helpers'
// classes // classes
import { Objectmap } from "lik"; import { Objectmap } from 'lik'
import { SocketRole } from "./smartsocket.classes.socketrole"; import { SocketFunction, ISocketFunctionCall } from './smartsocket.classes.socketfunction'
import { SocketFunction } from "./smartsocket.classes.socketfunction"; import { SocketConnection } from './smartsocket.classes.socketconnection'
import { SocketConnection } from "./smartsocket.classes.socketconnection"; import { SocketRequest } from './smartsocket.classes.socketrequest'
import { SocketRole } from './smartsocket.classes.socketrole'
export interface ISmartsocketConstructorOptions { export interface ISmartsocketConstructorOptions {
port: number; port: number
}
};
export class Smartsocket { export class Smartsocket {
options: ISmartsocketConstructorOptions options: ISmartsocketConstructorOptions
io: SocketIO.Server; io: SocketIO.Server
openSockets = new Objectmap<SocketConnection>(); openSockets = new Objectmap<SocketConnection>()
socketRoles = new Objectmap<SocketRole>()
constructor (optionsArg: ISmartsocketConstructorOptions) { constructor (optionsArg: ISmartsocketConstructorOptions) {
this.options = optionsArg; this.options = optionsArg
}; }
/**
* starts listening to incoming sockets:
*/
async startServer () {
this.io = plugins.socketIo(this.options.port)
this.io.on('connection', (socketArg) => {
this._handleSocketConnection(socketArg)
})
}
/**
* closes the server
*/
async closeServer () {
this.openSockets.forEach((socketObjectArg: SocketConnection) => {
plugins.beautylog.log(`disconnect socket with >>alias ${socketObjectArg.alias}`)
socketObjectArg.socket.disconnect()
})
this.openSockets.wipe()
this.io.close()
}
// communication
/**
* allows call to specific client.
*/
clientCall (functionNameArg: string, dataArg: any, targetSocketConnectionArg: SocketConnection) {
let done = plugins.smartq.defer()
let socketRequest = new SocketRequest({
side: 'requesting',
originSocketConnection: targetSocketConnectionArg,
shortId: plugins.shortid.generate(),
funcCallData: {
funcName: functionNameArg,
funcDataArg: dataArg
}
})
socketRequest.dispatch()
.then((dataArg: ISocketFunctionCall) => {
done.resolve(dataArg.funcDataArg)
})
return done.promise
}
/**
* adds socketRoles
*/
addSocketRoles (socketRolesArray: SocketRole[]): void {
for (let socketRole of socketRolesArray) {
this.socketRoles.add(socketRole)
}
return
}
/** /**
* the standard handler for new socket connections * the standard handler for new socket connections
@ -28,36 +84,19 @@ export class Smartsocket {
alias: undefined, alias: undefined,
authenticated: false, authenticated: false,
role: undefined, role: undefined,
side: 'server',
smartsocketHost: this,
socket: socketArg socket: socketArg
}); })
plugins.beautylog.log("Socket connected. Trying to authenticate...") plugins.beautylog.log('Socket connected. Trying to authenticate...')
this.openSockets.add(socketConnection); this.openSockets.add(socketConnection)
socketConnection.authenticate() socketConnection.authenticate()
.then(socketConnection.listenToFunctionRequests); .then(() => {
}; return socketConnection.listenToFunctionRequests()
})
/** .catch((err) => {
* starts listening to incling sockets: console.log(err)
*/ })
startServer = () => {
this.io = plugins.socketIo(this.options.port);
this.io.on("connection", (socketArg) => {
this._handleSocketConnection(socketArg);
});
} }
closeServer = () => {
this.openSockets.forEach((socketObjectArg: SocketConnection) => {
plugins.beautylog.log(`disconnect socket with >>alias ${socketObjectArg.alias}`);
socketObjectArg.socket.disconnect();
});
this.openSockets.wipe();
this.io.close();
};
// communication
clientCall(){
// TODO: target specific client and initiate response
}
} }

View File

@ -1,91 +1,95 @@
import * as plugins from "./smartsocket.plugins" import * as plugins from './smartsocket.plugins'
// import interfaces // import interfaces
import { ISocketFunctionCall } from "./smartsocket.classes.socketfunction"; import { ISocketFunctionCall } from './smartsocket.classes.socketfunction'
import { ISocketRequestDataObject } from "./smartsocket.classes.socketrequest" import { ISocketRequestDataObject } from './smartsocket.classes.socketrequest'
// import classes // import classes
import { SocketConnection } from "./smartsocket.classes.socketconnection"; import { SocketConnection } from './smartsocket.classes.socketconnection'
import { SocketFunction } from "./smartsocket.classes.socketfunction"; import { SocketFunction } from './smartsocket.classes.socketfunction'
import { SocketRequest } from "./smartsocket.classes.socketrequest"; import { SocketRequest } from './smartsocket.classes.socketrequest'
/** /**
* interface for class SmartsocketClient * interface for class SmartsocketClient
*/ */
export interface ISmartsocketClientOptions { export interface ISmartsocketClientOptions {
port: number; port: number
url: string; url: string
alias:string; // an alias makes it easier to identify this client in a multo client environment alias: string // an alias makes it easier to identify this client in a multo client environment
role:string; role: string
password: string; // by setting a password access to functions can be limited password: string // by setting a password access to functions can be limited
} }
export class SmartsocketClient { export class SmartsocketClient {
alias:string; alias: string
role:string; role: string
socketConnection:SocketConnection; socketConnection: SocketConnection
serverUrl:string; serverUrl: string
serverPort:number; serverPort: number
serverPassword:string; serverPassword: string
constructor(optionsArg: ISmartsocketClientOptions) { constructor(optionsArg: ISmartsocketClientOptions) {
this.alias = optionsArg.alias; this.alias = optionsArg.alias
this.role = optionsArg.role; this.role = optionsArg.role
this.serverUrl = optionsArg.url this.serverUrl = optionsArg.url
this.serverPort = optionsArg.port; this.serverPort = optionsArg.port
this.serverPassword = optionsArg.password this.serverPassword = optionsArg.password
}; }
/** /**
* connect the client to the server * connect the client to the server
*/ */
connect () { connect () {
let done = plugins.q.defer(); let done = plugins.smartq.defer()
plugins.beautylog.log("trying to connect..."); plugins.beautylog.log('trying to connect...')
let socketUrl = `${this.serverUrl}:${this.serverPort}`; let socketUrl = `${this.serverUrl}:${this.serverPort}`
this.socketConnection = new SocketConnection({ this.socketConnection = new SocketConnection({
alias: this.alias, alias: this.alias,
authenticated: false, authenticated: false,
role: undefined, role: undefined,
side: 'client',
smartsocketHost: null,
socket: plugins.socketIoClient(socketUrl, { multiplex: false }) socket: plugins.socketIoClient(socketUrl, { multiplex: false })
}); })
this.socketConnection.socket.on("requestAuth", () => { this.socketConnection.socket.on('requestAuth', () => {
console.log("server requested authentication"); console.log('server requested authentication')
this.socketConnection.socket.emit("dataAuth", { this.socketConnection.socket.emit('dataAuth', {
role: this.role, role: this.role,
password: this.serverPassword, password: this.serverPassword,
alias: this.alias alias: this.alias
}); })
this.socketConnection.socket.on("authenticated",() => { this.socketConnection.socket.on('authenticated', () => {
console.log("client is authenticated"); console.log('client is authenticated')
done.resolve(); this.socketConnection.authenticated = true
}); this.socketConnection.listenToFunctionRequests()
}); done.resolve()
return done.promise; })
}; })
disconnect(){ return done.promise
let done = plugins.q.defer();
this.socketConnection.socket.disconnect();
this.socketConnection = undefined;
plugins.beautylog.ok("disconnected!");
done.resolve();
return done.promise;
} }
serverCall(functionNameArg:string,dataArg:ISocketFunctionCall){ disconnect () {
let done = plugins.q.defer(); let done = plugins.smartq.defer()
this.socketConnection.socket.disconnect()
this.socketConnection = undefined
plugins.beautylog.ok('disconnected!')
done.resolve()
return done.promise
}
serverCall (functionNameArg: string, dataArg: any) {
let done = plugins.smartq.defer()
let socketRequest = new SocketRequest({ let socketRequest = new SocketRequest({
side:"requesting", side: 'requesting',
originSocketConnection: this.socketConnection, originSocketConnection: this.socketConnection,
shortId: plugins.shortid.generate(), shortId: plugins.shortid.generate(),
funcCallData: { funcCallData: {
funcName: functionNameArg, funcName: functionNameArg,
funcDataArg: dataArg funcDataArg: dataArg
} }
}); })
socketRequest.dispatch() socketRequest.dispatch()
.then(() => { .then((dataArg: ISocketFunctionCall) => {
done.resolve(); done.resolve(dataArg.funcDataArg)
}); })
return done.promise; return done.promise
}; }
} }

View File

@ -1,53 +1,70 @@
import * as plugins from "./smartsocket.plugins"; import * as plugins from './smartsocket.plugins'
import * as helpers from "./smartsocket.helpers"; import * as helpers from './smartsocket.helpers'
import { Objectmap } from 'lik'
// import classes // import classes
import { SocketFunction } from "./smartsocket.classes.socketfunction"; import { Smartsocket } from './smartsocket.classes.smartsocket'
import { SocketRequest, ISocketRequestDataObject, allSocketRequests } from "./smartsocket.classes.socketrequest"; import { SocketFunction } from './smartsocket.classes.socketfunction'
import { SocketRole } from "./smartsocket.classes.socketrole"; import { SocketRequest, ISocketRequestDataObject, allSocketRequests } from './smartsocket.classes.socketrequest'
import { SocketRole } from './smartsocket.classes.socketrole'
// export interfaces // export interfaces
/**
* defines is a SocketConnection is server or client side. Important for mesh setups.
*/
export type TSocketConnectionSide = 'server' | 'client'
/** /**
* interface for constructor of class SocketConnection * interface for constructor of class SocketConnection
*/ */
export interface ISocketConnectionConstructorOptions { export interface ISocketConnectionConstructorOptions {
alias: string; alias: string
authenticated: boolean; authenticated: boolean
role: SocketRole; role: SocketRole
socket: SocketIO.Socket | SocketIOClient.Socket; side: TSocketConnectionSide
}; smartsocketHost: Smartsocket
socket: SocketIO.Socket | SocketIOClient.Socket
}
/** /**
* interface for authentication data * interface for authentication data
*/ */
export interface ISocketConnectionAuthenticationObject { export interface ISocketConnectionAuthenticationObject {
role: "coreflowContainer", role: 'coreflowContainer',
password: "somePassword", password: 'somePassword',
alias: "coreflow1" alias: 'coreflow1'
} }
// export classes // export classes
export let allSocketConnections = new Objectmap<SocketConnection>()
/** /**
* class SocketConnection represents a websocket connection * class SocketConnection represents a websocket connection
*/ */
export class SocketConnection { export class SocketConnection {
alias: string; alias: string
authenticated: boolean; side: TSocketConnectionSide
role: SocketRole; authenticated: boolean = false
socket: SocketIO.Socket | SocketIOClient.Socket; role: SocketRole
smartsocketHost: Smartsocket
socket: any //: SocketIO.Socket | SocketIOClient.Socket
constructor (optionsArg: ISocketConnectionConstructorOptions) { constructor (optionsArg: ISocketConnectionConstructorOptions) {
this.alias = optionsArg.alias; this.alias = optionsArg.alias
this.authenticated = optionsArg.authenticated; this.authenticated = optionsArg.authenticated
this.role = optionsArg.role; this.role = optionsArg.role
this.socket = optionsArg.socket; this.side = optionsArg.side
this.smartsocketHost = optionsArg.smartsocketHost
this.socket = optionsArg.socket
// standard behaviour that is always true // standard behaviour that is always true
this.socket.on("disconnect", () => { allSocketConnections.add(this)
plugins.beautylog.info(`Client ${this.alias} disconnected`); this.socket.on('disconnect', () => {
}); plugins.beautylog.info(`SocketConnection with >alias ${this.alias} on >side ${this.side} disconnected`)
}; allSocketConnections.remove(this)
})
}
// authenticating -------------------------- // authenticating --------------------------
@ -55,25 +72,26 @@ export class SocketConnection {
* authenticate the socket * authenticate the socket
*/ */
authenticate () { authenticate () {
let done = plugins.q.defer(); let done = plugins.smartq.defer()
this.socket.on("dataAuth", dataArg => { this.socket.on('dataAuth', (dataArg: ISocketConnectionAuthenticationObject) => {
plugins.beautylog.log("received authentication data. now hashing and comparing..."); plugins.beautylog.log('received authentication data. now hashing and comparing...')
this.socket.removeListener("dataAuth", () => { }); this.socket.removeListener('dataAuth', () => { })
if ((true)) { // TODO: authenticate password if (helpers.checkPasswordForRole(dataArg, this.smartsocketHost)) { // TODO: authenticate password
this.alias = dataArg.alias this.alias = dataArg.alias
this.authenticated = true; this.authenticated = true
this.role = helpers.getSocketRoleByName(dataArg.role); this.role = helpers.getSocketRoleByName(dataArg.role, this.smartsocketHost)
this.socket.emit("authenticated"); this.socket.emit('authenticated')
plugins.beautylog.ok(`socket with >>alias ${this.alias} >>role ${this.role} is authenticated!`); plugins.beautylog.ok(`socket with >>alias ${this.alias} >>role ${this.role} is authenticated!`)
done.resolve(this); done.resolve(this)
} else { } else {
this.socket.disconnect(); this.authenticated = false
done.reject("not authenticated"); this.socket.disconnect()
}; done.reject('not authenticated')
}); }
this.socket.emit("requestAuth"); })
return done.promise; this.socket.emit('requestAuth')
}; return done.promise
}
// listening ------------------------------- // listening -------------------------------
@ -81,35 +99,42 @@ export class SocketConnection {
* listen to function requests * listen to function requests
*/ */
listenToFunctionRequests () { listenToFunctionRequests () {
let done = plugins.q.defer(); let done = plugins.smartq.defer()
if (this.authenticated) { if (this.authenticated) {
this.socket.on("function", (dataArg:ISocketRequestDataObject) => { this.socket.on('function', (dataArg: ISocketRequestDataObject) => {
// check if requested function is available to the socket's scope // check if requested function is available to the socket's scope
plugins.beautylog.log('function request received')
let referencedFunction: SocketFunction = this.role.allowedFunctions.find((socketFunctionArg) => { let referencedFunction: SocketFunction = this.role.allowedFunctions.find((socketFunctionArg) => {
return socketFunctionArg.name === dataArg.funcCallData.funcName; return socketFunctionArg.name === dataArg.funcCallData.funcName
}); })
if (referencedFunction !== undefined) { if (referencedFunction !== undefined) {
plugins.beautylog.ok!('function in access scope')
let localSocketRequest = new SocketRequest({ let localSocketRequest = new SocketRequest({
side:"responding", side: 'responding',
originSocketConnection: this, originSocketConnection: this,
shortId: dataArg.shortId, shortId: dataArg.shortId,
funcCallData: dataArg.funcCallData funcCallData: dataArg.funcCallData
});
localSocketRequest.createResponse(); // takes care of creating response and sending it back
} else {
plugins.beautylog.warn("function not existent or out of access scope");
};
});
this.socket.on("functionResponse", (dataArg:ISocketRequestDataObject) => {
let targetSocketRequest = helpers.getSocketRequestById(dataArg.shortId);
targetSocketRequest.handleResponse(dataArg);
}) })
localSocketRequest.createResponse() // takes care of creating response and sending it back
} else { } else {
done.reject("socket needs to be authenticated first"); plugins.beautylog.warn('function not existent or out of access scope')
}; }
return done.promise; })
}; this.socket.on('functionResponse', (dataArg: ISocketRequestDataObject) => {
plugins.beautylog.info(`received response for request with id ${dataArg.shortId}`)
let targetSocketRequest = helpers.getSocketRequestById(dataArg.shortId)
targetSocketRequest.handleResponse(dataArg)
})
plugins.beautylog.log(`now listening to function requests for ${this.alias}`)
done.resolve(this)
} else {
let errMessage: 'socket needs to be authenticated first'
plugins.beautylog.error(errMessage)
done.reject(errMessage)
}
return done.promise
}
// sending ---------------------- // sending ----------------------
}; }

View File

@ -1,8 +1,8 @@
import * as plugins from "./smartsocket.plugins"; import * as plugins from './smartsocket.plugins'
// import classes // import classes
import { Objectmap } from "lik"; import { Objectmap } from 'lik'
import { SocketRole } from "./smartsocket.classes.socketrole"; import { SocketRole } from './smartsocket.classes.socketrole'
// export interfaces // export interfaces
@ -10,18 +10,18 @@ import { SocketRole } from "./smartsocket.classes.socketrole";
* interface of the contructor options of class SocketFunction * interface of the contructor options of class SocketFunction
*/ */
export interface ISocketFunctionConstructorOptions { export interface ISocketFunctionConstructorOptions {
funcName: string; funcName: string
funcDef: any; funcDef: any
allowedRoles: SocketRole[]; // all roles that are allowed to execute a SocketFunction allowedRoles: SocketRole[] // all roles that are allowed to execute a SocketFunction
}; }
/** /**
* interface of the Socket Function call, in other words the object that routes a call to a function * interface of the Socket Function call, in other words the object that routes a call to a function
*/ */
export interface ISocketFunctionCall { export interface ISocketFunctionCall {
funcName:string; funcName: string
funcDataArg:any; funcDataArg: any
}; }
/** /**
* interface for function definition of SocketFunction * interface for function definition of SocketFunction
@ -31,7 +31,7 @@ export interface IFuncDef {
} }
// export objects // export objects
export let allSocketFunctions = new Objectmap<SocketFunction>(); export let allSocketFunctions = new Objectmap<SocketFunction>()
// export classes // export classes
@ -39,45 +39,48 @@ export let allSocketFunctions = new Objectmap<SocketFunction>();
* class that respresents a function that can be transparently called using a SocketConnection * class that respresents a function that can be transparently called using a SocketConnection
*/ */
export class SocketFunction { export class SocketFunction {
name: string; name: string
funcDef: IFuncDef; funcDef: IFuncDef
roles: SocketRole[]; roles: SocketRole[]
/** /**
* the constructor for SocketFunction * the constructor for SocketFunction
*/ */
constructor (optionsArg: ISocketFunctionConstructorOptions) { constructor (optionsArg: ISocketFunctionConstructorOptions) {
this.name = optionsArg.funcName; this.name = optionsArg.funcName
this.funcDef = optionsArg.funcDef; this.funcDef = optionsArg.funcDef
this.roles = optionsArg.allowedRoles; this.roles = optionsArg.allowedRoles
for (let socketRoleArg of this.roles) { for (let socketRoleArg of this.roles) {
this._notifyRole(socketRoleArg); this._notifyRole(socketRoleArg)
}; }
allSocketFunctions.add(this); // map instance with Objectmap allSocketFunctions.add(this) // map instance with Objectmap
};
/**
* notifies a role about access to this SocketFunction
*/
private _notifyRole(socketRoleArg:SocketRole){
socketRoleArg.addSocketFunction(this);
} }
/** /**
* invokes the function of this SocketFunction * invokes the function of this SocketFunction
*/ */
invoke(dataArg:ISocketFunctionCall):plugins.q.Promise<any> { invoke (dataArg: ISocketFunctionCall): Promise<any> {
let done = plugins.q.defer(); let done = plugins.smartq.defer()
if (dataArg.funcName === this.name) { if (dataArg.funcName === this.name) {
this.funcDef(dataArg.funcDataArg) this.funcDef(dataArg.funcDataArg)
.then((resultData: any) => { .then((resultData: any) => {
done.resolve(resultData); let funcResponseData: ISocketFunctionCall = {
}); funcName: this.name,
funcDataArg: resultData
}
done.resolve(funcResponseData)
})
} else { } else {
throw new Error("SocketFunction.name does not match the data argument's .name!"); throw new Error("SocketFunction.name does not match the data argument's .name!")
}
return done.promise
} }
return done.promise;
};
/**
* notifies a role about access to this SocketFunction
*/
private _notifyRole (socketRoleArg: SocketRole) {
socketRoleArg.addSocketFunction(this)
}
} }

View File

@ -1,54 +1,55 @@
import * as plugins from "./smartsocket.plugins"; import * as plugins from './smartsocket.plugins'
import * as helpers from "./smartsocket.helpers"; import * as helpers from './smartsocket.helpers'
// import interfaces // import interfaces
import { ISocketFunctionCall } from "./smartsocket.classes.socketfunction"; import { ISocketFunctionCall } from './smartsocket.classes.socketfunction'
// import classes // import classes
import { Objectmap } from "lik"; import { Objectmap } from 'lik'
import { SocketFunction } from "./smartsocket.classes.socketfunction"; import { SocketFunction } from './smartsocket.classes.socketfunction'
import { SocketConnection } from "./smartsocket.classes.socketconnection"; import { SocketConnection } from './smartsocket.classes.socketconnection'
// export interfaces // export interfaces
export type TSocketRequestStatus = "new" | "pending" | "finished"; export type TSocketRequestStatus = 'new' | 'pending' | 'finished'
export type TSocketRequestSide = "requesting" | "responding"; export type TSocketRequestSide = 'requesting' | 'responding'
/** /**
* interface of constructor of class SocketRequest * interface of constructor of class SocketRequest
*/ */
export interface SocketRequestConstructorOptions { export interface SocketRequestConstructorOptions {
side: TSocketRequestSide; side: TSocketRequestSide
originSocketConnection: SocketConnection; originSocketConnection: SocketConnection
shortId: string; shortId: string
funcCallData?: ISocketFunctionCall; funcCallData?: ISocketFunctionCall
}; }
/** /**
* request object that is sent initially and may or may not receive a response * request object that is sent initially and may or may not receive a response
*/ */
export interface ISocketRequestDataObject { export interface ISocketRequestDataObject {
funcCallData: ISocketFunctionCall; funcCallData: ISocketFunctionCall
shortId: string; shortId: string
responseTimeout?: number; responseTimeout?: number
}; }
// export objects // export objects
export let allSocketRequests = new Objectmap<SocketRequest>(); export let allSocketRequests = new Objectmap<SocketRequest>()
// export classes // export classes
export class SocketRequest { export class SocketRequest {
status: TSocketRequestStatus = "new"; status: TSocketRequestStatus = 'new'
side: TSocketRequestSide; side: TSocketRequestSide
shortid: string; shortid: string
originSocketConnection: SocketConnection; originSocketConnection: SocketConnection
funcCallData: ISocketFunctionCall funcCallData: ISocketFunctionCall
done = plugins.q.defer(); done = plugins.smartq.defer()
constructor (optionsArg: SocketRequestConstructorOptions) { constructor (optionsArg: SocketRequestConstructorOptions) {
this.side = optionsArg.side; this.side = optionsArg.side
this.shortid = optionsArg.shortId; this.shortid = optionsArg.shortId
this.funcCallData = optionsArg.funcCallData; this.funcCallData = optionsArg.funcCallData
allSocketRequests.add(this); this.originSocketConnection = optionsArg.originSocketConnection
}; allSocketRequests.add(this)
}
// requesting -------------------------- // requesting --------------------------
@ -60,16 +61,17 @@ export class SocketRequest {
funcCallData: this.funcCallData, funcCallData: this.funcCallData,
shortId: this.shortid shortId: this.shortid
} }
this.originSocketConnection.socket.emit("function", requestData); this.originSocketConnection.socket.emit('function', requestData)
return this.done.promise; return this.done.promise
}; }
/** /**
* handles the response that is received by the requesting side * handles the response that is received by the requesting side
*/ */
handleResponse (responseDataArg: ISocketRequestDataObject) { handleResponse (responseDataArg: ISocketRequestDataObject) {
this.done.resolve(responseDataArg); plugins.beautylog.log('handling response!')
allSocketRequests.remove(this); this.done.resolve(responseDataArg.funcCallData)
allSocketRequests.remove(this)
} }
// responding -------------------------- // responding --------------------------
@ -78,15 +80,17 @@ export class SocketRequest {
* creates the response on the responding side * creates the response on the responding side
*/ */
createResponse () { createResponse () {
let targetSocketFunction: SocketFunction = helpers.getSocketFunctionByName(this.funcCallData.funcName); let targetSocketFunction: SocketFunction = helpers.getSocketFunctionByName(this.funcCallData.funcName)
plugins.beautylog.info(`invoking ${targetSocketFunction.name}`)
targetSocketFunction.invoke(this.funcCallData) targetSocketFunction.invoke(this.funcCallData)
.then((resultData) => { .then((resultData) => {
plugins.beautylog.log('got resultData. Sending it to requesting party.')
let requestData: ISocketRequestDataObject = { let requestData: ISocketRequestDataObject = {
funcCallData: resultData, funcCallData: resultData,
shortId: this.shortid shortId: this.shortid
} }
this.originSocketConnection.socket.emit("functionResponse",requestData); this.originSocketConnection.socket.emit('functionResponse', requestData)
allSocketRequests.remove(this); allSocketRequests.remove(this)
}); })
}
} }
};

View File

@ -5,9 +5,6 @@ import { Objectmap } from "lik";
import { SocketFunction } from "./smartsocket.classes.socketfunction"; import { SocketFunction } from "./smartsocket.classes.socketfunction";
export let allSocketRoles = new Objectmap<SocketRole>();
/** /**
* interface for class SocketRole * interface for class SocketRole
*/ */
@ -26,7 +23,6 @@ export class SocketRole {
constructor(optionsArg: SocketRoleOptions) { constructor(optionsArg: SocketRoleOptions) {
this.name = optionsArg.name; this.name = optionsArg.name;
this.passwordHash = optionsArg.passwordHash; this.passwordHash = optionsArg.passwordHash;
allSocketRoles.add(this);
}; };
addSocketFunction(socketFunctionArg:SocketFunction){ addSocketFunction(socketFunctionArg:SocketFunction){
this.allowedFunctions.add(socketFunctionArg); this.allowedFunctions.add(socketFunctionArg);

View File

@ -3,9 +3,17 @@ import * as plugins from "./smartsocket.plugins";
// classes // classes
import { Smartsocket } from "./smartsocket.classes.smartsocket"; import { Smartsocket } from "./smartsocket.classes.smartsocket";
import { SocketFunction, allSocketFunctions } from "./smartsocket.classes.socketfunction"; import { SocketFunction, allSocketFunctions } from "./smartsocket.classes.socketfunction";
import { SocketConnection } from "./smartsocket.classes.socketconnection"; import { SocketConnection, ISocketConnectionAuthenticationObject } from "./smartsocket.classes.socketconnection";
import { SocketRequest, allSocketRequests, TSocketRequestSide } from "./smartsocket.classes.socketrequest"; import { SocketRequest, allSocketRequests, TSocketRequestSide } from "./smartsocket.classes.socketrequest";
import { SocketRole, allSocketRoles } from "./smartsocket.classes.socketrole"; import { SocketRole } from "./smartsocket.classes.socketrole";
// SocketConnection helpers
export let checkPasswordForRole = (dataArg: ISocketConnectionAuthenticationObject, referenceSmartsocket:Smartsocket): boolean => {
let targetPasswordHash = getSocketRoleByName(dataArg.role,referenceSmartsocket).passwordHash;
let computedCompareHash = plugins.nodehash.sha256FromStringSync(dataArg.password);
return targetPasswordHash === computedCompareHash;
}
// SocketFunction helpers // SocketFunction helpers
export let getSocketFunctionByName = (functionNameArg: string): SocketFunction => { export let getSocketFunctionByName = (functionNameArg: string): SocketFunction => {
@ -26,7 +34,7 @@ export let getSocketRequestById = (shortIdArg:string,requestSide?:TSocketRequest
/** /**
* get corresponding SocketRole instance by name * get corresponding SocketRole instance by name
*/ */
export let getSocketRoleByName = (socketRoleNameArg: string): SocketRole => { export let getSocketRoleByName = (socketRoleNameArg: string,referenceSmartsocket:Smartsocket): SocketRole => {
return allSocketRoles.find((socketRoleArg) => { return socketRoleArg.name === socketRoleNameArg }) return referenceSmartsocket.socketRoles.find((socketRoleArg) => { return socketRoleArg.name === socketRoleNameArg })
}; };

View File

@ -1,8 +1,8 @@
import "typings-global"; import 'typings-global'
export import beautylog = require("beautylog"); export import beautylog = require('beautylog')
export import lik = require("lik"); export import lik = require('lik')
export import q = require("q"); export import nodehash = require('nodehash')
export import shortid = require("shortid"); export import smartq = require('smartq')
export import socketIo = require("socket.io"); export import shortid = require('shortid')
export import socketIoClient = require("socket.io-client"); export import socketIo = require('socket.io')
export import taskbuffer = require("taskbuffer"); export import socketIoClient = require('socket.io-client')

3
tslint.json Normal file
View File

@ -0,0 +1,3 @@
{
"extends": "tslint-config-standard"
}

863
yarn.lock Normal file
View File

@ -0,0 +1,863 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@types/chai-as-promised@0.0.29":
version "0.0.29"
resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-0.0.29.tgz#43d52892aa998e185a3de3e2477edb8573be1d77"
dependencies:
"@types/chai" "*"
"@types/promises-a-plus" "*"
"@types/chai-string@^1.1.30":
version "1.1.30"
resolved "https://registry.yarnpkg.com/@types/chai-string/-/chai-string-1.1.30.tgz#4d8744b31a5a2295fc01c981ed1e2d4c8a070f0a"
dependencies:
"@types/chai" "*"
"@types/chai@*":
version "4.0.1"
resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.0.1.tgz#37fea779617cfec3fd2b19a0247e8bbdd5133bf6"
"@types/chai@^3.4.35":
version "3.5.2"
resolved "https://registry.yarnpkg.com/@types/chai/-/chai-3.5.2.tgz#c11cd2817d3a401b7ba0f5a420f35c56139b1c1e"
"@types/lodash@^4.14.55", "@types/lodash@^4.14.67":
version "4.14.68"
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.68.tgz#754fbab68bd2bbb69547dc8ce7574f7012eed7f6"
"@types/minimatch@2.x.x":
version "2.0.29"
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-2.0.29.tgz#5002e14f75e2d71e564281df0431c8c1b4a2a36a"
"@types/node@*":
version "8.0.8"
resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.8.tgz#0dc4ca2c6f6fc69baee16c5e928c4a627f517ada"
"@types/promises-a-plus@*":
version "0.0.27"
resolved "https://registry.yarnpkg.com/@types/promises-a-plus/-/promises-a-plus-0.0.27.tgz#c64651134614c84b8f5d7114ce8901d36a609780"
"@types/q@0.x.x":
version "0.0.35"
resolved "https://registry.yarnpkg.com/@types/q/-/q-0.0.35.tgz#1893674fb15f138013ec108d233f68fc7df0f155"
"@types/q@1.x.x":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@types/q/-/q-1.0.2.tgz#41f0b0f6ae0eeed3a51b003e2e08cba5525b74f6"
"@types/shelljs@^0.7.2":
version "0.7.2"
resolved "https://registry.yarnpkg.com/@types/shelljs/-/shelljs-0.7.2.tgz#c2bdb3fe80cd7a3da08750ca898ae44c589671f3"
dependencies:
"@types/node" "*"
"@types/shortid@0.0.29":
version "0.0.29"
resolved "https://registry.yarnpkg.com/@types/shortid/-/shortid-0.0.29.tgz#8093ee0416a6e2bf2aa6338109114b3fbffa0e9b"
"@types/socket.io-client@^1.4.29":
version "1.4.29"
resolved "https://registry.yarnpkg.com/@types/socket.io-client/-/socket.io-client-1.4.29.tgz#f8743070cee93175e36e0b6a77a8af73e58ccb32"
"@types/socket.io@^1.4.29":
version "1.4.29"
resolved "https://registry.yarnpkg.com/@types/socket.io/-/socket.io-1.4.29.tgz#86a6b3a9ab78cf9a900ceef85b9b68b6bea86712"
dependencies:
"@types/node" "*"
"@types/through2@0.x.x":
version "0.4.1"
resolved "https://registry.yarnpkg.com/@types/through2/-/through2-0.4.1.tgz#0f008e174c1dc5f1cc7e00eb2d132b2cb67f7bd2"
dependencies:
"@types/node" "*"
"@types/which@^1.0.28":
version "1.0.28"
resolved "https://registry.yarnpkg.com/@types/which/-/which-1.0.28.tgz#016e387629b8817bed653fe32eab5d11279c8df6"
accepts@1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca"
dependencies:
mime-types "~2.1.11"
negotiator "0.6.1"
after@0.8.2:
version "0.8.2"
resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
ansi-256-colors@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/ansi-256-colors/-/ansi-256-colors-1.1.0.tgz#910de50efcc7c09e3d82f2f87abd6b700c18818a"
ansi-regex@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
ansi-styles@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
arraybuffer.slice@0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca"
assertion-error@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c"
backo2@1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
balanced-match@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
base64-arraybuffer@0.1.5:
version "0.1.5"
resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8"
base64id@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6"
beautycolor@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/beautycolor/-/beautycolor-1.0.7.tgz#a4715738ac4c8221371e9cbeb5a6cc6d11ecbf7c"
dependencies:
ansi-256-colors "^1.1.0"
typings-global "^1.0.14"
beautylog@^6.1.10:
version "6.1.10"
resolved "https://registry.yarnpkg.com/beautylog/-/beautylog-6.1.10.tgz#9c27e566937684cb689f9372d98cfa5415d50b72"
dependencies:
"@types/lodash" "^4.14.55"
beautycolor "^1.0.7"
figlet "^1.2.0"
lodash "^4.17.4"
ora "^1.1.0"
smartenv "^2.0.0"
smartq "^1.1.1"
typings-global "^1.0.14"
better-assert@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522"
dependencies:
callsite "1.0.0"
bindings@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11"
blob@0.0.4:
version "0.0.4"
resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921"
brace-expansion@^1.1.7:
version "1.1.8"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292"
dependencies:
balanced-match "^1.0.0"
concat-map "0.0.1"
callsite@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20"
chai-as-promised@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-6.0.0.tgz#1a02a433a6f24dafac63b9c96fa1684db1aa8da6"
dependencies:
check-error "^1.0.2"
chai-string@^1.3.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/chai-string/-/chai-string-1.4.0.tgz#359140c051d36a4e4b1a5fc6b910152f438a8d49"
chai@^3.5.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247"
dependencies:
assertion-error "^1.0.1"
deep-eql "^0.1.3"
type-detect "^1.0.0"
chalk@^1.0.0, chalk@^1.1.1:
version "1.1.3"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
dependencies:
ansi-styles "^2.2.1"
escape-string-regexp "^1.0.2"
has-ansi "^2.0.0"
strip-ansi "^3.0.0"
supports-color "^2.0.0"
check-error@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82"
cli-cursor@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
dependencies:
restore-cursor "^2.0.0"
cli-spinners@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.0.0.tgz#ef987ed3d48391ac3dab9180b406a742180d6e6a"
component-bind@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1"
component-emitter@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
component-inherit@0.0.3:
version "0.0.3"
resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143"
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
cookie@0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
core-util-is@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
debug@2.3.3:
version "2.3.3"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c"
dependencies:
ms "0.7.2"
debug@~2.6.4, debug@~2.6.6:
version "2.6.8"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc"
dependencies:
ms "2.0.0"
deep-eql@^0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2"
dependencies:
type-detect "0.1.1"
define-properties@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94"
dependencies:
foreach "^2.0.5"
object-keys "^1.0.8"
early@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/early/-/early-2.1.1.tgz#841e23254ea5dc54d8afaeee82f5ab65c00ee23c"
dependencies:
beautycolor "^1.0.7"
smartq "^1.1.1"
typings-global "^1.0.16"
engine.io-client@~3.1.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.1.1.tgz#415a9852badb14fa008fa3ef1e31608db6761325"
dependencies:
component-emitter "1.2.1"
component-inherit "0.0.3"
debug "~2.6.4"
engine.io-parser "~2.1.1"
has-cors "1.1.0"
indexof "0.0.1"
parsejson "0.0.3"
parseqs "0.0.5"
parseuri "0.0.5"
ws "~2.3.1"
xmlhttprequest-ssl "1.5.3"
yeast "0.1.2"
engine.io-parser@~2.1.0, engine.io-parser@~2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.1.tgz#e0fb3f0e0462f7f58bb77c1a52e9f5a7e26e4668"
dependencies:
after "0.8.2"
arraybuffer.slice "0.0.6"
base64-arraybuffer "0.1.5"
blob "0.0.4"
has-binary2 "~1.0.2"
engine.io@~3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.1.0.tgz#5ca438e3ce9fdbc915c4a21c8dd9e1266706e57e"
dependencies:
accepts "1.3.3"
base64id "1.0.0"
cookie "0.3.1"
debug "~2.6.4"
engine.io-parser "~2.1.0"
ws "~2.3.1"
optionalDependencies:
uws "~0.14.4"
es-abstract@^1.5.1:
version "1.7.0"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.7.0.tgz#dfade774e01bfcd97f96180298c449c8623fb94c"
dependencies:
es-to-primitive "^1.1.1"
function-bind "^1.1.0"
is-callable "^1.1.3"
is-regex "^1.0.3"
es-to-primitive@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d"
dependencies:
is-callable "^1.1.1"
is-date-object "^1.0.1"
is-symbol "^1.0.1"
es6-error@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.0.2.tgz#eec5c726eacef51b7f6b73c20db6e1b13b069c98"
escape-string-regexp@^1.0.2:
version "1.0.5"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
figlet@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.2.0.tgz#6c46537378fab649146b5a6143dda019b430b410"
foreach@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
fs.realpath@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
function-bind@^1.0.2, function-bind@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771"
glob@^7.0.0:
version "7.1.2"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
minimatch "^3.0.4"
once "^1.3.0"
path-is-absolute "^1.0.0"
has-ansi@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
dependencies:
ansi-regex "^2.0.0"
has-binary2@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.2.tgz#e83dba49f0b9be4d026d27365350d9f03f54be98"
dependencies:
isarray "2.0.1"
has-cors@1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39"
has@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28"
dependencies:
function-bind "^1.0.2"
indexof@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
inflight@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
dependencies:
once "^1.3.0"
wrappy "1"
inherits@2, inherits@~2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
interpret@^1.0.0:
version "1.0.3"
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90"
is-callable@^1.1.1, is-callable@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2"
is-date-object@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
is-regex@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
dependencies:
has "^1.0.1"
is-symbol@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
isarray@2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e"
isarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
leakage@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/leakage/-/leakage-0.3.0.tgz#15d698abdc76bbc6439601f4f3020e77e2d50c39"
dependencies:
es6-error "^4.0.2"
left-pad "^1.1.3"
memwatch-next "^0.3.0"
minimist "^1.2.0"
pretty-bytes "^4.0.2"
left-pad@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.1.3.tgz#612f61c033f3a9e08e939f1caebeea41b6f3199a"
lik@^1.0.38:
version "1.0.38"
resolved "https://registry.yarnpkg.com/lik/-/lik-1.0.38.tgz#ccff0abd3d9236a5e4b7d80d514c5c210f18469b"
dependencies:
"@types/lodash" "^4.14.67"
"@types/minimatch" "2.x.x"
"@types/q" "1.x.x"
lodash "^4.17.4"
minimatch "^3.0.4"
q "^1.5.0"
rxjs "^5.4.1"
smartq "^1.1.1"
typings-global "^1.0.19"
lodash@^4.17.4:
version "4.17.4"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
log-symbols@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18"
dependencies:
chalk "^1.0.0"
memwatch-next@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/memwatch-next/-/memwatch-next-0.3.0.tgz#2111050f9a906e0aa2d72a4ec0f0089c78726f8f"
dependencies:
bindings "^1.2.1"
nan "^2.3.2"
mime-db@~1.27.0:
version "1.27.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1"
mime-types@~2.1.11:
version "2.1.15"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed"
dependencies:
mime-db "~1.27.0"
mimic-fn@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18"
minimatch@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
dependencies:
brace-expansion "^1.1.7"
minimist@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
ms@0.7.2:
version "0.7.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
nan@^2.3.2:
version "2.6.2"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45"
negotiator@0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
nodehash@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/nodehash/-/nodehash-1.0.4.tgz#fd733397a0925b9b4bc19726f3c0e68850206e7f"
dependencies:
"@types/q" "0.x.x"
"@types/through2" "0.x.x"
q "^1.4.1"
through2 "^2.0.1"
typings-global "^1.0.6"
object-assign@~4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
object-component@0.0.3:
version "0.0.3"
resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291"
object-keys@^1.0.8:
version "1.0.11"
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
object.getownpropertydescriptors@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16"
dependencies:
define-properties "^1.1.2"
es-abstract "^1.5.1"
once@^1.3.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
dependencies:
wrappy "1"
onetime@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
dependencies:
mimic-fn "^1.0.0"
ora@^1.1.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/ora/-/ora-1.3.0.tgz#80078dd2b92a934af66a3ad72a5b910694ede51a"
dependencies:
chalk "^1.1.1"
cli-cursor "^2.1.0"
cli-spinners "^1.0.0"
log-symbols "^1.0.2"
parsejson@0.0.3:
version "0.0.3"
resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab"
dependencies:
better-assert "~1.0.0"
parseqs@0.0.5:
version "0.0.5"
resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d"
dependencies:
better-assert "~1.0.0"
parseuri@0.0.5:
version "0.0.5"
resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a"
dependencies:
better-assert "~1.0.0"
path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
path-parse@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
pretty-bytes@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9"
process-nextick-args@~1.0.6:
version "1.0.7"
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
q@^1.4.1, q@^1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1"
readable-stream@^2.1.5:
version "2.3.3"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c"
dependencies:
core-util-is "~1.0.0"
inherits "~2.0.3"
isarray "~1.0.0"
process-nextick-args "~1.0.6"
safe-buffer "~5.1.1"
string_decoder "~1.0.3"
util-deprecate "~1.0.1"
rechoir@^0.6.2:
version "0.6.2"
resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
dependencies:
resolve "^1.1.6"
resolve@^1.1.6:
version "1.3.3"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5"
dependencies:
path-parse "^1.0.5"
restore-cursor@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
dependencies:
onetime "^2.0.0"
signal-exit "^3.0.2"
rxjs@^5.4.1:
version "5.4.2"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.4.2.tgz#2a3236fcbf03df57bae06fd6972fd99e5c08fcf7"
dependencies:
symbol-observable "^1.0.1"
safe-buffer@~5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7"
safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
semver@^5.3.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
shelljs@^0.7.8:
version "0.7.8"
resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3"
dependencies:
glob "^7.0.0"
interpret "^1.0.0"
rechoir "^0.6.2"
shortid@^2.2.8:
version "2.2.8"
resolved "https://registry.yarnpkg.com/shortid/-/shortid-2.2.8.tgz#033b117d6a2e975804f6f0969dbe7d3d0b355131"
signal-exit@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
smartchai@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/smartchai/-/smartchai-1.0.3.tgz#de6d010bb8b5aef24cb70b31a5f5334e8c41b72f"
dependencies:
"@types/chai" "^3.4.35"
"@types/chai-as-promised" "0.0.29"
"@types/chai-string" "^1.1.30"
chai "^3.5.0"
chai-as-promised "^6.0.0"
chai-string "^1.3.0"
smartdelay@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/smartdelay/-/smartdelay-1.0.3.tgz#5fd44dad77262d110702f0293efa80c072cfb579"
dependencies:
smartq "^1.1.1"
typings-global "^1.0.16"
smartenv@^2.0.0:
version "2.0.6"
resolved "https://registry.yarnpkg.com/smartenv/-/smartenv-2.0.6.tgz#b38c679b0c151b9af548f68c3a072c29d1417e8d"
dependencies:
lodash "^4.17.4"
smartq "^1.1.1"
typings-global "^1.0.14"
smartq@^1.1.1, smartq@^1.1.6:
version "1.1.6"
resolved "https://registry.yarnpkg.com/smartq/-/smartq-1.1.6.tgz#0c1ff4336d95e95b4f1fdd8ccd7e2c5a323b8412"
dependencies:
typings-global "^1.0.19"
util.promisify "^1.0.0"
smartshell@^1.0.6:
version "1.0.8"
resolved "https://registry.yarnpkg.com/smartshell/-/smartshell-1.0.8.tgz#1535756c0fe8069f7e6da1e3f9cb6c8f77094e42"
dependencies:
"@types/shelljs" "^0.7.2"
"@types/which" "^1.0.28"
shelljs "^0.7.8"
smartq "^1.1.1"
typings-global "^1.0.19"
which "^1.2.14"
socket.io-adapter@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.0.tgz#c7aa46501dd556c2cb8a28af8ff95c0b5e1daa4c"
dependencies:
debug "2.3.3"
socket.io-client@^2.0.3, socket.io-client@~2.0.2:
version "2.0.3"
resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.0.3.tgz#6caf4aff9f85b19fd91b6ce13d69adb564f8873b"
dependencies:
backo2 "1.0.2"
base64-arraybuffer "0.1.5"
component-bind "1.0.0"
component-emitter "1.2.1"
debug "~2.6.4"
engine.io-client "~3.1.0"
has-cors "1.1.0"
indexof "0.0.1"
object-component "0.0.3"
parseqs "0.0.5"
parseuri "0.0.5"
socket.io-parser "~3.1.1"
to-array "0.1.4"
socket.io-parser@~3.1.1:
version "3.1.2"
resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.1.2.tgz#dbc2282151fc4faebbe40aeedc0772eba619f7f2"
dependencies:
component-emitter "1.2.1"
debug "~2.6.4"
has-binary2 "~1.0.2"
isarray "2.0.1"
socket.io@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.0.3.tgz#4359f06a24933ae6bd087798af78c680eae345e3"
dependencies:
debug "~2.6.6"
engine.io "~3.1.0"
object-assign "~4.1.1"
socket.io-adapter "~1.1.0"
socket.io-client "~2.0.2"
socket.io-parser "~3.1.1"
string_decoder@~1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
dependencies:
safe-buffer "~5.1.0"
strip-ansi@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
dependencies:
ansi-regex "^2.0.0"
supports-color@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
symbol-observable@^1.0.1:
version "1.0.4"
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d"
tapbundle@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/tapbundle/-/tapbundle-1.1.0.tgz#e0547f683ae36260f639ecd7435df95f0af01683"
dependencies:
early "^2.1.1"
leakage "^0.3.0"
smartchai "^1.0.3"
smartdelay "^1.0.3"
smartq "^1.1.1"
typings-global "^1.0.19"
through2@^2.0.1:
version "2.0.3"
resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
dependencies:
readable-stream "^2.1.5"
xtend "~4.0.1"
to-array@0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890"
type-detect@0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822"
type-detect@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2"
typings-global@^1.0.14, typings-global@^1.0.16, typings-global@^1.0.19, typings-global@^1.0.6:
version "1.0.19"
resolved "https://registry.yarnpkg.com/typings-global/-/typings-global-1.0.19.tgz#3376a72d4de1e5541bf5702248ff64c3e6ea316c"
dependencies:
semver "^5.3.0"
smartshell "^1.0.6"
ultron@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.0.tgz#b07a2e6a541a815fc6a34ccd4533baec307ca864"
util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
util.promisify@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
dependencies:
define-properties "^1.1.2"
object.getownpropertydescriptors "^2.0.3"
uws@~0.14.4:
version "0.14.5"
resolved "https://registry.yarnpkg.com/uws/-/uws-0.14.5.tgz#67aaf33c46b2a587a5f6666d00f7691328f149dc"
which@^1.2.14:
version "1.2.14"
resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5"
dependencies:
isexe "^2.0.0"
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
ws@~2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/ws/-/ws-2.3.1.tgz#6b94b3e447cb6a363f785eaf94af6359e8e81c80"
dependencies:
safe-buffer "~5.0.1"
ultron "~1.1.0"
xmlhttprequest-ssl@1.5.3:
version "1.5.3"
resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d"
xtend@~4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
yeast@0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"