@venok/websocket 2.1.0-next.1
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/dist/constants.js +32 -0
- package/dist/decorators/gateway.decorator.js +40 -0
- package/dist/decorators/message-body.decorator.js +32 -0
- package/dist/decorators/server.decorator.js +27 -0
- package/dist/decorators/socket.decorator.js +23 -0
- package/dist/decorators/subscribe-message.decorator.js +23 -0
- package/dist/enums/ws-paramtype.js +27 -0
- package/dist/errors/ack-not-supported.exception.js +27 -0
- package/dist/errors/invalid-socket-port.exception.js +27 -0
- package/dist/exceptions/ws.exception.js +42 -0
- package/dist/filters/context.js +28 -0
- package/dist/filters/filter.js +72 -0
- package/dist/helpers/discovery.helper.js +51 -0
- package/dist/helpers/event-stream-factory.helper.js +31 -0
- package/dist/index.d.ts +200 -0
- package/dist/index.js +18 -0
- package/dist/interfaces/event-stream-host.interface.js +0 -0
- package/dist/interfaces/index.js +4 -0
- package/dist/interfaces/options.interface.js +0 -0
- package/dist/interfaces/websocket/gateway-handler-metadata.interfcae.js +0 -0
- package/dist/interfaces/websocket/gateway-metadata.interface.js +0 -0
- package/dist/interfaces/websocket/gateway-options.interface.js +0 -0
- package/dist/interfaces/websocket/index.js +4 -0
- package/dist/symbols.js +31 -0
- package/dist/websocket/adapter.js +31 -0
- package/dist/websocket/arguments-host.js +39 -0
- package/dist/websocket/config.js +43 -0
- package/dist/websocket/configurable-module.js +26 -0
- package/dist/websocket/container.js +42 -0
- package/dist/websocket/context.js +43 -0
- package/dist/websocket/explorer.js +118 -0
- package/dist/websocket/finder.js +57 -0
- package/dist/websocket/module.js +34 -0
- package/dist/websocket/params-factory.js +41 -0
- package/dist/websocket/starter-module.js +100 -0
- package/package.json +49 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
var __legacyDecorateClassTS = 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")
|
|
4
|
+
r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else
|
|
6
|
+
for (var i = decorators.length - 1;i >= 0; i--)
|
|
7
|
+
if (d = decorators[i])
|
|
8
|
+
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
9
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
10
|
+
};
|
|
11
|
+
var __legacyDecorateParamTS = (index, decorator) => (target, key) => decorator(target, key, index);
|
|
12
|
+
var __legacyMetadataTS = (k, v) => {
|
|
13
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
|
|
14
|
+
return Reflect.metadata(k, v);
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// packages/websocket/src/websocket/finder.ts
|
|
18
|
+
import { isUndefined } from "@venok/core";
|
|
19
|
+
import { MESSAGE_METADATA, PARAM_ARGS_METADATA } from "../constants.js";
|
|
20
|
+
import { WsParamtype } from "../enums/ws-paramtype.js";
|
|
21
|
+
|
|
22
|
+
class GatewayFinder {
|
|
23
|
+
metadataScanner;
|
|
24
|
+
constructor(metadataScanner) {
|
|
25
|
+
this.metadataScanner = metadataScanner;
|
|
26
|
+
}
|
|
27
|
+
getGatewayHandlers(instance, prototype) {
|
|
28
|
+
const instancePrototype = isUndefined(prototype) ? Object.getPrototypeOf(instance) : prototype;
|
|
29
|
+
return this.metadataScanner.getAllMethodNames(instancePrototype).reduce((acc, method) => {
|
|
30
|
+
const route = this.exploreMethod(instance, instancePrototype, method);
|
|
31
|
+
if (route)
|
|
32
|
+
acc.push(route);
|
|
33
|
+
return acc;
|
|
34
|
+
}, []);
|
|
35
|
+
}
|
|
36
|
+
exploreMethod(instance, prototype, methodName) {
|
|
37
|
+
const prototypeCallback = prototype[methodName];
|
|
38
|
+
const message = Reflect.getMetadata(MESSAGE_METADATA, prototypeCallback);
|
|
39
|
+
if (isUndefined(message))
|
|
40
|
+
return null;
|
|
41
|
+
const isAckHandledManually = this.hasAckDecorator(prototype, methodName);
|
|
42
|
+
return { pattern: message, methodName, isAckHandledManually };
|
|
43
|
+
}
|
|
44
|
+
hasAckDecorator(instancePrototype, methodName) {
|
|
45
|
+
const paramsMetadata = Reflect.getMetadata(PARAM_ARGS_METADATA, instancePrototype.constructor, methodName);
|
|
46
|
+
if (!paramsMetadata)
|
|
47
|
+
return false;
|
|
48
|
+
const metadataKeys = Object.keys(paramsMetadata);
|
|
49
|
+
return metadataKeys.some((key) => {
|
|
50
|
+
const type = +key.split(":")[0];
|
|
51
|
+
return type === WsParamtype.ACK;
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export {
|
|
56
|
+
GatewayFinder
|
|
57
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
var __legacyDecorateClassTS = 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")
|
|
4
|
+
r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else
|
|
6
|
+
for (var i = decorators.length - 1;i >= 0; i--)
|
|
7
|
+
if (d = decorators[i])
|
|
8
|
+
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
9
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
10
|
+
};
|
|
11
|
+
var __legacyDecorateParamTS = (index, decorator) => (target, key) => decorator(target, key, index);
|
|
12
|
+
var __legacyMetadataTS = (k, v) => {
|
|
13
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
|
|
14
|
+
return Reflect.metadata(k, v);
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// packages/websocket/src/websocket/module.ts
|
|
18
|
+
import { IntegrationModule } from "@venok/integration";
|
|
19
|
+
import { Module } from "@venok/core";
|
|
20
|
+
import { WebsocketConfig } from "../websocket/config.js";
|
|
21
|
+
import { WebsocketExplorerService } from "../websocket/explorer.js";
|
|
22
|
+
import { WebsocketStarterModule } from "../websocket/starter-module.js";
|
|
23
|
+
import { WebsocketConfigurableModuleClass } from "../websocket/configurable-module.js";
|
|
24
|
+
class WebsocketModule extends WebsocketConfigurableModuleClass {
|
|
25
|
+
}
|
|
26
|
+
WebsocketModule = __legacyDecorateClassTS([
|
|
27
|
+
Module({
|
|
28
|
+
imports: [IntegrationModule],
|
|
29
|
+
providers: [WebsocketConfig, WebsocketExplorerService, WebsocketStarterModule]
|
|
30
|
+
})
|
|
31
|
+
], WebsocketModule);
|
|
32
|
+
export {
|
|
33
|
+
WebsocketModule
|
|
34
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
var __legacyDecorateClassTS = 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")
|
|
4
|
+
r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else
|
|
6
|
+
for (var i = decorators.length - 1;i >= 0; i--)
|
|
7
|
+
if (d = decorators[i])
|
|
8
|
+
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
9
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
10
|
+
};
|
|
11
|
+
var __legacyDecorateParamTS = (index, decorator) => (target, key) => decorator(target, key, index);
|
|
12
|
+
var __legacyMetadataTS = (k, v) => {
|
|
13
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
|
|
14
|
+
return Reflect.metadata(k, v);
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// packages/websocket/src/websocket/params-factory.ts
|
|
18
|
+
import { isFunction } from "@venok/core";
|
|
19
|
+
import { WsParamtype } from "../enums/ws-paramtype.js";
|
|
20
|
+
|
|
21
|
+
class WsParamsFactory {
|
|
22
|
+
exchangeKeyForValue(type, data, args) {
|
|
23
|
+
if (!args)
|
|
24
|
+
return null;
|
|
25
|
+
switch (type) {
|
|
26
|
+
case WsParamtype.SOCKET:
|
|
27
|
+
return args[0];
|
|
28
|
+
case WsParamtype.PAYLOAD:
|
|
29
|
+
return data ? args[1]?.[data] : args[1];
|
|
30
|
+
case WsParamtype.ACK:
|
|
31
|
+
return args.find((arg) => isFunction(arg));
|
|
32
|
+
case WsParamtype.PATTERN:
|
|
33
|
+
return args[args.length - 1];
|
|
34
|
+
default:
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export {
|
|
40
|
+
WsParamsFactory
|
|
41
|
+
};
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
var __legacyDecorateClassTS = 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")
|
|
4
|
+
r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else
|
|
6
|
+
for (var i = decorators.length - 1;i >= 0; i--)
|
|
7
|
+
if (d = decorators[i])
|
|
8
|
+
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
9
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
10
|
+
};
|
|
11
|
+
var __legacyDecorateParamTS = (index, decorator) => (target, key) => decorator(target, key, index);
|
|
12
|
+
var __legacyMetadataTS = (k, v) => {
|
|
13
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
|
|
14
|
+
return Reflect.metadata(k, v);
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// packages/websocket/src/websocket/starter-module.ts
|
|
18
|
+
import { Inject, Injectable } from "@venok/core";
|
|
19
|
+
import { distinctUntilChanged, isObservable, mergeAll, of } from "rxjs";
|
|
20
|
+
import { fromPromise } from "rxjs/internal/observable/innerFrom";
|
|
21
|
+
import { WebsocketExplorerService } from "../websocket/explorer.js";
|
|
22
|
+
import { WebSocketGateway } from "../decorators/gateway.decorator.js";
|
|
23
|
+
import { WebsocketConfig } from "../websocket/config.js";
|
|
24
|
+
import { WEBSOCKET_APP_OPTIONS } from "../websocket/configurable-module.js";
|
|
25
|
+
import {
|
|
26
|
+
VENOK_WS_ADAPTER_BIND_CLIENT_CONNECT,
|
|
27
|
+
VENOK_WS_ADAPTER_BIND_CLIENT_DISCONNECT,
|
|
28
|
+
VENOK_WS_ADAPTER_BIND_MESSAGE_HANDLERS,
|
|
29
|
+
VENOK_WS_ADAPTER_LISTEN
|
|
30
|
+
} from "../symbols.js";
|
|
31
|
+
class WebsocketStarterModule {
|
|
32
|
+
options;
|
|
33
|
+
websocketExplorerService;
|
|
34
|
+
websocketConfig;
|
|
35
|
+
constructor(options, websocketExplorerService, websocketConfig) {
|
|
36
|
+
this.options = options;
|
|
37
|
+
this.websocketExplorerService = websocketExplorerService;
|
|
38
|
+
this.websocketConfig = websocketConfig;
|
|
39
|
+
}
|
|
40
|
+
onApplicationBootstrap() {
|
|
41
|
+
const adapter = this.websocketConfig.getAdapter();
|
|
42
|
+
adapter[VENOK_WS_ADAPTER_LISTEN]({ mainHttpServerPort: this.options.httpPort || 0 });
|
|
43
|
+
}
|
|
44
|
+
async beforeApplicationShutdown() {
|
|
45
|
+
const adapter = this.websocketConfig.getAdapter();
|
|
46
|
+
await adapter.closeAll();
|
|
47
|
+
}
|
|
48
|
+
onModuleInit() {
|
|
49
|
+
this.websocketExplorerService.explore(WebSocketGateway.KEY).forEach((gateway) => this.bindGateway(gateway));
|
|
50
|
+
const adapter = this.websocketConfig.getAdapter();
|
|
51
|
+
adapter.setMainServerApplyCallback(this.options.attachMainWebsocketServerToHttpServerCallback);
|
|
52
|
+
}
|
|
53
|
+
bindGateway(gateway) {
|
|
54
|
+
const adapter = this.websocketConfig.getAdapter();
|
|
55
|
+
const { connection, disconnect, init, server } = gateway.observableServer;
|
|
56
|
+
if (gateway.afterInit)
|
|
57
|
+
init.subscribe(gateway.afterInit);
|
|
58
|
+
if (gateway.handleConnect) {
|
|
59
|
+
connection.pipe(distinctUntilChanged((prev, curr) => prev && curr && prev[0] === curr[0])).subscribe(gateway.handleConnect);
|
|
60
|
+
}
|
|
61
|
+
if (gateway.handleDisconnect) {
|
|
62
|
+
disconnect.pipe(distinctUntilChanged()).subscribe(gateway.handleDisconnect);
|
|
63
|
+
}
|
|
64
|
+
const handler = this.getConnectionHandler(gateway.handlers, disconnect, connection);
|
|
65
|
+
adapter[VENOK_WS_ADAPTER_BIND_CLIENT_CONNECT](server, handler);
|
|
66
|
+
}
|
|
67
|
+
getConnectionHandler(handlers, disconnect, connection) {
|
|
68
|
+
const adapter = this.websocketConfig.getAdapter();
|
|
69
|
+
return (...args) => {
|
|
70
|
+
const [client] = args;
|
|
71
|
+
connection.next(args);
|
|
72
|
+
this.subscribeMessages(client, handlers);
|
|
73
|
+
adapter[VENOK_WS_ADAPTER_BIND_CLIENT_DISCONNECT](client, (...disconnectArgs) => disconnect.next(disconnectArgs));
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
subscribeMessages(client, handlers) {
|
|
77
|
+
const adapter = this.websocketConfig.getAdapter();
|
|
78
|
+
adapter[VENOK_WS_ADAPTER_BIND_MESSAGE_HANDLERS](client, handlers, (data) => fromPromise(this.pickResult(data)).pipe(mergeAll()));
|
|
79
|
+
}
|
|
80
|
+
async pickResult(deferredResult) {
|
|
81
|
+
const result = await deferredResult;
|
|
82
|
+
if (isObservable(result))
|
|
83
|
+
return result;
|
|
84
|
+
if (result instanceof Promise)
|
|
85
|
+
return fromPromise(result);
|
|
86
|
+
return of(result);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
WebsocketStarterModule = __legacyDecorateClassTS([
|
|
90
|
+
Injectable(),
|
|
91
|
+
__legacyDecorateParamTS(0, Inject(WEBSOCKET_APP_OPTIONS)),
|
|
92
|
+
__legacyMetadataTS("design:paramtypes", [
|
|
93
|
+
typeof Required === "undefined" ? Object : Required,
|
|
94
|
+
typeof WebsocketExplorerService === "undefined" ? Object : WebsocketExplorerService,
|
|
95
|
+
typeof WebsocketConfig === "undefined" ? Object : WebsocketConfig
|
|
96
|
+
])
|
|
97
|
+
], WebsocketStarterModule);
|
|
98
|
+
export {
|
|
99
|
+
WebsocketStarterModule
|
|
100
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@venok/websocket",
|
|
3
|
+
"version": "2.1.0-next.1",
|
|
4
|
+
"description": "",
|
|
5
|
+
"author": "shiz-ceo",
|
|
6
|
+
"homepage": "",
|
|
7
|
+
"main": "index.js",
|
|
8
|
+
"types": "./index.d.ts",
|
|
9
|
+
"type": "module",
|
|
10
|
+
"files": [
|
|
11
|
+
"package.json",
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"require": {
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"default": "./dist/index.cjs"
|
|
19
|
+
},
|
|
20
|
+
"import": {
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"default": "./dist/index.js"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public"
|
|
28
|
+
},
|
|
29
|
+
"repository": {
|
|
30
|
+
"type": "git",
|
|
31
|
+
"url": "git+https://github.com/venokjs/venok.git",
|
|
32
|
+
"directory": "packages/websocket"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"test": "bun test ./test/"
|
|
36
|
+
},
|
|
37
|
+
"peerDependencies": {
|
|
38
|
+
"@venok/core": "2.0.1",
|
|
39
|
+
"@venok/integration": "2.0.1",
|
|
40
|
+
"reflect-metadata": "^0.2.2",
|
|
41
|
+
"rxjs": "^7.8.1"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"object-hash": "^3.0.0"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@types/object-hash": "^3.0.6"
|
|
48
|
+
}
|
|
49
|
+
}
|