socket-controllers
Advanced tools
Comparing version 0.0.4 to 0.0.5-beta
@@ -7,3 +7,3 @@ import { ClassTransformOptions } from "class-transformer"; | ||
*/ | ||
export declare function SocketController(namespace?: string): (object: Function) => void; | ||
export declare function SocketController(namespace?: string | RegExp): (object: Function) => void; | ||
/** | ||
@@ -48,2 +48,10 @@ * Registers controller's action to be executed when socket receives message with given name. | ||
/** | ||
* Injects parameters of the connected socket namespace. | ||
*/ | ||
export declare function NspParams(): (object: Object, methodName: string, index: number) => void; | ||
/** | ||
* Injects named param from the connected socket namespace. | ||
*/ | ||
export declare function NspParam(name: string): (object: Object, methodName: string, index: number) => void; | ||
/** | ||
* Injects rooms of the connected socket client. | ||
@@ -50,0 +58,0 @@ */ |
@@ -170,2 +170,37 @@ "use strict"; | ||
/** | ||
* Injects parameters of the connected socket namespace. | ||
*/ | ||
function NspParams() { | ||
return function (object, methodName, index) { | ||
var format = Reflect.getMetadata("design:paramtypes", object, methodName)[index]; | ||
var metadata = { | ||
target: object.constructor, | ||
method: methodName, | ||
index: index, | ||
type: ParamTypes_1.ParamTypes.NAMESPACE_PARAMS, | ||
reflectedType: format | ||
}; | ||
index_1.defaultMetadataArgsStorage().params.push(metadata); | ||
}; | ||
} | ||
exports.NspParams = NspParams; | ||
/** | ||
* Injects named param from the connected socket namespace. | ||
*/ | ||
function NspParam(name) { | ||
return function (object, methodName, index) { | ||
var format = Reflect.getMetadata("design:paramtypes", object, methodName)[index]; | ||
var metadata = { | ||
target: object.constructor, | ||
method: methodName, | ||
index: index, | ||
type: ParamTypes_1.ParamTypes.NAMESPACE_PARAM, | ||
reflectedType: format, | ||
value: name | ||
}; | ||
index_1.defaultMetadataArgsStorage().params.push(metadata); | ||
}; | ||
} | ||
exports.NspParam = NspParam; | ||
/** | ||
* Injects rooms of the connected socket client. | ||
@@ -172,0 +207,0 @@ */ |
15
index.js
@@ -35,6 +35,13 @@ "use strict"; | ||
// second import all controllers and middlewares and error handlers | ||
var controllerClasses; | ||
if (options && options.controllers && options.controllers.length) | ||
DirectoryExportedClassesLoader_1.importClassesFromDirectories(options.controllers); | ||
if (options && options.middlewares && options.middlewares.length) | ||
DirectoryExportedClassesLoader_1.importClassesFromDirectories(options.middlewares); | ||
controllerClasses = options.controllers.filter(function (controller) { return controller instanceof Function; }); | ||
var controllerDirs = options.controllers.filter(function (controller) { return typeof controller === "string"; }); | ||
controllerClasses.push.apply(controllerClasses, DirectoryExportedClassesLoader_1.importClassesFromDirectories(controllerDirs)); | ||
var middlewareClasses; | ||
if (options && options.middlewares && options.middlewares.length) { | ||
middlewareClasses = options.middlewares.filter(function (controller) { return controller instanceof Function; }); | ||
var middlewareDirs = options.middlewares.filter(function (controller) { return typeof controller === "string"; }); | ||
middlewareClasses.push.apply(middlewareClasses, DirectoryExportedClassesLoader_1.importClassesFromDirectories(middlewareDirs)); | ||
} | ||
if (options.useClassTransformer !== undefined) { | ||
@@ -49,3 +56,3 @@ executor.useClassTransformer = options.useClassTransformer; | ||
// run socket controller register and other operations | ||
executor.execute(); | ||
executor.execute(controllerClasses, middlewareClasses); | ||
} | ||
@@ -52,0 +59,0 @@ // ------------------------------------------------------------------------- |
@@ -12,3 +12,3 @@ /** | ||
*/ | ||
namespace?: string; | ||
namespace?: string | RegExp; | ||
} |
@@ -15,5 +15,5 @@ import { ActionMetadata } from "./ActionMetadata"; | ||
*/ | ||
namespace: string; | ||
namespace: string | RegExp; | ||
constructor(args: SocketControllerMetadataArgs); | ||
readonly instance: any; | ||
} |
/** | ||
* Controller action's parameter type. | ||
*/ | ||
export declare type ParamType = "custom" | "connected_socket" | "socket_body" | "socket_query_param" | "socket_io" | "socket_id" | "socket_request" | "socket_rooms"; | ||
export declare type ParamType = "custom" | "connected-socket" | "socket-body" | "socket-query-param" | "socket-io" | "socket-id" | "socket-request" | "socket-rooms" | "namespace-params" | "namespace-param"; | ||
/** | ||
@@ -13,6 +13,8 @@ * Controller action's parameter type. | ||
static SOCKET_QUERY_PARAM: ParamType; | ||
static SOCKET_IO: string; | ||
static SOCKET_ID: string; | ||
static SOCKET_REQUEST: string; | ||
static SOCKET_ROOMS: string; | ||
static SOCKET_IO: ParamType; | ||
static SOCKET_ID: ParamType; | ||
static SOCKET_REQUEST: ParamType; | ||
static SOCKET_ROOMS: ParamType; | ||
static NAMESPACE_PARAMS: ParamType; | ||
static NAMESPACE_PARAM: ParamType; | ||
} |
@@ -10,9 +10,11 @@ "use strict"; | ||
ParamTypes.CUSTOM = "custom"; | ||
ParamTypes.CONNECTED_SOCKET = "connected_socket"; | ||
ParamTypes.SOCKET_BODY = "socket_body"; | ||
ParamTypes.SOCKET_QUERY_PARAM = "socket_query_param"; | ||
ParamTypes.SOCKET_IO = "socket_io"; | ||
ParamTypes.SOCKET_ID = "socket_id"; | ||
ParamTypes.SOCKET_REQUEST = "socket_request"; | ||
ParamTypes.SOCKET_ROOMS = "socket_rooms"; | ||
ParamTypes.CONNECTED_SOCKET = "connected-socket"; | ||
ParamTypes.SOCKET_BODY = "socket-body"; | ||
ParamTypes.SOCKET_QUERY_PARAM = "socket-query-param"; | ||
ParamTypes.SOCKET_IO = "socket-io"; | ||
ParamTypes.SOCKET_ID = "socket-id"; | ||
ParamTypes.SOCKET_REQUEST = "socket-request"; | ||
ParamTypes.SOCKET_ROOMS = "socket-rooms"; | ||
ParamTypes.NAMESPACE_PARAMS = "namespace-params"; | ||
ParamTypes.NAMESPACE_PARAM = "namespace-param"; | ||
return ParamTypes; | ||
@@ -19,0 +21,0 @@ }()); |
/** | ||
* Action result handler type. | ||
*/ | ||
export declare type ResultType = "emit_on_success" | "emit_on_fail" | "skip_emit_on_empty_result"; | ||
export declare type ResultType = "emit-on-success" | "emit-on-fail" | "skip-emit-on-empty-result"; | ||
/** | ||
@@ -6,0 +6,0 @@ * Static access to result handler types. |
@@ -9,5 +9,5 @@ "use strict"; | ||
} | ||
ResultTypes.EMIT_ON_SUCCESS = "emit_on_success"; | ||
ResultTypes.EMIT_ON_FAIL = "emit_on_fail"; | ||
ResultTypes.SKIP_EMIT_ON_EMPTY_RESULT = "skip_emit_on_empty_result"; | ||
ResultTypes.EMIT_ON_SUCCESS = "emit-on-success"; | ||
ResultTypes.EMIT_ON_FAIL = "emit-on-fail"; | ||
ResultTypes.SKIP_EMIT_ON_EMPTY_RESULT = "skip-emit-on-empty-result"; | ||
return ResultTypes; | ||
@@ -14,0 +14,0 @@ }()); |
{ | ||
"name": "socket-controllers", | ||
"private": false, | ||
"version": "0.0.4", | ||
"version": "0.0.5-beta", | ||
"description": "Use class-based controllers to handle websocket events", | ||
@@ -9,3 +9,3 @@ "license": "MIT", | ||
"main": "index.js", | ||
"tags": [ | ||
"keywords": [ | ||
"websocket", | ||
@@ -16,3 +16,5 @@ "websockets", | ||
"typescript-websockets", | ||
"socket-controllers" | ||
"socket-controllers", | ||
"socket.io", | ||
"socket-server" | ||
], | ||
@@ -23,2 +25,8 @@ "author": { | ||
}, | ||
"contributors": [ | ||
{ | ||
"name": "Rustam Mamadaminov", | ||
"email": "rmamdaminov@gmail.com" | ||
} | ||
], | ||
"repository": { | ||
@@ -37,2 +45,3 @@ "type": "git", | ||
"class-transformer": "^0.1.6", | ||
"path-to-regexp": "^3.0.0", | ||
"reflect-metadata": "^0.1.10", | ||
@@ -39,0 +48,0 @@ "socket.io": "^2.0.1" |
@@ -65,8 +65,10 @@ # socket-controllers | ||
import {createSocketServer} from "socket-controllers"; | ||
import "./MessageController"; // we need to "load" our controller before call createSocketServer. this is required | ||
import {MessageController} from "./MessageController"; | ||
createSocketServer(3001); | ||
createSocketServer(3001, { | ||
controllers: [MessageController] | ||
}); | ||
``` | ||
3. Now you can send `save` websocket message using webosocket-client. | ||
3. Now you can send `save` websocket message using websocket-client. | ||
@@ -314,3 +316,3 @@ ## More usage examples | ||
import "reflect-metadata"; // this shim is required | ||
import {createSocketServer, loadControllers} from "socket-controllers"; | ||
import {createSocketServer} from "socket-controllers"; | ||
@@ -333,2 +335,11 @@ createSocketServer(3000, { | ||
Also you can use dynamic namespace, like `express router` patterns: | ||
```javascript | ||
@SocketController("/messages/:userId") | ||
export class MessageController { | ||
// ... | ||
} | ||
``` | ||
## Using middlewares | ||
@@ -356,3 +367,3 @@ | ||
Controllers and middlewares should be loaded globally, before app bootstrap: | ||
Controllers and middlewares should be loaded: | ||
@@ -362,5 +373,8 @@ ```javascript | ||
import {createSocketServer} from "socket-controllers"; | ||
import "./MessageController"; | ||
import "./MyMiddleware"; // here we load it | ||
let io = createSocketServer(3000); | ||
import {MessageController} from "./MessageController"; | ||
import {MyMiddleware} from "./MyMiddleware"; // here we import it | ||
let io = createSocketServer(3000, { | ||
controllers: [MessageController], | ||
middlewares: [MyMiddleware] | ||
}); | ||
``` | ||
@@ -372,6 +386,6 @@ | ||
import "reflect-metadata"; | ||
import {createSocketServer, loadControllers} from "socket-controllers"; | ||
import {createSocketServer} from "socket-controllers"; | ||
let io = createSocketServer(3000, { | ||
controllers: [__dirname + "/controllers/**/*.js"], | ||
middlewareDirs: [__dirname + "/middlewares/**/*.js"] | ||
middlewares: [__dirname + "/middlewares/**/*.js"] | ||
}); | ||
@@ -398,3 +412,3 @@ ``` | ||
controllers: [__dirname + "/controllers/*.js"], | ||
middlewareDirs: [__dirname + "/middlewares/*.js"] | ||
middlewares: [__dirname + "/middlewares/*.js"] | ||
}); | ||
@@ -421,3 +435,3 @@ ``` | ||
|-----------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | ||
| `@SocketController(namespace?: string)` | Registers a class to be a socket controller that can listen to websocket events and respond to them. | | ||
| `@SocketController(namespace?: string\|Regex)` | Registers a class to be a socket controller that can listen to websocket events and respond to them. | | ||
| `@OnMessage(messageName: string)` | Registers controller's action to be executed when socket receives message with given name. | | ||
@@ -433,2 +447,4 @@ | `@OnConnect()` | Registers controller's action to be executed when client connects to the socket. | | ||
| `@SocketRooms()` | Injects rooms of the connected socket client. | | ||
| `@NspParams()` | Injects dynamic namespace params. | | ||
| `@NspParam(paramName: string)` | Injects param from the dynamic namespace. | | ||
| `@Middleware()` | Registers a new middleware to be registered in the socket.io. | | ||
@@ -435,0 +451,0 @@ | `@EmitOnSuccess(messageName: string)` | If this decorator is set then after controller action will emit message with the given name after action execution. It will emit message only if controller succeed without errors. If result is a Promise then it will wait until promise is resolved and emit a message. | |
@@ -24,3 +24,3 @@ import { ClassTransformOptions } from "class-transformer"; | ||
constructor(io: any); | ||
execute(): void; | ||
execute(controllerClasses?: Function[], middlewareClasses?: Function[]): void; | ||
/** | ||
@@ -41,2 +41,3 @@ * Registers middlewares. | ||
private handleFailResult; | ||
private handleNamespaceParams; | ||
} |
@@ -8,2 +8,3 @@ "use strict"; | ||
var ParamTypes_1 = require("./metadata/types/ParamTypes"); | ||
var pathToRegexp = require("path-to-regexp"); | ||
/** | ||
@@ -23,5 +24,5 @@ * Registers controllers and actions in the given server framework. | ||
// ------------------------------------------------------------------------- | ||
SocketControllerExecutor.prototype.execute = function () { | ||
this.registerControllers(); | ||
this.registerMiddlewares(); | ||
SocketControllerExecutor.prototype.execute = function (controllerClasses, middlewareClasses) { | ||
this.registerControllers(controllerClasses); | ||
this.registerMiddlewares(middlewareClasses); | ||
}; | ||
@@ -58,3 +59,7 @@ // ------------------------------------------------------------------------- | ||
controllersWithNamespaces.forEach(function (controller) { | ||
_this.io.of(controller.namespace).on("connection", function (socket) { return _this.handleConnection([controller], socket); }); | ||
var namespace = controller.namespace; | ||
if (!(namespace instanceof RegExp)) { | ||
namespace = pathToRegexp(namespace); | ||
} | ||
_this.io.of(namespace).on("connection", function (socket) { return _this.handleConnection([controller], socket); }); | ||
}); | ||
@@ -113,2 +118,9 @@ return this; | ||
} | ||
else if (param.type === ParamTypes_1.ParamTypes.NAMESPACE_PARAMS) { | ||
return _this.handleNamespaceParams(options.socket, action, param); | ||
} | ||
else if (param.type === ParamTypes_1.ParamTypes.NAMESPACE_PARAM) { | ||
var params = _this.handleNamespaceParams(options.socket, action, param); | ||
return params[param.value]; | ||
} | ||
else { | ||
@@ -197,2 +209,13 @@ return _this.handleParam(param, options); | ||
}; | ||
SocketControllerExecutor.prototype.handleNamespaceParams = function (socket, action, param) { | ||
var _this = this; | ||
var keys = []; | ||
var regexp = pathToRegexp(action.controllerMetadata.namespace, keys); | ||
var parts = regexp.exec(socket.nsp.name); | ||
var params = []; | ||
keys.forEach(function (key, index) { | ||
params[key.name] = _this.handleParamFormat(parts[index + 1], param); | ||
}); | ||
return params; | ||
}; | ||
return SocketControllerExecutor; | ||
@@ -199,0 +222,0 @@ }()); |
@@ -9,7 +9,7 @@ import { ClassTransformOptions } from "class-transformer"; | ||
*/ | ||
controllers?: string[]; | ||
controllers?: Function[] | string[]; | ||
/** | ||
* List of directories from where to "require" all your middlewares. | ||
*/ | ||
middlewares?: string[]; | ||
middlewares?: Function[] | string[]; | ||
/** | ||
@@ -16,0 +16,0 @@ * Indicates if class-transformer package should be used to perform message body serialization / deserialization. |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
154338
1555
457
0
4
+ Addedpath-to-regexp@^3.0.0
+ Addedpath-to-regexp@3.2.0(transitive)