@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.
Files changed (36) hide show
  1. package/dist/constants.js +32 -0
  2. package/dist/decorators/gateway.decorator.js +40 -0
  3. package/dist/decorators/message-body.decorator.js +32 -0
  4. package/dist/decorators/server.decorator.js +27 -0
  5. package/dist/decorators/socket.decorator.js +23 -0
  6. package/dist/decorators/subscribe-message.decorator.js +23 -0
  7. package/dist/enums/ws-paramtype.js +27 -0
  8. package/dist/errors/ack-not-supported.exception.js +27 -0
  9. package/dist/errors/invalid-socket-port.exception.js +27 -0
  10. package/dist/exceptions/ws.exception.js +42 -0
  11. package/dist/filters/context.js +28 -0
  12. package/dist/filters/filter.js +72 -0
  13. package/dist/helpers/discovery.helper.js +51 -0
  14. package/dist/helpers/event-stream-factory.helper.js +31 -0
  15. package/dist/index.d.ts +200 -0
  16. package/dist/index.js +18 -0
  17. package/dist/interfaces/event-stream-host.interface.js +0 -0
  18. package/dist/interfaces/index.js +4 -0
  19. package/dist/interfaces/options.interface.js +0 -0
  20. package/dist/interfaces/websocket/gateway-handler-metadata.interfcae.js +0 -0
  21. package/dist/interfaces/websocket/gateway-metadata.interface.js +0 -0
  22. package/dist/interfaces/websocket/gateway-options.interface.js +0 -0
  23. package/dist/interfaces/websocket/index.js +4 -0
  24. package/dist/symbols.js +31 -0
  25. package/dist/websocket/adapter.js +31 -0
  26. package/dist/websocket/arguments-host.js +39 -0
  27. package/dist/websocket/config.js +43 -0
  28. package/dist/websocket/configurable-module.js +26 -0
  29. package/dist/websocket/container.js +42 -0
  30. package/dist/websocket/context.js +43 -0
  31. package/dist/websocket/explorer.js +118 -0
  32. package/dist/websocket/finder.js +57 -0
  33. package/dist/websocket/module.js +34 -0
  34. package/dist/websocket/params-factory.js +41 -0
  35. package/dist/websocket/starter-module.js +100 -0
  36. 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
+ }