@spinajs/http-socket 2.0.314
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -0
- package/lib/cjs/index.d.ts +18 -0
- package/lib/cjs/index.d.ts.map +1 -0
- package/lib/cjs/index.js +62 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/cjs/interfaces.d.ts +131 -0
- package/lib/cjs/interfaces.d.ts.map +1 -0
- package/lib/cjs/interfaces.js +202 -0
- package/lib/cjs/interfaces.js.map +1 -0
- package/lib/cjs/middlewares.d.ts +11 -0
- package/lib/cjs/middlewares.d.ts.map +1 -0
- package/lib/cjs/middlewares.js +37 -0
- package/lib/cjs/middlewares.js.map +1 -0
- package/lib/cjs/package.json +1 -0
- package/lib/mjs/index.d.ts +18 -0
- package/lib/mjs/index.d.ts.map +1 -0
- package/lib/mjs/index.js +58 -0
- package/lib/mjs/index.js.map +1 -0
- package/lib/mjs/interfaces.d.ts +131 -0
- package/lib/mjs/interfaces.d.ts.map +1 -0
- package/lib/mjs/interfaces.js +192 -0
- package/lib/mjs/interfaces.js.map +1 -0
- package/lib/mjs/middlewares.d.ts +11 -0
- package/lib/mjs/middlewares.d.ts.map +1 -0
- package/lib/mjs/middlewares.js +34 -0
- package/lib/mjs/middlewares.js.map +1 -0
- package/lib/mjs/package.json +1 -0
- package/lib/tsconfig.cjs.tsbuildinfo +1 -0
- package/lib/tsconfig.mjs.tsbuildinfo +1 -0
- package/package.json +69 -0
package/README.md
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { HttpServer } from '@spinajs/http';
|
|
2
|
+
import { AsyncService } from '@spinajs/di';
|
|
3
|
+
import { Log } from '@spinajs/log-common';
|
|
4
|
+
import { Server } from 'socket.io';
|
|
5
|
+
import { SocketController, SocketServerMiddleware } from './interfaces.js';
|
|
6
|
+
import './middlewares.js';
|
|
7
|
+
export declare class WebsocketServer extends AsyncService {
|
|
8
|
+
/**
|
|
9
|
+
* Logger for this module
|
|
10
|
+
*/
|
|
11
|
+
protected Log: Log;
|
|
12
|
+
protected HttpServer: HttpServer;
|
|
13
|
+
protected Server: Server;
|
|
14
|
+
protected Middlewares: SocketServerMiddleware[];
|
|
15
|
+
protected Controllers: SocketController[];
|
|
16
|
+
resolve(): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAc,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,GAAG,EAAU,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAE3E,OAAO,kBAAkB,CAAC;AAE1B,qBAAa,eAAgB,SAAQ,YAAY;IAC/C;;OAEG;IAEH,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAGnB,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC;IAEjC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IAGzB,SAAS,CAAC,WAAW,EAAE,sBAAsB,EAAE,CAAC;IAGhD,SAAS,CAAC,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAE7B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CA6BtC"}
|
package/lib/cjs/index.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.WebsocketServer = void 0;
|
|
13
|
+
const http_1 = require("@spinajs/http");
|
|
14
|
+
const di_1 = require("@spinajs/di");
|
|
15
|
+
const log_common_1 = require("@spinajs/log-common");
|
|
16
|
+
const socket_io_1 = require("socket.io");
|
|
17
|
+
const interfaces_js_1 = require("./interfaces.js");
|
|
18
|
+
require("./middlewares.js");
|
|
19
|
+
class WebsocketServer extends di_1.AsyncService {
|
|
20
|
+
async resolve() {
|
|
21
|
+
this.Server = new socket_io_1.Server(this.HttpServer.Server);
|
|
22
|
+
this.Middlewares.sort((a, b) => {
|
|
23
|
+
return a.Order < b.Order ? -1 : a.Order > b.Order ? 1 : 0;
|
|
24
|
+
});
|
|
25
|
+
this.Middlewares.forEach((m) => {
|
|
26
|
+
this.Server.use((socket, next) => {
|
|
27
|
+
m.before(socket)
|
|
28
|
+
.then(() => next())
|
|
29
|
+
.catch((err) => next(err));
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
this.Server.on('connection', async (socket) => {
|
|
33
|
+
for (const m of this.Middlewares) {
|
|
34
|
+
await m.onConnect(socket);
|
|
35
|
+
socket.on('disconnet', async (reason) => {
|
|
36
|
+
await m.onDisconnect(socket, reason);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
for (const c of this.Controllers) {
|
|
40
|
+
await c.attach(socket);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.WebsocketServer = WebsocketServer;
|
|
46
|
+
__decorate([
|
|
47
|
+
(0, log_common_1.Logger)('websocket'),
|
|
48
|
+
__metadata("design:type", log_common_1.Log)
|
|
49
|
+
], WebsocketServer.prototype, "Log", void 0);
|
|
50
|
+
__decorate([
|
|
51
|
+
(0, di_1.Autoinject)(),
|
|
52
|
+
__metadata("design:type", http_1.HttpServer)
|
|
53
|
+
], WebsocketServer.prototype, "HttpServer", void 0);
|
|
54
|
+
__decorate([
|
|
55
|
+
(0, di_1.Autoinject)(interfaces_js_1.SocketServerMiddleware),
|
|
56
|
+
__metadata("design:type", Array)
|
|
57
|
+
], WebsocketServer.prototype, "Middlewares", void 0);
|
|
58
|
+
__decorate([
|
|
59
|
+
(0, di_1.Autoinject)(interfaces_js_1.SocketController),
|
|
60
|
+
__metadata("design:type", Array)
|
|
61
|
+
], WebsocketServer.prototype, "Controllers", void 0);
|
|
62
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wCAA2C;AAC3C,oCAAuD;AACvD,oDAAkD;AAElD,yCAAmC;AACnC,mDAA2E;AAE3E,4BAA0B;AAE1B,MAAa,eAAgB,SAAQ,iBAAY;IAkBxC,KAAK,CAAC,OAAO;QAClB,IAAI,CAAC,MAAM,GAAG,IAAI,kBAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAEjD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC7B,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;gBAC/B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;qBACb,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;qBAClB,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAC5C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE;gBAChC,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBAE1B,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;oBACtC,MAAM,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACvC,CAAC,CAAC,CAAC;aACJ;YAED,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE;gBAChC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;aACxB;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AA/CD,0CA+CC;AA1CW;IADT,IAAA,mBAAM,EAAC,WAAW,CAAC;8BACL,gBAAG;4CAAC;AAGT;IADT,IAAA,eAAU,GAAE;8BACS,iBAAU;mDAAC;AAKvB;IADT,IAAA,eAAU,EAAC,sCAAsB,CAAC;;oDACa;AAGtC;IADT,IAAA,eAAU,EAAC,gCAAgB,CAAC;;oDACa"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { Socket } from 'socket.io';
|
|
2
|
+
import { Configuration } from '@spinajs/configuration';
|
|
3
|
+
import { AsyncService, Constructor, IContainer } from '@spinajs/di';
|
|
4
|
+
import { IRouteParameter, ParameterType } from '@spinajs/http';
|
|
5
|
+
import { Log } from '@spinajs/log-common';
|
|
6
|
+
import { DataValidator } from '@spinajs/validation';
|
|
7
|
+
/**
|
|
8
|
+
* Middleware used server - wide ( for all incoming socket connections )
|
|
9
|
+
*/
|
|
10
|
+
export declare abstract class SocketServerMiddleware extends AsyncService {
|
|
11
|
+
/**
|
|
12
|
+
* Execution order, ascending execution ( lower first )
|
|
13
|
+
*/
|
|
14
|
+
abstract get Order(): number;
|
|
15
|
+
/**
|
|
16
|
+
*
|
|
17
|
+
* Middleware func run for ALL sockets before message is proceeded
|
|
18
|
+
* Example for auth middleware or logging, etc.
|
|
19
|
+
*
|
|
20
|
+
* @param socket
|
|
21
|
+
* @param next
|
|
22
|
+
*/
|
|
23
|
+
abstract before(socket: Socket): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
*
|
|
26
|
+
* Executed on connection event
|
|
27
|
+
*
|
|
28
|
+
* @param socket
|
|
29
|
+
*/
|
|
30
|
+
abstract onConnect(socket: Socket): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
*
|
|
33
|
+
* Executed on disconnect event
|
|
34
|
+
*
|
|
35
|
+
* @param socket
|
|
36
|
+
*/
|
|
37
|
+
abstract onDisconnect(socket: Socket, reason: string): Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Middleware for specific socket
|
|
41
|
+
*/
|
|
42
|
+
export declare abstract class SocketMiddleware extends AsyncService {
|
|
43
|
+
/**
|
|
44
|
+
*
|
|
45
|
+
* Middleware func before message is proceeded for this socket
|
|
46
|
+
* Example for auth middleware
|
|
47
|
+
*
|
|
48
|
+
* @param socket
|
|
49
|
+
* @param next
|
|
50
|
+
*/
|
|
51
|
+
abstract execute(socket: Socket, event: string, args: any[]): Promise<void>;
|
|
52
|
+
}
|
|
53
|
+
export interface ISocketMiddlewareDescriptor {
|
|
54
|
+
Type: Constructor<SocketMiddleware>;
|
|
55
|
+
Options: any[];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Describes parameters passed to socket event
|
|
59
|
+
*/
|
|
60
|
+
export interface ISocketEventParameter extends IRouteParameter {
|
|
61
|
+
}
|
|
62
|
+
export interface ISocketEvent {
|
|
63
|
+
/**
|
|
64
|
+
* Event name
|
|
65
|
+
*/
|
|
66
|
+
Name: string;
|
|
67
|
+
Method: string;
|
|
68
|
+
Parameters: Map<number, ISocketEventParameter>;
|
|
69
|
+
Schema: any;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Descriptor for controller
|
|
73
|
+
*/
|
|
74
|
+
export interface ISocketControllerDescriptor {
|
|
75
|
+
/**
|
|
76
|
+
* Controller routes
|
|
77
|
+
*/
|
|
78
|
+
Events: Map<string | symbol, ISocketEvent>;
|
|
79
|
+
/**
|
|
80
|
+
* Controller - wise middlewares
|
|
81
|
+
*/
|
|
82
|
+
Middlewares: ISocketMiddlewareDescriptor[];
|
|
83
|
+
/**
|
|
84
|
+
* Sockets room ( optional ), if not set "/" is set ( main room )
|
|
85
|
+
*/
|
|
86
|
+
Room?: string;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Route action call spefici data. Used to pass data / arguments when parsing
|
|
90
|
+
* action parameters for specific call. Eg. to parse form data, and extract it
|
|
91
|
+
* as different arguments.
|
|
92
|
+
*/
|
|
93
|
+
export interface ISocketEventCall {
|
|
94
|
+
Payload: any;
|
|
95
|
+
}
|
|
96
|
+
export interface ISocketEventArgsResult {
|
|
97
|
+
CallData: ISocketEventCall;
|
|
98
|
+
Args: any;
|
|
99
|
+
}
|
|
100
|
+
export interface ISocketRouteArgs {
|
|
101
|
+
SupportedType: ParameterType | string;
|
|
102
|
+
extract(callData: ISocketEventCall, routeParameter: IRouteParameter, incomingArgs: any[], socket: Socket): Promise<ISocketEventArgsResult>;
|
|
103
|
+
}
|
|
104
|
+
export declare abstract class SocketRouteArgs implements ISocketRouteArgs {
|
|
105
|
+
protected Validator: DataValidator;
|
|
106
|
+
abstract get SupportedType(): ParameterType | string;
|
|
107
|
+
abstract extract(callData: ISocketEventCall, routeParameter: IRouteParameter, incomingArgs: any[], socket: Socket): Promise<ISocketEventArgsResult>;
|
|
108
|
+
protected tryHydrateParam(arg: any, routeParameter: IRouteParameter, event: ISocketEvent): Promise<any>;
|
|
109
|
+
protected tryHydrateObject(arg: any, route: IRouteParameter, hydrator: any): Promise<any>;
|
|
110
|
+
protected getHydrator(param: IRouteParameter): any;
|
|
111
|
+
protected tryExtractObject(arg: any, param: IRouteParameter): any;
|
|
112
|
+
protected isRuntimeType(param: IRouteParameter): boolean;
|
|
113
|
+
protected fromRuntimeType(param: IRouteParameter, arg: any): any;
|
|
114
|
+
}
|
|
115
|
+
export declare abstract class SocketController extends AsyncService {
|
|
116
|
+
/**
|
|
117
|
+
* Event method getter
|
|
118
|
+
*/
|
|
119
|
+
[action: string]: any;
|
|
120
|
+
/**
|
|
121
|
+
* Controller descriptor
|
|
122
|
+
*/
|
|
123
|
+
get Descriptor(): ISocketControllerDescriptor;
|
|
124
|
+
protected _container: IContainer;
|
|
125
|
+
protected _log: Log;
|
|
126
|
+
protected _cfg: Configuration;
|
|
127
|
+
protected _middlewares: SocketMiddleware[];
|
|
128
|
+
resolve(): Promise<void>;
|
|
129
|
+
attach(socket: Socket): Promise<void>;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=interfaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.SocketController = exports.SocketRouteArgs = exports.SocketMiddleware = exports.SocketServerMiddleware = void 0;
|
|
16
|
+
const util_1 = require("@spinajs/util");
|
|
17
|
+
const configuration_1 = require("@spinajs/configuration");
|
|
18
|
+
const di_1 = require("@spinajs/di");
|
|
19
|
+
const http_1 = require("@spinajs/http");
|
|
20
|
+
const log_common_1 = require("@spinajs/log-common");
|
|
21
|
+
const validation_1 = require("@spinajs/validation");
|
|
22
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
23
|
+
const exceptions_1 = require("@spinajs/exceptions");
|
|
24
|
+
/**
|
|
25
|
+
* Middleware used server - wide ( for all incoming socket connections )
|
|
26
|
+
*/
|
|
27
|
+
class SocketServerMiddleware extends di_1.AsyncService {
|
|
28
|
+
}
|
|
29
|
+
exports.SocketServerMiddleware = SocketServerMiddleware;
|
|
30
|
+
/**
|
|
31
|
+
* Middleware for specific socket
|
|
32
|
+
*/
|
|
33
|
+
class SocketMiddleware extends di_1.AsyncService {
|
|
34
|
+
}
|
|
35
|
+
exports.SocketMiddleware = SocketMiddleware;
|
|
36
|
+
class SocketRouteArgs {
|
|
37
|
+
async tryHydrateParam(arg, routeParameter, event) {
|
|
38
|
+
let result = null;
|
|
39
|
+
let schema = null;
|
|
40
|
+
let hydrator = null;
|
|
41
|
+
// first validate route parameter / body params etc
|
|
42
|
+
if (event.Schema && event.Schema[routeParameter.Name]) {
|
|
43
|
+
schema = event.Schema[routeParameter.Name];
|
|
44
|
+
}
|
|
45
|
+
else if (routeParameter.Schema) {
|
|
46
|
+
schema = routeParameter.Schema;
|
|
47
|
+
}
|
|
48
|
+
else if (routeParameter.RouteParamSchema) {
|
|
49
|
+
schema = routeParameter.RouteParamSchema;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
schema = this.Validator.extractSchema(routeParameter.RuntimeType);
|
|
53
|
+
}
|
|
54
|
+
if (this.isRuntimeType(routeParameter)) {
|
|
55
|
+
result = this.fromRuntimeType(routeParameter, arg);
|
|
56
|
+
if (schema) {
|
|
57
|
+
this.Validator.validate(schema, result);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
hydrator = this.getHydrator(routeParameter);
|
|
62
|
+
result = hydrator ? arg : this.tryExtractObject(arg, routeParameter);
|
|
63
|
+
if (schema) {
|
|
64
|
+
this.Validator.validate(schema, result);
|
|
65
|
+
}
|
|
66
|
+
if (hydrator) {
|
|
67
|
+
result = await this.tryHydrateObject(result, routeParameter, hydrator);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
async tryHydrateObject(arg, route, hydrator) {
|
|
73
|
+
const hInstance = await di_1.DI.resolve(hydrator.hydrator, hydrator.options);
|
|
74
|
+
return await hInstance.hydrate(arg, route);
|
|
75
|
+
}
|
|
76
|
+
getHydrator(param) {
|
|
77
|
+
let hydrator = null;
|
|
78
|
+
if (param.RuntimeType instanceof di_1.TypedArray) {
|
|
79
|
+
hydrator = Reflect.getMetadata('custom:arg_hydrator', param.RuntimeType.Type);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
hydrator = Reflect.getMetadata('custom:arg_hydrator', param.RuntimeType);
|
|
83
|
+
}
|
|
84
|
+
return hydrator;
|
|
85
|
+
}
|
|
86
|
+
tryExtractObject(arg, param) {
|
|
87
|
+
if ((0, di_1.isClass)(param.RuntimeType)) {
|
|
88
|
+
return new param.RuntimeType(lodash_1.default.isString(arg) ? JSON.parse(arg) : arg);
|
|
89
|
+
}
|
|
90
|
+
else if (param.RuntimeType instanceof di_1.TypedArray) {
|
|
91
|
+
const type = param.RuntimeType.Type;
|
|
92
|
+
const arrData = lodash_1.default.isString(arg) ? JSON.parse(arg) : arg;
|
|
93
|
+
return arrData ? arrData.map((x) => new type(x)) : [];
|
|
94
|
+
}
|
|
95
|
+
else if (param.RuntimeType.name === 'Object' || param.RuntimeType.name === 'Array') {
|
|
96
|
+
return lodash_1.default.isString(arg) ? JSON.parse(arg) : arg;
|
|
97
|
+
}
|
|
98
|
+
return arg;
|
|
99
|
+
}
|
|
100
|
+
isRuntimeType(param) {
|
|
101
|
+
return ['String', 'Number', 'BigInt', 'Boolean', 'Undefined', 'Null'].indexOf(param.RuntimeType.name) !== -1;
|
|
102
|
+
}
|
|
103
|
+
fromRuntimeType(param, arg) {
|
|
104
|
+
switch (param.RuntimeType.name) {
|
|
105
|
+
// query params are always sent as strings, even numbers,
|
|
106
|
+
// we must try to parse them as integers / booleans / objects
|
|
107
|
+
case 'String':
|
|
108
|
+
return arg;
|
|
109
|
+
case 'Number':
|
|
110
|
+
return arg ? Number(arg) : undefined;
|
|
111
|
+
case 'BigInt':
|
|
112
|
+
return BigInt(arg);
|
|
113
|
+
case 'Boolean':
|
|
114
|
+
return arg ? (arg === 1 ? true : arg.toLowerCase() === 'true' ? true : false) : false;
|
|
115
|
+
case 'Undefined':
|
|
116
|
+
return undefined;
|
|
117
|
+
case 'Null':
|
|
118
|
+
return null;
|
|
119
|
+
default:
|
|
120
|
+
return new param.RuntimeType(lodash_1.default.isString(arg) ? JSON.parse(arg) : arg);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
exports.SocketRouteArgs = SocketRouteArgs;
|
|
125
|
+
__decorate([
|
|
126
|
+
(0, di_1.Autoinject)(),
|
|
127
|
+
__metadata("design:type", validation_1.DataValidator)
|
|
128
|
+
], SocketRouteArgs.prototype, "Validator", void 0);
|
|
129
|
+
class SocketController extends di_1.AsyncService {
|
|
130
|
+
/**
|
|
131
|
+
* Controller descriptor
|
|
132
|
+
*/
|
|
133
|
+
get Descriptor() {
|
|
134
|
+
return Reflect.getMetadata(http_1.CONTROLLED_DESCRIPTOR_SYMBOL, this);
|
|
135
|
+
}
|
|
136
|
+
async resolve() {
|
|
137
|
+
if (!this.Descriptor) {
|
|
138
|
+
this._log.warn(`Socket controller ${this.constructor.name} does not have descriptor. If its abstract or base class ignore this message.`);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
async attach(socket) {
|
|
143
|
+
const self = this;
|
|
144
|
+
if (this.Descriptor.Room) {
|
|
145
|
+
socket.join(this.Descriptor.Room);
|
|
146
|
+
}
|
|
147
|
+
this._middlewares.forEach((m) => {
|
|
148
|
+
socket.use(([event, ...args], next) => {
|
|
149
|
+
m.execute(socket, event, args)
|
|
150
|
+
.catch((err) => {
|
|
151
|
+
next(err);
|
|
152
|
+
})
|
|
153
|
+
.then(() => {
|
|
154
|
+
next();
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
for (const [, event] of this.Descriptor.Events) {
|
|
159
|
+
socket.on(event.Name, async (...args) => {
|
|
160
|
+
const a = await _extractEventArgs(event, args);
|
|
161
|
+
await this[event.Method].call(this, ...a);
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
async function _extractEventArgs(route, incomingArgs) {
|
|
165
|
+
const callArgs = new Array(route.Parameters.size);
|
|
166
|
+
const argsCache = new Map();
|
|
167
|
+
let callData = {
|
|
168
|
+
Payload: {},
|
|
169
|
+
};
|
|
170
|
+
for (const [, param] of route.Parameters) {
|
|
171
|
+
const routeArgsHandler = await (0, util_1.tryGetHash)(argsCache, param.Type, () => di_1.DI.resolve(param.Type));
|
|
172
|
+
if (!routeArgsHandler) {
|
|
173
|
+
throw new exceptions_1.UnexpectedServerError(`invalid route parameter type for param: ${param.Name},
|
|
174
|
+
method: ${route.Name},
|
|
175
|
+
controller: ${self.constructor.name}`);
|
|
176
|
+
}
|
|
177
|
+
const { Args, CallData } = await routeArgsHandler.extract(callData, param, incomingArgs, socket);
|
|
178
|
+
callData = CallData;
|
|
179
|
+
callArgs[param.Index] = Args;
|
|
180
|
+
}
|
|
181
|
+
return callArgs;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
exports.SocketController = SocketController;
|
|
186
|
+
__decorate([
|
|
187
|
+
(0, di_1.Autoinject)(di_1.Container),
|
|
188
|
+
__metadata("design:type", Object)
|
|
189
|
+
], SocketController.prototype, "_container", void 0);
|
|
190
|
+
__decorate([
|
|
191
|
+
(0, log_common_1.Logger)('http'),
|
|
192
|
+
__metadata("design:type", log_common_1.Log)
|
|
193
|
+
], SocketController.prototype, "_log", void 0);
|
|
194
|
+
__decorate([
|
|
195
|
+
(0, di_1.Autoinject)(configuration_1.Configuration),
|
|
196
|
+
__metadata("design:type", configuration_1.Configuration)
|
|
197
|
+
], SocketController.prototype, "_cfg", void 0);
|
|
198
|
+
__decorate([
|
|
199
|
+
(0, di_1.Autoinject)(SocketMiddleware),
|
|
200
|
+
__metadata("design:type", Array)
|
|
201
|
+
], SocketController.prototype, "_middlewares", void 0);
|
|
202
|
+
//# sourceMappingURL=interfaces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Log } from '@spinajs/log-common';
|
|
2
|
+
import { SocketServerMiddleware } from './interfaces.js';
|
|
3
|
+
import { Socket } from 'socket.io';
|
|
4
|
+
export declare class ConnectionLogMiddleware extends SocketServerMiddleware {
|
|
5
|
+
get Order(): number;
|
|
6
|
+
protected Log: Log;
|
|
7
|
+
before(_socket: Socket): Promise<void>;
|
|
8
|
+
onConnect(socket: Socket): Promise<void>;
|
|
9
|
+
onDisconnect(socket: Socket, reason: string): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=middlewares.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middlewares.d.ts","sourceRoot":"","sources":["../../src/middlewares.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAU,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGnC,qBACa,uBAAwB,SAAQ,sBAAsB;IAEjE,IAAW,KAAK,WAEf;IAGD,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAEN,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IACtC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAGxC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGzE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ConnectionLogMiddleware = void 0;
|
|
13
|
+
const log_common_1 = require("@spinajs/log-common");
|
|
14
|
+
const interfaces_js_1 = require("./interfaces.js");
|
|
15
|
+
const di_1 = require("@spinajs/di");
|
|
16
|
+
let ConnectionLogMiddleware = class ConnectionLogMiddleware extends interfaces_js_1.SocketServerMiddleware {
|
|
17
|
+
// always first
|
|
18
|
+
get Order() {
|
|
19
|
+
return 0;
|
|
20
|
+
}
|
|
21
|
+
async before(_socket) { }
|
|
22
|
+
async onConnect(socket) {
|
|
23
|
+
this.Log.trace(`Connected to new websocket, id: ${socket.id}, handshake: ${JSON.stringify(socket.handshake)}`);
|
|
24
|
+
}
|
|
25
|
+
async onDisconnect(socket, reason) {
|
|
26
|
+
this.Log.trace(`Disconnected socket, reason: ${reason}, id: ${socket.id}`);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
exports.ConnectionLogMiddleware = ConnectionLogMiddleware;
|
|
30
|
+
__decorate([
|
|
31
|
+
(0, log_common_1.Logger)('web-socket'),
|
|
32
|
+
__metadata("design:type", log_common_1.Log)
|
|
33
|
+
], ConnectionLogMiddleware.prototype, "Log", void 0);
|
|
34
|
+
exports.ConnectionLogMiddleware = ConnectionLogMiddleware = __decorate([
|
|
35
|
+
(0, di_1.Injectable)(interfaces_js_1.SocketServerMiddleware)
|
|
36
|
+
], ConnectionLogMiddleware);
|
|
37
|
+
//# sourceMappingURL=middlewares.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middlewares.js","sourceRoot":"","sources":["../../src/middlewares.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAAkD;AAClD,mDAAyD;AAEzD,oCAAyC;AAGlC,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,sCAAsB;IACjE,eAAe;IACf,IAAW,KAAK;QACd,OAAO,CAAC,CAAC;IACX,CAAC;IAKM,KAAK,CAAC,MAAM,CAAC,OAAe,IAAkB,CAAC;IAC/C,KAAK,CAAC,SAAS,CAAC,MAAc;QACnC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mCAAmC,MAAM,CAAC,EAAE,gBAAgB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACjH,CAAC;IACM,KAAK,CAAC,YAAY,CAAC,MAAc,EAAE,MAAc;QACtD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,gCAAgC,MAAM,SAAS,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7E,CAAC;CACF,CAAA;AAhBY,0DAAuB;AAOxB;IADT,IAAA,mBAAM,EAAC,YAAY,CAAC;8BACN,gBAAG;oDAAC;kCAPR,uBAAuB;IADnC,IAAA,eAAU,EAAC,sCAAsB,CAAC;GACtB,uBAAuB,CAgBnC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"commonjs"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { HttpServer } from '@spinajs/http';
|
|
2
|
+
import { AsyncService } from '@spinajs/di';
|
|
3
|
+
import { Log } from '@spinajs/log-common';
|
|
4
|
+
import { Server } from 'socket.io';
|
|
5
|
+
import { SocketController, SocketServerMiddleware } from './interfaces.js';
|
|
6
|
+
import './middlewares.js';
|
|
7
|
+
export declare class WebsocketServer extends AsyncService {
|
|
8
|
+
/**
|
|
9
|
+
* Logger for this module
|
|
10
|
+
*/
|
|
11
|
+
protected Log: Log;
|
|
12
|
+
protected HttpServer: HttpServer;
|
|
13
|
+
protected Server: Server;
|
|
14
|
+
protected Middlewares: SocketServerMiddleware[];
|
|
15
|
+
protected Controllers: SocketController[];
|
|
16
|
+
resolve(): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAc,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,GAAG,EAAU,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAE3E,OAAO,kBAAkB,CAAC;AAE1B,qBAAa,eAAgB,SAAQ,YAAY;IAC/C;;OAEG;IAEH,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAGnB,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC;IAEjC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IAGzB,SAAS,CAAC,WAAW,EAAE,sBAAsB,EAAE,CAAC;IAGhD,SAAS,CAAC,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAE7B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CA6BtC"}
|
package/lib/mjs/index.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { HttpServer } from '@spinajs/http';
|
|
11
|
+
import { AsyncService, Autoinject } from '@spinajs/di';
|
|
12
|
+
import { Log, Logger } from '@spinajs/log-common';
|
|
13
|
+
import { Server } from 'socket.io';
|
|
14
|
+
import { SocketController, SocketServerMiddleware } from './interfaces.js';
|
|
15
|
+
import './middlewares.js';
|
|
16
|
+
export class WebsocketServer extends AsyncService {
|
|
17
|
+
async resolve() {
|
|
18
|
+
this.Server = new Server(this.HttpServer.Server);
|
|
19
|
+
this.Middlewares.sort((a, b) => {
|
|
20
|
+
return a.Order < b.Order ? -1 : a.Order > b.Order ? 1 : 0;
|
|
21
|
+
});
|
|
22
|
+
this.Middlewares.forEach((m) => {
|
|
23
|
+
this.Server.use((socket, next) => {
|
|
24
|
+
m.before(socket)
|
|
25
|
+
.then(() => next())
|
|
26
|
+
.catch((err) => next(err));
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
this.Server.on('connection', async (socket) => {
|
|
30
|
+
for (const m of this.Middlewares) {
|
|
31
|
+
await m.onConnect(socket);
|
|
32
|
+
socket.on('disconnet', async (reason) => {
|
|
33
|
+
await m.onDisconnect(socket, reason);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
for (const c of this.Controllers) {
|
|
37
|
+
await c.attach(socket);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
__decorate([
|
|
43
|
+
Logger('websocket'),
|
|
44
|
+
__metadata("design:type", Log)
|
|
45
|
+
], WebsocketServer.prototype, "Log", void 0);
|
|
46
|
+
__decorate([
|
|
47
|
+
Autoinject(),
|
|
48
|
+
__metadata("design:type", HttpServer)
|
|
49
|
+
], WebsocketServer.prototype, "HttpServer", void 0);
|
|
50
|
+
__decorate([
|
|
51
|
+
Autoinject(SocketServerMiddleware),
|
|
52
|
+
__metadata("design:type", Array)
|
|
53
|
+
], WebsocketServer.prototype, "Middlewares", void 0);
|
|
54
|
+
__decorate([
|
|
55
|
+
Autoinject(SocketController),
|
|
56
|
+
__metadata("design:type", Array)
|
|
57
|
+
], WebsocketServer.prototype, "Controllers", void 0);
|
|
58
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAE3E,OAAO,kBAAkB,CAAC;AAE1B,MAAM,OAAO,eAAgB,SAAQ,YAAY;IAkBxC,KAAK,CAAC,OAAO;QAClB,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAEjD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC7B,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;gBAC/B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;qBACb,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;qBAClB,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAC5C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE;gBAChC,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBAE1B,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;oBACtC,MAAM,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACvC,CAAC,CAAC,CAAC;aACJ;YAED,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE;gBAChC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;aACxB;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AA1CW;IADT,MAAM,CAAC,WAAW,CAAC;8BACL,GAAG;4CAAC;AAGT;IADT,UAAU,EAAE;8BACS,UAAU;mDAAC;AAKvB;IADT,UAAU,CAAC,sBAAsB,CAAC;;oDACa;AAGtC;IADT,UAAU,CAAC,gBAAgB,CAAC;;oDACa"}
|