1 | import {
|
2 | INewControllerDataParams, IRemoteClient, IRemoteClientMessage,
|
3 | IRemoteErrorParams, IRemoteNewPageParams, IRemoteServer, IRemoteServerMessage, RemoteMessageType,
|
4 | } from "neweb-core";
|
5 | import { IServerRequest } from "neweb-server";
|
6 | import SocketIO = require("socket.io");
|
7 |
|
8 | export interface ISocketIOServerConfig {
|
9 | socket: IRemoteSocketClient;
|
10 | seanceId: string;
|
11 | }
|
12 | export interface IRemoteSocketClient extends SocketIO.Socket {
|
13 | on(event: "disconnect" | "error", cb: () => void): this;
|
14 | on<P extends keyof IRemoteServerMessage>(eventName: P, cb: (params: IRemoteServerMessage[P]) => void):
|
15 | this;
|
16 | }
|
17 | class SocketIOClient implements IRemoteClient {
|
18 | protected server: IRemoteServer;
|
19 | constructor(protected config: ISocketIOServerConfig) {
|
20 | this.config.socket.on("disconnect", this.dispose);
|
21 | this.config.socket.on("error", this.dispose);
|
22 | this.config.socket.on(RemoteMessageType.FrameControllerDispatch, (params) => {
|
23 | this.server.dispatchControllerAction({
|
24 | actionName: params.actionName,
|
25 | args: params.args,
|
26 | controllerId: params.frameId,
|
27 | });
|
28 | });
|
29 | this.config.socket.on(RemoteMessageType.Navigate, (params) => {
|
30 | this.server.navigate(params);
|
31 | });
|
32 | }
|
33 | public async getRequest(): Promise<IServerRequest> {
|
34 | const socket = this.config.socket;
|
35 | return {
|
36 | url: socket.request.url,
|
37 | headers: socket.request.headers,
|
38 | sessionId: socket.request.session.id,
|
39 | };
|
40 | }
|
41 | public connectTo(server: IRemoteServer) {
|
42 | this.server = server;
|
43 | }
|
44 | public newPage(params: IRemoteNewPageParams) {
|
45 | return this.emit(RemoteMessageType.NewPage, params);
|
46 | }
|
47 | public newControllerData(params: INewControllerDataParams) {
|
48 | return this.emit(RemoteMessageType.FrameControllerData, {
|
49 | frameId: params.controllerId,
|
50 | fieldName: params.fieldName,
|
51 | value: params.value,
|
52 | });
|
53 | }
|
54 | public error(params: IRemoteErrorParams) {
|
55 | return this.emit(RemoteMessageType.Error, params);
|
56 | }
|
57 | public async emit<P extends keyof IRemoteClientMessage>(event: P, params: IRemoteClientMessage[P]) {
|
58 | await new Promise((resolve) => {
|
59 | this.config.socket.send(event, params, resolve);
|
60 | });
|
61 | }
|
62 | public dispose = () => {
|
63 | this.config.socket.removeAllListeners();
|
64 | }
|
65 | }
|
66 | export default SocketIOClient;
|