@grest-ts/websocket 0.0.5
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/LICENSE +21 -0
- package/dist/src/adapter/BrowserSocketAdapter.d.ts +18 -0
- package/dist/src/adapter/BrowserSocketAdapter.d.ts.map +1 -0
- package/dist/src/adapter/BrowserSocketAdapter.js +51 -0
- package/dist/src/adapter/BrowserSocketAdapter.js.map +1 -0
- package/dist/src/adapter/NodeSocketAdapter.d.ts +21 -0
- package/dist/src/adapter/NodeSocketAdapter.d.ts.map +1 -0
- package/dist/src/adapter/NodeSocketAdapter.js +52 -0
- package/dist/src/adapter/NodeSocketAdapter.js.map +1 -0
- package/dist/src/adapter/getDefaultAdapter.d.ts +5 -0
- package/dist/src/adapter/getDefaultAdapter.d.ts.map +1 -0
- package/dist/src/adapter/getDefaultAdapter.js +15 -0
- package/dist/src/adapter/getDefaultAdapter.js.map +1 -0
- package/dist/src/client/GGSocketClient.d.ts +10 -0
- package/dist/src/client/GGSocketClient.d.ts.map +1 -0
- package/dist/src/client/GGSocketClient.js +17 -0
- package/dist/src/client/GGSocketClient.js.map +1 -0
- package/dist/src/client/GGSocketPool.d.ts +63 -0
- package/dist/src/client/GGSocketPool.d.ts.map +1 -0
- package/dist/src/client/GGSocketPool.js +203 -0
- package/dist/src/client/GGSocketPool.js.map +1 -0
- package/dist/src/index-browser.d.ts +11 -0
- package/dist/src/index-browser.d.ts.map +1 -0
- package/dist/src/index-browser.js +17 -0
- package/dist/src/index-browser.js.map +1 -0
- package/dist/src/index-node.d.ts +14 -0
- package/dist/src/index-node.d.ts.map +1 -0
- package/dist/src/index-node.js +22 -0
- package/dist/src/index-node.js.map +1 -0
- package/dist/src/schema/GGWebSocketMiddleware.d.ts +40 -0
- package/dist/src/schema/GGWebSocketMiddleware.d.ts.map +1 -0
- package/dist/src/schema/GGWebSocketMiddleware.js +6 -0
- package/dist/src/schema/GGWebSocketMiddleware.js.map +1 -0
- package/dist/src/schema/GGWebSocketSchema.d.ts +31 -0
- package/dist/src/schema/GGWebSocketSchema.d.ts.map +1 -0
- package/dist/src/schema/GGWebSocketSchema.js +32 -0
- package/dist/src/schema/GGWebSocketSchema.js.map +1 -0
- package/dist/src/schema/webSocketSchema.d.ts +52 -0
- package/dist/src/schema/webSocketSchema.d.ts.map +1 -0
- package/dist/src/schema/webSocketSchema.js +62 -0
- package/dist/src/schema/webSocketSchema.js.map +1 -0
- package/dist/src/server/GGSocketServer.d.ts +34 -0
- package/dist/src/server/GGSocketServer.d.ts.map +1 -0
- package/dist/src/server/GGSocketServer.js +186 -0
- package/dist/src/server/GGSocketServer.js.map +1 -0
- package/dist/src/server/GGWebSocketMetrics.d.ts +43 -0
- package/dist/src/server/GGWebSocketMetrics.d.ts.map +1 -0
- package/dist/src/server/GGWebSocketMetrics.js +38 -0
- package/dist/src/server/GGWebSocketMetrics.js.map +1 -0
- package/dist/src/server/GGWebSocketSchema.startServer.d.ts +33 -0
- package/dist/src/server/GGWebSocketSchema.startServer.d.ts.map +1 -0
- package/dist/src/server/GGWebSocketSchema.startServer.js +80 -0
- package/dist/src/server/GGWebSocketSchema.startServer.js.map +1 -0
- package/dist/src/server/GG_WS_CONNECTION.d.ts +12 -0
- package/dist/src/server/GG_WS_CONNECTION.d.ts.map +1 -0
- package/dist/src/server/GG_WS_CONNECTION.js +8 -0
- package/dist/src/server/GG_WS_CONNECTION.js.map +1 -0
- package/dist/src/server/GG_WS_MESSAGE.d.ts +10 -0
- package/dist/src/server/GG_WS_MESSAGE.d.ts.map +1 -0
- package/dist/src/server/GG_WS_MESSAGE.js +7 -0
- package/dist/src/server/GG_WS_MESSAGE.js.map +1 -0
- package/dist/src/socket/GGSocket.d.ts +81 -0
- package/dist/src/socket/GGSocket.d.ts.map +1 -0
- package/dist/src/socket/GGSocket.js +315 -0
- package/dist/src/socket/GGSocket.js.map +1 -0
- package/dist/src/socket/SocketAdapter.d.ts +13 -0
- package/dist/src/socket/SocketAdapter.d.ts.map +1 -0
- package/dist/src/socket/SocketAdapter.js +2 -0
- package/dist/src/socket/SocketAdapter.js.map +1 -0
- package/dist/src/socket/SocketMessage.d.ts +47 -0
- package/dist/src/socket/SocketMessage.d.ts.map +1 -0
- package/dist/src/socket/SocketMessage.js +51 -0
- package/dist/src/socket/SocketMessage.js.map +1 -0
- package/dist/src/socket/WebSocketTypes.d.ts +18 -0
- package/dist/src/socket/WebSocketTypes.d.ts.map +1 -0
- package/dist/src/socket/WebSocketTypes.js +5 -0
- package/dist/src/socket/WebSocketTypes.js.map +1 -0
- package/dist/src/socket/utils/PendingRequestsMap.d.ts +32 -0
- package/dist/src/socket/utils/PendingRequestsMap.d.ts.map +1 -0
- package/dist/src/socket/utils/PendingRequestsMap.js +104 -0
- package/dist/src/socket/utils/PendingRequestsMap.js.map +1 -0
- package/dist/src/tsconfig.json +17 -0
- package/dist/testkit/client/GGSocketCall.d.ts +37 -0
- package/dist/testkit/client/GGSocketCall.d.ts.map +1 -0
- package/dist/testkit/client/GGSocketCall.js +44 -0
- package/dist/testkit/client/GGSocketCall.js.map +1 -0
- package/dist/testkit/client/GGWebSocketSchema.callOn.d.ts +70 -0
- package/dist/testkit/client/GGWebSocketSchema.callOn.d.ts.map +1 -0
- package/dist/testkit/client/GGWebSocketSchema.callOn.js +135 -0
- package/dist/testkit/client/GGWebSocketSchema.callOn.js.map +1 -0
- package/dist/testkit/index-testkit.d.ts +4 -0
- package/dist/testkit/index-testkit.d.ts.map +1 -0
- package/dist/testkit/index-testkit.js +3 -0
- package/dist/testkit/index-testkit.js.map +1 -0
- package/dist/tsconfig.publish.tsbuildinfo +1 -0
- package/package.json +74 -0
- package/src/adapter/BrowserSocketAdapter.ts +63 -0
- package/src/adapter/NodeSocketAdapter.ts +67 -0
- package/src/adapter/getDefaultAdapter.ts +14 -0
- package/src/client/GGSocketClient.ts +25 -0
- package/src/client/GGSocketPool.ts +244 -0
- package/src/index-browser.ts +21 -0
- package/src/index-node.ts +28 -0
- package/src/schema/GGWebSocketMiddleware.ts +43 -0
- package/src/schema/GGWebSocketSchema.ts +57 -0
- package/src/schema/webSocketSchema.ts +109 -0
- package/src/server/GGSocketServer.ts +217 -0
- package/src/server/GGWebSocketMetrics.ts +58 -0
- package/src/server/GGWebSocketSchema.startServer.ts +136 -0
- package/src/server/GG_WS_CONNECTION.ts +10 -0
- package/src/server/GG_WS_MESSAGE.ts +9 -0
- package/src/socket/GGSocket.ts +394 -0
- package/src/socket/SocketAdapter.ts +21 -0
- package/src/socket/SocketMessage.ts +97 -0
- package/src/socket/WebSocketTypes.ts +19 -0
- package/src/socket/utils/PendingRequestsMap.ts +128 -0
- package/src/tsconfig.json +17 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket-specific middleware interface.
|
|
3
|
+
* Independent from @grest-ts/http - WebSocket has its own middleware system.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Context available during WebSocket handshake.
|
|
7
|
+
*/
|
|
8
|
+
export interface GGWebSocketHandshakeContext {
|
|
9
|
+
/**
|
|
10
|
+
* Headers from the handshake message (client-sent or server-received).
|
|
11
|
+
*/
|
|
12
|
+
headers: Record<string, string>;
|
|
13
|
+
/**
|
|
14
|
+
* Query parameters from the WebSocket URL.
|
|
15
|
+
*/
|
|
16
|
+
queryArgs: Record<string, string>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* WebSocket middleware interface for both client and server.
|
|
20
|
+
* Unlike HTTP middleware, WebSocket middleware works with handshake data.
|
|
21
|
+
*/
|
|
22
|
+
export interface GGWebSocketMiddleware {
|
|
23
|
+
/**
|
|
24
|
+
* Client-side: Add headers to the handshake message before sending.
|
|
25
|
+
* Called by GGSocketPool when establishing a connection.
|
|
26
|
+
*/
|
|
27
|
+
updateHandshake?(context: GGWebSocketHandshakeContext): void;
|
|
28
|
+
/**
|
|
29
|
+
* Server-side: Parse headers from the received handshake message.
|
|
30
|
+
* Called by GGSocketServer when receiving a connection.
|
|
31
|
+
*/
|
|
32
|
+
parseHandshake?(context: GGWebSocketHandshakeContext): void;
|
|
33
|
+
/**
|
|
34
|
+
* Server-side: Async processing after parseHandshake.
|
|
35
|
+
* Can be used for authentication, authorization, etc.
|
|
36
|
+
* Throwing an error will reject the connection.
|
|
37
|
+
*/
|
|
38
|
+
process?(): Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=GGWebSocketMiddleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGWebSocketMiddleware.d.ts","sourceRoot":"","sources":["../../../src/schema/GGWebSocketMiddleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,2BAA2B;IACxC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IAClC;;;OAGG;IACH,eAAe,CAAC,CAAC,OAAO,EAAE,2BAA2B,GAAG,IAAI,CAAC;IAE7D;;;OAGG;IACH,cAAc,CAAC,CAAC,OAAO,EAAE,2BAA2B,GAAG,IAAI,CAAC;IAE5D;;;;OAIG;IACH,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGWebSocketMiddleware.js","sourceRoot":"","sources":["../../../src/schema/GGWebSocketMiddleware.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { GGWebSocketMiddleware } from "./GGWebSocketMiddleware";
|
|
2
|
+
import { GGContractApiDefinition, GGContractClass } from "@grest-ts/schema";
|
|
3
|
+
/**
|
|
4
|
+
* WebSocket API Schema - pure data definition with typed context
|
|
5
|
+
*
|
|
6
|
+
* Type parameters:
|
|
7
|
+
* - TClientToServer: Client-facing type for clientToServer methods (returns GGPromise)
|
|
8
|
+
* - TServerToClient: Client-facing type for serverToClient methods (returns GGPromise)
|
|
9
|
+
* - TContext: Accumulated context type (parseHandshake return types)
|
|
10
|
+
* - TQuery: Query parameters on connect
|
|
11
|
+
* - TClientToServerImpl: Server implementation type for clientToServer handlers (returns Promise)
|
|
12
|
+
*/
|
|
13
|
+
export declare class GGWebSocketSchema<TClientToServer, TServerToClient, TContext = {}, TQuery = undefined, TClientToServerImpl = TClientToServer> {
|
|
14
|
+
readonly name: string;
|
|
15
|
+
readonly path: string;
|
|
16
|
+
readonly middlewares: readonly GGWebSocketMiddleware[];
|
|
17
|
+
private readonly contractFactory;
|
|
18
|
+
private contractCache;
|
|
19
|
+
constructor(name: string, path: string, contractFactory: () => GGWebSocketContractRuntime, middlewares?: readonly GGWebSocketMiddleware[]);
|
|
20
|
+
get contract(): GGWebSocketContractRuntime;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Runtime contract structure for WebSocket APIs.
|
|
24
|
+
* Contains GGContractClass instances for proper validation via implement().
|
|
25
|
+
*/
|
|
26
|
+
export interface GGWebSocketContractRuntime {
|
|
27
|
+
apiName: string;
|
|
28
|
+
clientToServer: GGContractClass<GGContractApiDefinition>;
|
|
29
|
+
serverToClient: GGContractClass<GGContractApiDefinition>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=GGWebSocketSchema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGWebSocketSchema.d.ts","sourceRoot":"","sources":["../../../src/schema/GGWebSocketSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,qBAAqB,EAAC,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAC,uBAAuB,EAAE,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAE1E;;;;;;;;;GASG;AACH,qBAAa,iBAAiB,CAC1B,eAAe,EACf,eAAe,EACf,QAAQ,GAAG,EAAE,EACb,MAAM,GAAG,SAAS,EAClB,mBAAmB,GAAG,eAAe;IAErC,SAAgB,IAAI,EAAE,MAAM,CAAA;IAC5B,SAAgB,IAAI,EAAE,MAAM,CAAA;IAC5B,SAAgB,WAAW,EAAE,SAAS,qBAAqB,EAAE,CAAA;IAC7D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkC;IAClE,OAAO,CAAC,aAAa,CAA0C;gBAG3D,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,MAAM,0BAA0B,EACjD,WAAW,GAAE,SAAS,qBAAqB,EAAO;IAStD,IAAI,QAAQ,IAAI,0BAA0B,CAMzC;CACJ;AAED;;;GAGG;AACH,MAAM,WAAW,0BAA0B;IACvC,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,eAAe,CAAC,uBAAuB,CAAC,CAAA;IACxD,cAAc,EAAE,eAAe,CAAC,uBAAuB,CAAC,CAAA;CAC3D"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket API Schema - pure data definition with typed context
|
|
3
|
+
*
|
|
4
|
+
* Type parameters:
|
|
5
|
+
* - TClientToServer: Client-facing type for clientToServer methods (returns GGPromise)
|
|
6
|
+
* - TServerToClient: Client-facing type for serverToClient methods (returns GGPromise)
|
|
7
|
+
* - TContext: Accumulated context type (parseHandshake return types)
|
|
8
|
+
* - TQuery: Query parameters on connect
|
|
9
|
+
* - TClientToServerImpl: Server implementation type for clientToServer handlers (returns Promise)
|
|
10
|
+
*/
|
|
11
|
+
export class GGWebSocketSchema {
|
|
12
|
+
name;
|
|
13
|
+
path;
|
|
14
|
+
middlewares;
|
|
15
|
+
contractFactory;
|
|
16
|
+
contractCache = null;
|
|
17
|
+
constructor(name, path, contractFactory, middlewares = []) {
|
|
18
|
+
this.name = name;
|
|
19
|
+
this.path = path;
|
|
20
|
+
this.middlewares = middlewares;
|
|
21
|
+
this.contractFactory = contractFactory;
|
|
22
|
+
Object.freeze(this.middlewares);
|
|
23
|
+
}
|
|
24
|
+
get contract() {
|
|
25
|
+
if (!this.contractCache) {
|
|
26
|
+
this.contractCache = this.contractFactory();
|
|
27
|
+
}
|
|
28
|
+
Object.freeze(this);
|
|
29
|
+
return this.contractCache;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=GGWebSocketSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGWebSocketSchema.js","sourceRoot":"","sources":["../../../src/schema/GGWebSocketSchema.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AACH,MAAM,OAAO,iBAAiB;IAOV,IAAI,CAAQ;IACZ,IAAI,CAAQ;IACZ,WAAW,CAAkC;IAC5C,eAAe,CAAkC;IAC1D,aAAa,GAAsC,IAAI,CAAA;IAE/D,YACI,IAAY,EACZ,IAAY,EACZ,eAAiD,EACjD,cAAgD,EAAE;QAElD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,eAAe,GAAG,eAAe,CAAA;QACtC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IACnC,CAAC;IAED,IAAI,QAAQ;QACR,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACtB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;QAC/C,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACnB,OAAO,IAAI,CAAC,aAAa,CAAA;IAC7B,CAAC;CACJ"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { GGWebSocketSchema } from "./GGWebSocketSchema";
|
|
2
|
+
import { GGWebSocketMiddleware } from "./GGWebSocketMiddleware";
|
|
3
|
+
import { GGContractClient, GGContractImplementation, GGContractMethod } from "@grest-ts/schema";
|
|
4
|
+
/**
|
|
5
|
+
* Bidirectional websocket contract methods
|
|
6
|
+
*/
|
|
7
|
+
export interface GGSocketContractMethods {
|
|
8
|
+
clientToServer: Record<string, GGContractMethod>;
|
|
9
|
+
serverToClient: Record<string, GGContractMethod>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* WebSocket contract definition
|
|
13
|
+
*/
|
|
14
|
+
export interface GGSocketContract<TDef extends GGSocketContractMethods = GGSocketContractMethods> {
|
|
15
|
+
name: string;
|
|
16
|
+
methods: TDef;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Create a websocket contract
|
|
20
|
+
*/
|
|
21
|
+
export declare function defineSocketContract<TDef extends GGSocketContractMethods>(name: string, methods: TDef): GGSocketContract<TDef>;
|
|
22
|
+
/**
|
|
23
|
+
* Create a WebSocket API schema builder from a contract.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* export const ChatContract = defineSocketContract("Chat", {
|
|
27
|
+
* clientToServer: {
|
|
28
|
+
* sendMessage: { input: IsMessage, success: IsVoid, errors: [SERVER_ERROR] }
|
|
29
|
+
* },
|
|
30
|
+
* serverToClient: {
|
|
31
|
+
* onMessage: { input: IsMessage }
|
|
32
|
+
* }
|
|
33
|
+
* })
|
|
34
|
+
*
|
|
35
|
+
* export const ChatApi = webSocketSchema(ChatContract)
|
|
36
|
+
* .path("/chat")
|
|
37
|
+
* .use(AuthMiddleware)
|
|
38
|
+
* .done()
|
|
39
|
+
*/
|
|
40
|
+
export declare function webSocketSchema<TDef extends GGSocketContractMethods>(contract: GGSocketContract<TDef>): GGWebSocketSchemaBuilder<GGContractClient<TDef["clientToServer"]>, GGContractClient<TDef["serverToClient"]>, undefined, undefined, GGContractImplementation<TDef["clientToServer"]>>;
|
|
41
|
+
declare class GGWebSocketSchemaBuilder<TClientToServer, TServerToClient, TContext = undefined, TQuery = undefined, TClientToServerImpl = TClientToServer> {
|
|
42
|
+
private readonly _contract;
|
|
43
|
+
private _path;
|
|
44
|
+
private _middlewares;
|
|
45
|
+
constructor(_contract: GGSocketContract);
|
|
46
|
+
path(path: string): this;
|
|
47
|
+
use<M extends GGWebSocketMiddleware>(middleware: M): GGWebSocketSchemaBuilder<TClientToServer, TServerToClient, TContext | M, TQuery, TClientToServerImpl>;
|
|
48
|
+
queryOnConnect<TNewQuery>(): GGWebSocketSchemaBuilder<TClientToServer, TServerToClient, TContext, TNewQuery, TClientToServerImpl>;
|
|
49
|
+
done(): GGWebSocketSchema<TClientToServer, TServerToClient, TContext, TQuery, TClientToServerImpl>;
|
|
50
|
+
}
|
|
51
|
+
export {};
|
|
52
|
+
//# sourceMappingURL=webSocketSchema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webSocketSchema.d.ts","sourceRoot":"","sources":["../../../src/schema/webSocketSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAA6B,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAC,qBAAqB,EAAC,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAkB,gBAAgB,EAAE,wBAAwB,EAAE,gBAAgB,EAAC,MAAM,kBAAkB,CAAC;AAE/G;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACpC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;IAChD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;CACnD;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,IAAI,SAAS,uBAAuB,GAAG,uBAAuB;IAC5F,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,IAAI,CAAA;CAChB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,SAAS,uBAAuB,EACrE,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,IAAI,GACd,gBAAgB,CAAC,IAAI,CAAC,CAExB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAAC,IAAI,SAAS,uBAAuB,EAChE,QAAQ,EAAE,gBAAgB,CAAC,IAAI,CAAC,GACjC,wBAAwB,CACvB,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,EACxC,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,EACxC,SAAS,EACT,SAAS,EACT,wBAAwB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CACnD,CAEA;AAED,cAAM,wBAAwB,CAC1B,eAAe,EACf,eAAe,EACf,QAAQ,GAAG,SAAS,EACpB,MAAM,GAAG,SAAS,EAClB,mBAAmB,GAAG,eAAe;IAMjC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAJ9B,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,YAAY,CAA8B;gBAG7B,SAAS,EAAE,gBAAgB;IAIhD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKxB,GAAG,CAAC,CAAC,SAAS,qBAAqB,EAAE,UAAU,EAAE,CAAC,GAAG,wBAAwB,CAAC,eAAe,EAAE,eAAe,EAAE,QAAQ,GAAG,CAAC,EAAE,MAAM,EAAE,mBAAmB,CAAC;IAK1J,cAAc,CAAC,SAAS,KAAK,wBAAwB,CAAC,eAAe,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,mBAAmB,CAAC;IAIjI,IAAI,IAAI,iBAAiB,CAAC,eAAe,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,mBAAmB,CAAC;CAmBrG"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { GGWebSocketSchema } from "./GGWebSocketSchema.js";
|
|
2
|
+
import { GGContractClass } from "@grest-ts/schema";
|
|
3
|
+
/**
|
|
4
|
+
* Create a websocket contract
|
|
5
|
+
*/
|
|
6
|
+
export function defineSocketContract(name, methods) {
|
|
7
|
+
return { name, methods };
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Create a WebSocket API schema builder from a contract.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* export const ChatContract = defineSocketContract("Chat", {
|
|
14
|
+
* clientToServer: {
|
|
15
|
+
* sendMessage: { input: IsMessage, success: IsVoid, errors: [SERVER_ERROR] }
|
|
16
|
+
* },
|
|
17
|
+
* serverToClient: {
|
|
18
|
+
* onMessage: { input: IsMessage }
|
|
19
|
+
* }
|
|
20
|
+
* })
|
|
21
|
+
*
|
|
22
|
+
* export const ChatApi = webSocketSchema(ChatContract)
|
|
23
|
+
* .path("/chat")
|
|
24
|
+
* .use(AuthMiddleware)
|
|
25
|
+
* .done()
|
|
26
|
+
*/
|
|
27
|
+
export function webSocketSchema(contract) {
|
|
28
|
+
return new GGWebSocketSchemaBuilder(contract);
|
|
29
|
+
}
|
|
30
|
+
class GGWebSocketSchemaBuilder {
|
|
31
|
+
_contract;
|
|
32
|
+
_path = "";
|
|
33
|
+
_middlewares = [];
|
|
34
|
+
constructor(_contract) {
|
|
35
|
+
this._contract = _contract;
|
|
36
|
+
}
|
|
37
|
+
path(path) {
|
|
38
|
+
this._path = path;
|
|
39
|
+
return this;
|
|
40
|
+
}
|
|
41
|
+
use(middleware) {
|
|
42
|
+
this._middlewares.push(middleware);
|
|
43
|
+
return this;
|
|
44
|
+
}
|
|
45
|
+
queryOnConnect() {
|
|
46
|
+
return this;
|
|
47
|
+
}
|
|
48
|
+
done() {
|
|
49
|
+
const contract = this._contract;
|
|
50
|
+
const contractFactory = () => {
|
|
51
|
+
const methods = contract.methods;
|
|
52
|
+
const name = contract.name;
|
|
53
|
+
return {
|
|
54
|
+
apiName: name,
|
|
55
|
+
clientToServer: new GGContractClass(name + ".clientToServer", methods.clientToServer),
|
|
56
|
+
serverToClient: new GGContractClass(name + ".serverToClient", methods.serverToClient)
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
return new GGWebSocketSchema(contract.name, this._path, contractFactory, this._middlewares);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=webSocketSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webSocketSchema.js","sourceRoot":"","sources":["../../../src/schema/webSocketSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAA6B,MAAM,qBAAqB,CAAC;AAElF,OAAO,EAAC,eAAe,EAA+D,MAAM,kBAAkB,CAAC;AAkB/G;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAChC,IAAY,EACZ,OAAa;IAEb,OAAO,EAAC,IAAI,EAAE,OAAO,EAAC,CAAA;AAC1B,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,eAAe,CAC3B,QAAgC;IAQhC,OAAO,IAAI,wBAAwB,CAAC,QAAQ,CAAC,CAAA;AACjD,CAAC;AAED,MAAM,wBAAwB;IAWL;IAJb,KAAK,GAAW,EAAE,CAAA;IAClB,YAAY,GAA4B,EAAE,CAAA;IAElD,YACqB,SAA2B;QAA3B,cAAS,GAAT,SAAS,CAAkB;IAEhD,CAAC;IAED,IAAI,CAAC,IAAY;QACb,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;QACjB,OAAO,IAAI,CAAA;IACf,CAAC;IAED,GAAG,CAAkC,UAAa;QAC9C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAClC,OAAO,IAAW,CAAA;IACtB,CAAC;IAED,cAAc;QACV,OAAO,IAAW,CAAA;IACtB,CAAC;IAED,IAAI;QACA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,MAAM,eAAe,GAAG,GAA+B,EAAE;YACrD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;YACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC3B,OAAO;gBACH,OAAO,EAAE,IAAI;gBACb,cAAc,EAAE,IAAI,eAAe,CAAC,IAAI,GAAG,iBAAiB,EAAE,OAAO,CAAC,cAAc,CAAC;gBACrF,cAAc,EAAE,IAAI,eAAe,CAAC,IAAI,GAAG,iBAAiB,EAAE,OAAO,CAAC,cAAc,CAAC;aACxF,CAAC;QACN,CAAC,CAAC;QAEF,OAAO,IAAI,iBAAiB,CACxB,QAAQ,CAAC,IAAI,EACb,IAAI,CAAC,KAAK,EACV,eAAe,EACf,IAAI,CAAC,YAAY,CACpB,CAAA;IACL,CAAC;CACJ"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manages WebSocket connections for a single endpoint
|
|
3
|
+
* Handles connection acceptance, effect parsing via handshake, and socket lifecycle
|
|
4
|
+
*/
|
|
5
|
+
import { GGValidator } from "@grest-ts/schema";
|
|
6
|
+
import { GGSocket } from "../socket/GGSocket";
|
|
7
|
+
import { GGWebSocketMiddleware } from "../schema/GGWebSocketMiddleware";
|
|
8
|
+
import { GGHttpServer } from "@grest-ts/http";
|
|
9
|
+
export interface GGSocketServerConfig<TContext, Query> {
|
|
10
|
+
path: string;
|
|
11
|
+
apiName: string;
|
|
12
|
+
queryValidator?: GGValidator<Query>;
|
|
13
|
+
middlewares: readonly GGWebSocketMiddleware[];
|
|
14
|
+
}
|
|
15
|
+
export declare class GGSocketServer<TContext, Query> {
|
|
16
|
+
private readonly wss;
|
|
17
|
+
private readonly http;
|
|
18
|
+
readonly path: string;
|
|
19
|
+
private readonly apiName;
|
|
20
|
+
private readonly middlewares;
|
|
21
|
+
private readonly queryValidator;
|
|
22
|
+
private readonly activeSockets;
|
|
23
|
+
private readonly onConnectionHandlers;
|
|
24
|
+
private readonly scope;
|
|
25
|
+
constructor(http: GGHttpServer, config: GGSocketServerConfig<TContext, Query>);
|
|
26
|
+
onConnection(handler: (socket: GGSocket, query: Query) => void): void;
|
|
27
|
+
private _onConnection;
|
|
28
|
+
/**
|
|
29
|
+
* Handle handshake message from client.
|
|
30
|
+
* Waits for HANDSHAKE message with headers, runs effects, returns context.
|
|
31
|
+
*/
|
|
32
|
+
private handleHandshake;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=GGSocketServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGSocketServer.d.ts","sourceRoot":"","sources":["../../../src/server/GGSocketServer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAQ,WAAW,EAAC,MAAM,kBAAkB,CAAC;AASpD,OAAO,EAAC,QAAQ,EAAC,MAAM,oBAAoB,CAAC;AAM5C,OAAO,EAA8B,qBAAqB,EAAC,MAAM,iCAAiC,CAAC;AACnG,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAE5C,MAAM,WAAW,oBAAoB,CAAC,QAAQ,EAAE,KAAK;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;IACpC,WAAW,EAAE,SAAS,qBAAqB,EAAE,CAAC;CACjD;AAED,qBAAa,cAAc,CAAC,QAAQ,EAAE,KAAK;IAEvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkB;IACtC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAe;IACpC,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmC;IAC/D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IAEpD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA4B;IAC1D,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAuD;IAG5F,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiB;gBAE3B,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,oBAAoB,CAAC,QAAQ,EAAE,KAAK,CAAC;IAiCtE,YAAY,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IAI5E,OAAO,CAAC,aAAa,CA8EpB;IAED;;;OAGG;YACW,eAAe;CAiDhC"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manages WebSocket connections for a single endpoint
|
|
3
|
+
* Handles connection acceptance, effect parsing via handshake, and socket lifecycle
|
|
4
|
+
*/
|
|
5
|
+
import { WebSocketServer } from "ws";
|
|
6
|
+
import { ERROR } from "@grest-ts/schema";
|
|
7
|
+
import { NodeSocketAdapter } from "../adapter/NodeSocketAdapter.js";
|
|
8
|
+
import * as url from "url";
|
|
9
|
+
import { GGLog } from "@grest-ts/logger";
|
|
10
|
+
import { GG_WS_CONNECTION } from "./GG_WS_CONNECTION.js";
|
|
11
|
+
import { GGWebSocketMetrics } from "./GGWebSocketMetrics.js";
|
|
12
|
+
import { Message, MessageType } from "../socket/SocketMessage.js";
|
|
13
|
+
import { GG_TRACE } from "@grest-ts/trace";
|
|
14
|
+
import { GGSocket } from "../socket/GGSocket.js";
|
|
15
|
+
import { GGLocator } from "@grest-ts/locator";
|
|
16
|
+
import { GG_METRICS } from "@grest-ts/metrics";
|
|
17
|
+
import { withTimeout } from "@grest-ts/common";
|
|
18
|
+
import { GGContext } from "@grest-ts/context";
|
|
19
|
+
import { GG_DISCOVERY } from "@grest-ts/discovery";
|
|
20
|
+
export class GGSocketServer {
|
|
21
|
+
wss;
|
|
22
|
+
http;
|
|
23
|
+
path;
|
|
24
|
+
apiName;
|
|
25
|
+
middlewares;
|
|
26
|
+
queryValidator;
|
|
27
|
+
activeSockets = new Set();
|
|
28
|
+
onConnectionHandlers = [];
|
|
29
|
+
// Capture context at construction - WebSocket events lose AsyncLocalStorage context
|
|
30
|
+
scope;
|
|
31
|
+
constructor(http, config) {
|
|
32
|
+
this.scope = GGLocator.getScope();
|
|
33
|
+
this.path = config.path;
|
|
34
|
+
this.apiName = config.apiName;
|
|
35
|
+
this.middlewares = config.middlewares;
|
|
36
|
+
this.queryValidator = config.queryValidator;
|
|
37
|
+
this.wss = new WebSocketServer({ server: http.httpServer, path: this.path });
|
|
38
|
+
this.wss.on('connection', this.scope.wrapWithEnter(this._onConnection));
|
|
39
|
+
this.http = http
|
|
40
|
+
.onStart(() => {
|
|
41
|
+
GGLog.info(this, "WebSocket server started", { api: config.apiName, path: config.path });
|
|
42
|
+
if (GG_DISCOVERY.has()) {
|
|
43
|
+
GG_DISCOVERY.get().registerRoutes([{
|
|
44
|
+
runtime: this.scope.serviceName,
|
|
45
|
+
api: this.apiName,
|
|
46
|
+
pathPrefix: this.path,
|
|
47
|
+
protocol: "ws",
|
|
48
|
+
port: http.port
|
|
49
|
+
}]);
|
|
50
|
+
}
|
|
51
|
+
})
|
|
52
|
+
.onTeardown(async () => {
|
|
53
|
+
GGLog.info(this, "WebSocket server closing");
|
|
54
|
+
try {
|
|
55
|
+
this.wss.close(); // We use external http, so this does not close existing connections.
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
GGLog.error(this, error);
|
|
59
|
+
}
|
|
60
|
+
await Promise.allSettled(Array.from(this.activeSockets).map(socket => socket.teardown()));
|
|
61
|
+
GGLog.info(this, "WebSocket server stopped");
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
onConnection(handler) {
|
|
65
|
+
this.onConnectionHandlers.push(handler);
|
|
66
|
+
}
|
|
67
|
+
_onConnection = async (ws, req) => {
|
|
68
|
+
const connectionLabels = { api: this.apiName, path: this.path };
|
|
69
|
+
const context = new GGContext("ws-connection");
|
|
70
|
+
await context.run(async () => {
|
|
71
|
+
GG_TRACE.init();
|
|
72
|
+
GG_WS_CONNECTION.set({
|
|
73
|
+
port: this.http.port,
|
|
74
|
+
path: this.path
|
|
75
|
+
});
|
|
76
|
+
try {
|
|
77
|
+
// Parse and validate query parameters
|
|
78
|
+
const parsedUrl = url.parse(req.url || '', true);
|
|
79
|
+
let queryArgs = parsedUrl.query;
|
|
80
|
+
if (this.queryValidator) {
|
|
81
|
+
const result = this.queryValidator.safeParse(queryArgs, true);
|
|
82
|
+
if (result.success === false) {
|
|
83
|
+
ws.close(4000, "Invalid query parameters");
|
|
84
|
+
GGLog.warn(this, "REJECTED - bad query", result.issues);
|
|
85
|
+
if (GG_METRICS.has())
|
|
86
|
+
GGWebSocketMetrics.connections.inc(1, { ...connectionLabels, result: 'QUERY_INVALID' });
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
queryArgs = result.value;
|
|
90
|
+
}
|
|
91
|
+
const adapter = new NodeSocketAdapter(ws);
|
|
92
|
+
// Wait for handshake message with headers
|
|
93
|
+
const handshakeResult = await this.handleHandshake(context, adapter, queryArgs);
|
|
94
|
+
if (!handshakeResult.success) {
|
|
95
|
+
GGLog.warn(this, "REJECTED - handshake failed", handshakeResult.error);
|
|
96
|
+
if (GG_METRICS.has())
|
|
97
|
+
GGWebSocketMetrics.connections.inc(1, { ...connectionLabels, result: 'HANDSHAKE_FAILED' });
|
|
98
|
+
adapter.send(Message.create(MessageType.HANDSHAKE_ERR, "", "", handshakeResult.error));
|
|
99
|
+
ws.close(4001, "Handshake failed");
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
// Send handshake success
|
|
103
|
+
adapter.send(Message.create(MessageType.HANDSHAKE_OK, "", "", null));
|
|
104
|
+
GGLog.debug(this, "New websocket connection", queryArgs);
|
|
105
|
+
const socket = new GGSocket(adapter, {
|
|
106
|
+
apiName: this.apiName,
|
|
107
|
+
socketPath: this.path,
|
|
108
|
+
connectionContext: context
|
|
109
|
+
});
|
|
110
|
+
this.activeSockets.add(socket);
|
|
111
|
+
// Track connection metrics
|
|
112
|
+
if (GG_METRICS.has()) {
|
|
113
|
+
GGWebSocketMetrics.connections.inc(1, { ...connectionLabels, result: 'OK' });
|
|
114
|
+
GGWebSocketMetrics.connectionsActive.inc(1, connectionLabels);
|
|
115
|
+
}
|
|
116
|
+
socket.onClose(() => {
|
|
117
|
+
this.activeSockets.delete(socket);
|
|
118
|
+
if (GG_METRICS.has())
|
|
119
|
+
GGWebSocketMetrics.connectionsActive.dec(1, connectionLabels);
|
|
120
|
+
});
|
|
121
|
+
// Run connection handlers inside the connectionScope so they can access context
|
|
122
|
+
for (const handler of this.onConnectionHandlers) {
|
|
123
|
+
try {
|
|
124
|
+
handler(socket, queryArgs);
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
GGLog.error(this, error);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
GGLog.error(this, error);
|
|
133
|
+
if (GG_METRICS.has())
|
|
134
|
+
GGWebSocketMetrics.connections.inc(1, { ...connectionLabels, result: 'ERROR' });
|
|
135
|
+
// Only close if socket is still open (fix #5 - avoid double close)
|
|
136
|
+
if (ws.readyState === ws.OPEN || ws.readyState === ws.CONNECTING) {
|
|
137
|
+
ws.close(4001, "Connection rejected");
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
};
|
|
142
|
+
/**
|
|
143
|
+
* Handle handshake message from client.
|
|
144
|
+
* Waits for HANDSHAKE message with headers, runs effects, returns context.
|
|
145
|
+
*/
|
|
146
|
+
async handleHandshake(context, adapter, queryArgs) {
|
|
147
|
+
return withTimeout(new Promise((resolve) => {
|
|
148
|
+
// Wrap with scope.wrapWithEnter to preserve locator scope when callback fires
|
|
149
|
+
const onMessage = this.scope.wrapWithEnter((data) => {
|
|
150
|
+
const msg = Message.parse(data);
|
|
151
|
+
if (!msg)
|
|
152
|
+
return;
|
|
153
|
+
if (msg.type === MessageType.HANDSHAKE) {
|
|
154
|
+
adapter.offMessage(onMessage);
|
|
155
|
+
context.run(async () => {
|
|
156
|
+
try {
|
|
157
|
+
// Build handshake context from headers
|
|
158
|
+
const headers = msg.data || {};
|
|
159
|
+
const handshakeContext = {
|
|
160
|
+
headers,
|
|
161
|
+
queryArgs: queryArgs
|
|
162
|
+
};
|
|
163
|
+
// Run middlewares
|
|
164
|
+
for (const middleware of this.middlewares) {
|
|
165
|
+
middleware.parseHandshake?.(handshakeContext);
|
|
166
|
+
await middleware.process?.();
|
|
167
|
+
}
|
|
168
|
+
resolve({ success: true });
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
const errorJson = error instanceof ERROR
|
|
172
|
+
? error.toJSON()
|
|
173
|
+
: { message: String(error) };
|
|
174
|
+
resolve({ success: false, error: errorJson });
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
adapter.onMessage(onMessage);
|
|
180
|
+
}), 5000, 'Handshake timeout').catch((error) => ({
|
|
181
|
+
success: false,
|
|
182
|
+
error: { message: error.message || 'Handshake timeout' }
|
|
183
|
+
}));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=GGSocketServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGSocketServer.js","sourceRoot":"","sources":["../../../src/server/GGSocketServer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAY,eAAe,EAAC,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAC,KAAK,EAAc,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAC,iBAAiB,EAAC,MAAM,8BAA8B,CAAC;AAE/D,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAC,KAAK,EAAC,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAC,OAAO,EAAE,WAAW,EAAC,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAC,QAAQ,EAAC,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAC,QAAQ,EAAC,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAC,SAAS,EAAiB,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAC,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAC;AAWjD,MAAM,OAAO,cAAc;IAEN,GAAG,CAAkB;IACrB,IAAI,CAAe;IACpB,IAAI,CAAS;IACZ,OAAO,CAAS;IAChB,WAAW,CAAmC;IAC9C,cAAc,CAAqB;IAEnC,aAAa,GAAkB,IAAI,GAAG,EAAE,CAAC;IACzC,oBAAoB,GAAoD,EAAE,CAAC;IAE5F,oFAAoF;IACnE,KAAK,CAAiB;IAEvC,YAAY,IAAkB,EAAE,MAA6C;QACzE,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;QAC5C,IAAI,CAAC,GAAG,GAAG,IAAI,eAAe,CAAC,EAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAC,CAAC,CAAC;QAC3E,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,IAAI,GAAG,IAAI;aACX,OAAO,CAAC,GAAG,EAAE;YACV,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,0BAA0B,EAAE,EAAC,GAAG,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAC,CAAC,CAAC;YACvF,IAAI,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC;gBACrB,YAAY,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC;wBAC/B,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW;wBAC/B,GAAG,EAAE,IAAI,CAAC,OAAO;wBACjB,UAAU,EAAE,IAAI,CAAC,IAAI;wBACrB,QAAQ,EAAE,IAAI;wBACd,IAAI,EAAE,IAAI,CAAC,IAAI;qBAClB,CAAC,CAAC,CAAC;YACR,CAAC;QACL,CAAC,CAAC;aACD,UAAU,CAAC,KAAK,IAAI,EAAE;YACnB,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,0BAA0B,CAAC,CAAC;YAC7C,IAAI,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,qEAAqE;YAC3F,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC7B,CAAC;YACD,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC1F,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,0BAA0B,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACX,CAAC;IAEM,YAAY,CAAC,OAAiD;QACjE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IAEO,aAAa,GAAG,KAAK,EAAE,EAAa,EAAE,GAAyB,EAAE,EAAE;QACvE,MAAM,gBAAgB,GAAG,EAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAC,CAAC;QAE9D,MAAM,OAAO,GAAG,IAAI,SAAS,CAAC,eAAe,CAAC,CAAC;QAC/C,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;YACzB,QAAQ,CAAC,IAAI,EAAE,CAAA;YACf,gBAAgB,CAAC,GAAG,CAAC;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;gBACpB,IAAI,EAAE,IAAI,CAAC,IAAI;aAClB,CAAC,CAAA;YACF,IAAI,CAAC;gBACD,sCAAsC;gBACtC,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;gBACjD,IAAI,SAAS,GAAG,SAAS,CAAC,KAAc,CAAC;gBAEzC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;oBACtB,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;oBAC7D,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;wBAC3B,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,0BAA0B,CAAC,CAAC;wBAC3C,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,sBAAsB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;wBACxD,IAAI,UAAU,CAAC,GAAG,EAAE;4BAAE,kBAAkB,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAC,GAAG,gBAAgB,EAAE,MAAM,EAAE,eAAe,EAAC,CAAC,CAAC;wBAC5G,OAAO;oBACX,CAAC;oBACD,SAAS,GAAG,MAAM,CAAC,KAAc,CAAA;gBACrC,CAAC;gBAED,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,EAAE,CAAC,CAAC;gBAE1C,0CAA0C;gBAC1C,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;gBAEhF,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;oBAC3B,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,6BAA6B,EAAG,eAAkD,CAAC,KAAK,CAAC,CAAC;oBAC3G,IAAI,UAAU,CAAC,GAAG,EAAE;wBAAE,kBAAkB,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAC,GAAG,gBAAgB,EAAE,MAAM,EAAE,kBAAkB,EAAC,CAAC,CAAC;oBAC/G,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,EAAE,EAAE,EAAE,EAAE,EAAG,eAAkD,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC3H,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;oBACnC,OAAO;gBACX,CAAC;gBAED,yBAAyB;gBACzB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;gBAErE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,0BAA0B,EAAE,SAAS,CAAC,CAAC;gBACzD,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,OAAO,EAAE;oBACjC,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,UAAU,EAAE,IAAI,CAAC,IAAI;oBACrB,iBAAiB,EAAE,OAAO;iBAC7B,CAAC,CAAC;gBACH,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAE/B,2BAA2B;gBAC3B,IAAI,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC;oBACnB,kBAAkB,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAC,GAAG,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAC,CAAC,CAAC;oBAC3E,kBAAkB,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;gBAClE,CAAC;gBAED,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;oBAChB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBAClC,IAAI,UAAU,CAAC,GAAG,EAAE;wBAAE,kBAAkB,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;gBACxF,CAAC,CAAC,CAAC;gBAEH,gFAAgF;gBAChF,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC9C,IAAI,CAAC;wBACD,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;oBAC/B,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACb,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;oBAC7B,CAAC;gBACL,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBACzB,IAAI,UAAU,CAAC,GAAG,EAAE;oBAAE,kBAAkB,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAC,GAAG,gBAAgB,EAAE,MAAM,EAAE,OAAO,EAAC,CAAC,CAAC;gBACpG,mEAAmE;gBACnE,IAAI,EAAE,CAAC,UAAU,KAAK,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,UAAU,KAAK,EAAE,CAAC,UAAU,EAAE,CAAC;oBAC/D,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;gBAC1C,CAAC;YACL,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC,CAAA;IAED;;;OAGG;IACK,KAAK,CAAC,eAAe,CACzB,OAAkB,EAClB,OAA0B,EAC1B,SAAgB;QAGhB,OAAO,WAAW,CACd,IAAI,OAAO,CAAkB,CAAC,OAAO,EAAE,EAAE;YACrC,8EAA8E;YAC9E,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAY,EAAE,EAAE;gBACxD,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAChC,IAAI,CAAC,GAAG;oBAAE,OAAO;gBAEjB,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,CAAC,SAAS,EAAE,CAAC;oBACrC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;oBAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;wBACnB,IAAI,CAAC;4BACD,uCAAuC;4BACvC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;4BAC/B,MAAM,gBAAgB,GAAgC;gCAClD,OAAO;gCACP,SAAS,EAAE,SAAmC;6BACjD,CAAC;4BAEF,kBAAkB;4BAClB,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gCACxC,UAAU,CAAC,cAAc,EAAE,CAAC,gBAAgB,CAAC,CAAC;gCAC9C,MAAM,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;4BACjC,CAAC;4BACD,OAAO,CAAC,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC,CAAC;wBAC7B,CAAC;wBAAC,OAAO,KAAU,EAAE,CAAC;4BAClB,MAAM,SAAS,GAAG,KAAK,YAAY,KAAK;gCACpC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE;gCAChB,CAAC,CAAC,EAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAC,CAAC;4BAC/B,OAAO,CAAC,EAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAC,CAAC,CAAC;wBAChD,CAAC;oBACL,CAAC,CAAC,CAAC;gBACP,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC,CAAC,EACF,IAAI,EACJ,mBAAmB,CACtB,CAAC,KAAK,CAAC,CAAC,KAAK,EAAkC,EAAE,CAAC,CAAC;YAChD,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,EAAC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,mBAAmB,EAAC;SACzD,CAAC,CAAC,CAAC;IACR,CAAC;CACJ"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { GGCounterKey, GGGaugeKey, GGHistogramKey } from "@grest-ts/metrics";
|
|
2
|
+
import { EXISTS, FORBIDDEN, NOT_AUTHORIZED, NOT_FOUND, OK, ROUTE_NOT_FOUND, SERVER_ERROR, VALIDATION_ERROR } from "@grest-ts/schema";
|
|
3
|
+
/**
|
|
4
|
+
* Result type for WebSocket operations.
|
|
5
|
+
* Known types listed for documentation, but accepts any string for custom error types.
|
|
6
|
+
*/
|
|
7
|
+
type ResultType = typeof OK.TYPE | typeof VALIDATION_ERROR.TYPE | typeof NOT_AUTHORIZED.TYPE | typeof FORBIDDEN.TYPE | typeof NOT_FOUND.TYPE | typeof ROUTE_NOT_FOUND.TYPE | typeof EXISTS.TYPE | typeof SERVER_ERROR.TYPE | string;
|
|
8
|
+
type SocketConnectionResult = 'OK' | 'AUTH_FAILED' | 'QUERY_INVALID' | string;
|
|
9
|
+
export declare const GGWebSocketMetrics: import("@grest-ts/metrics").GGMetricsDefinition<{
|
|
10
|
+
connectionsActive: GGGaugeKey<{
|
|
11
|
+
api: string;
|
|
12
|
+
path: string;
|
|
13
|
+
}>;
|
|
14
|
+
connections: GGCounterKey<{
|
|
15
|
+
api: string;
|
|
16
|
+
path: string;
|
|
17
|
+
result: SocketConnectionResult;
|
|
18
|
+
}>;
|
|
19
|
+
requests: GGCounterKey<{
|
|
20
|
+
api: string;
|
|
21
|
+
path: string;
|
|
22
|
+
method: string;
|
|
23
|
+
result: ResultType;
|
|
24
|
+
}>;
|
|
25
|
+
requestDuration: GGHistogramKey<{
|
|
26
|
+
api: string;
|
|
27
|
+
path: string;
|
|
28
|
+
method: string;
|
|
29
|
+
}>;
|
|
30
|
+
outRequests: GGCounterKey<{
|
|
31
|
+
api: string;
|
|
32
|
+
path: string;
|
|
33
|
+
method: string;
|
|
34
|
+
result: ResultType;
|
|
35
|
+
}>;
|
|
36
|
+
outRequestDuration: GGHistogramKey<{
|
|
37
|
+
api: string;
|
|
38
|
+
path: string;
|
|
39
|
+
method: string;
|
|
40
|
+
}>;
|
|
41
|
+
}>;
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=GGWebSocketMetrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGWebSocketMetrics.d.ts","sourceRoot":"","sources":["../../../src/server/GGWebSocketMetrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAE,UAAU,EAAE,cAAc,EAAY,MAAM,mBAAmB,CAAC;AACtF,OAAO,EAAC,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,EAAE,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAC,MAAM,kBAAkB,CAAC;AAEnI;;;GAGG;AACH,KAAK,UAAU,GACT,OAAO,EAAE,CAAC,IAAI,GACd,OAAO,gBAAgB,CAAC,IAAI,GAC5B,OAAO,cAAc,CAAC,IAAI,GAC1B,OAAO,SAAS,CAAC,IAAI,GACrB,OAAO,SAAS,CAAC,IAAI,GACrB,OAAO,eAAe,CAAC,IAAI,GAC3B,OAAO,MAAM,CAAC,IAAI,GAClB,OAAO,YAAY,CAAC,IAAI,GACxB,MAAM,CAAC;AAEb,KAAK,sBAAsB,GAAG,IAAI,GAAG,aAAa,GAAG,eAAe,GAAG,MAAM,CAAC;AAE9E,eAAO,MAAM,kBAAkB;;aACc,MAAM;cAAQ,MAAM;;;aAKxB,MAAM;cAAQ,MAAM;gBAAU,sBAAsB;;;aAOvD,MAAM;cAAQ,MAAM;gBAAU,MAAM;gBAAU,UAAU;;;aAK/C,MAAM;cAAQ,MAAM;gBAAU,MAAM;;;aAQ1C,MAAM;cAAQ,MAAM;gBAAU,MAAM;gBAAU,UAAU;;;aAK/C,MAAM;cAAQ,MAAM;gBAAU,MAAM;;EAMnF,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { GGCounterKey, GGGaugeKey, GGHistogramKey, GGMetrics } from "@grest-ts/metrics";
|
|
2
|
+
export const GGWebSocketMetrics = GGMetrics.define('/websocket/', () => ({
|
|
3
|
+
connectionsActive: new GGGaugeKey('connections_active', {
|
|
4
|
+
help: 'Active WebSocket connections',
|
|
5
|
+
labelNames: ['api', 'path'],
|
|
6
|
+
groupBy: { labels: ["api"] }
|
|
7
|
+
}),
|
|
8
|
+
connections: new GGCounterKey('connections_total', {
|
|
9
|
+
help: 'Total WebSocket connection attempts',
|
|
10
|
+
labelNames: ['api', 'path', 'result'],
|
|
11
|
+
groupBy: { labels: ["api"] }
|
|
12
|
+
}),
|
|
13
|
+
// Incoming (server handling REQ + MSG)
|
|
14
|
+
requests: new GGCounterKey('requests_total', {
|
|
15
|
+
help: 'Total incoming WebSocket commands (REQ + MSG)',
|
|
16
|
+
labelNames: ['api', 'path', 'method', 'result'],
|
|
17
|
+
groupBy: { labels: ["api", "method"], template: "{api}.{method}" }
|
|
18
|
+
}),
|
|
19
|
+
requestDuration: new GGHistogramKey('request_duration_ms', {
|
|
20
|
+
help: 'Incoming WebSocket command processing duration in milliseconds',
|
|
21
|
+
labelNames: ['api', 'path', 'method'],
|
|
22
|
+
buckets: [1, 5, 10, 25, 50, 100, 250, 500, 1000],
|
|
23
|
+
groupBy: { labels: ["api", "method"], template: "{api}.{method}" }
|
|
24
|
+
}),
|
|
25
|
+
// Outgoing (client calls via socket)
|
|
26
|
+
outRequests: new GGCounterKey('out_requests_total', {
|
|
27
|
+
help: 'Total outgoing WebSocket commands (REQ + MSG)',
|
|
28
|
+
labelNames: ['api', 'path', 'method', 'result'],
|
|
29
|
+
groupBy: { labels: ["api", "method"], template: "{api}.{method}" }
|
|
30
|
+
}),
|
|
31
|
+
outRequestDuration: new GGHistogramKey('out_request_duration_ms', {
|
|
32
|
+
help: 'Outgoing WebSocket request round-trip duration in milliseconds (REQ only)',
|
|
33
|
+
labelNames: ['api', 'path', 'method'],
|
|
34
|
+
buckets: [1, 5, 10, 25, 50, 100, 250, 500, 1000, 2500],
|
|
35
|
+
groupBy: { labels: ["api", "method"], template: "{api}.{method}" }
|
|
36
|
+
}),
|
|
37
|
+
}));
|
|
38
|
+
//# sourceMappingURL=GGWebSocketMetrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGWebSocketMetrics.js","sourceRoot":"","sources":["../../../src/server/GGWebSocketMetrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAoBtF,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;IACrE,iBAAiB,EAAE,IAAI,UAAU,CAAgC,oBAAoB,EAAE;QACnF,IAAI,EAAE,8BAA8B;QACpC,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;QAC3B,OAAO,EAAE,EAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAC;KAC7B,CAAC;IACF,WAAW,EAAE,IAAI,YAAY,CAAgE,mBAAmB,EAAE;QAC9G,IAAI,EAAE,qCAAqC;QAC3C,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC;QACrC,OAAO,EAAE,EAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAC;KAC7B,CAAC;IAEF,uCAAuC;IACvC,QAAQ,EAAE,IAAI,YAAY,CAAoE,gBAAgB,EAAE;QAC5G,IAAI,EAAE,+CAA+C;QACrD,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC;QAC/C,OAAO,EAAE,EAAC,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAC;KACnE,CAAC;IACF,eAAe,EAAE,IAAI,cAAc,CAAgD,qBAAqB,EAAE;QACtG,IAAI,EAAE,gEAAgE;QACtE,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC;QACrC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC;QAChD,OAAO,EAAE,EAAC,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAC;KACnE,CAAC;IAEF,qCAAqC;IACrC,WAAW,EAAE,IAAI,YAAY,CAAoE,oBAAoB,EAAE;QACnH,IAAI,EAAE,+CAA+C;QACrD,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC;QAC/C,OAAO,EAAE,EAAC,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAC;KACnE,CAAC;IACF,kBAAkB,EAAE,IAAI,cAAc,CAAgD,yBAAyB,EAAE;QAC7G,IAAI,EAAE,2EAA2E;QACjF,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC;QACrC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC;QACtD,OAAO,EAAE,EAAC,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAC;KACnE,CAAC;CACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server extension for WebSocketSchema - adds startServer and register methods
|
|
3
|
+
* This file should only be imported in server (Node.js) context
|
|
4
|
+
*/
|
|
5
|
+
import { GGWebSocketMiddleware } from "../schema/GGWebSocketMiddleware";
|
|
6
|
+
import { GGSocketServer } from "./GGSocketServer";
|
|
7
|
+
import { WebSocketIncoming, WebSocketOutgoing } from "../socket/WebSocketTypes";
|
|
8
|
+
import { GGHttpServer } from "@grest-ts/http";
|
|
9
|
+
export interface WebSocketSchemaConfig {
|
|
10
|
+
/**
|
|
11
|
+
* The HTTP server adapter to attach the WebSocket server to.
|
|
12
|
+
* If not provided, will look up from locator.
|
|
13
|
+
*/
|
|
14
|
+
http?: GGHttpServer;
|
|
15
|
+
/**
|
|
16
|
+
* Additional middlewares to apply to all connections.
|
|
17
|
+
*/
|
|
18
|
+
middlewares?: GGWebSocketMiddleware[];
|
|
19
|
+
}
|
|
20
|
+
declare module "../schema/GGWebSocketSchema" {
|
|
21
|
+
interface GGWebSocketSchema<TClientToServer, TServerToClient, TContext = {}, TQuery = undefined, TClientToServerImpl = TClientToServer> {
|
|
22
|
+
/**
|
|
23
|
+
* Start the WebSocket server for this API.
|
|
24
|
+
*/
|
|
25
|
+
startServer(onConnection: (incoming: WebSocketIncoming<TClientToServerImpl>, outgoing: WebSocketOutgoing<TServerToClient>) => void, config: WebSocketSchemaConfig): GGSocketServer<TContext, TQuery>;
|
|
26
|
+
/**
|
|
27
|
+
* Register this WebSocket API with the default HTTP server.
|
|
28
|
+
* Uses GGHttpServerAdapter from locator if not explicitly provided.
|
|
29
|
+
*/
|
|
30
|
+
register(onConnection: (incoming: WebSocketIncoming<TClientToServerImpl>, outgoing: WebSocketOutgoing<TServerToClient>) => void, config?: WebSocketSchemaConfig): void;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=GGWebSocketSchema.startServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGWebSocketSchema.startServer.d.ts","sourceRoot":"","sources":["../../../src/server/GGWebSocketSchema.startServer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAC,qBAAqB,EAAC,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAC,iBAAiB,EAAE,iBAAiB,EAAC,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAiB,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAE5D,MAAM,WAAW,qBAAqB;IAClC;;;OAGG;IACH,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB;;OAEG;IACH,WAAW,CAAC,EAAE,qBAAqB,EAAE,CAAC;CACzC;AAED,OAAO,QAAQ,6BAA6B,CAAC;IACzC,UAAU,iBAAiB,CAAC,eAAe,EAAE,eAAe,EAAE,QAAQ,GAAG,EAAE,EAAE,MAAM,GAAG,SAAS,EAAE,mBAAmB,GAAG,eAAe;QAClI;;WAEG;QACH,WAAW,CACP,YAAY,EAAE,CAAC,QAAQ,EAAE,iBAAiB,CAAC,mBAAmB,CAAC,EAAE,QAAQ,EAAE,iBAAiB,CAAC,eAAe,CAAC,KAAK,IAAI,EACtH,MAAM,EAAE,qBAAqB,GAC9B,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QAEnC;;;WAGG;QACH,QAAQ,CACJ,YAAY,EAAE,CAAC,QAAQ,EAAE,iBAAiB,CAAC,mBAAmB,CAAC,EAAE,QAAQ,EAAE,iBAAiB,CAAC,eAAe,CAAC,KAAK,IAAI,EACtH,MAAM,CAAC,EAAE,qBAAqB,GAC/B,IAAI,CAAA;KACV;CACJ"}
|