UNPKG

2.57 kBPlain TextView Raw
1import {
2 INewControllerDataParams, IRemoteClient, IRemoteClientMessage,
3 IRemoteErrorParams, IRemoteNewPageParams, IRemoteServer, IRemoteServerMessage, RemoteMessageType,
4} from "neweb-core";
5import { IServerRequest } from "neweb-server";
6import SocketIO = require("socket.io");
7
8export interface ISocketIOServerConfig {
9 socket: IRemoteSocketClient;
10 seanceId: string;
11}
12export 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}
17class 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}
66export default SocketIOClient;