@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 ADDED
@@ -0,0 +1,11 @@
1
+ # `http`
2
+
3
+ > TODO: description
4
+
5
+ ## Usage
6
+
7
+ ```
8
+ const http = require('http');
9
+
10
+ // TODO: DEMONSTRATE API
11
+ ```
@@ -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"}
@@ -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"}
@@ -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"}