переписать существующий веб-сокет для использования с машинописью - PullRequest
0 голосов
/ 01 апреля 2019

возникли проблемы с преобразованием существующего ws в машинопись из javascript. Не могу понять, что является типом возвращаемого значения асинхронных функций socketHost и почему я не могу получить к ним доступ через ключевое слово "this"

вот код:

const config = {
    production: {
        socketHost: 'wss://someName.com/ws',
    },
    development: {
        socketHost: 'ws://localhost:5555',
    },
};
module.exports = config[process.env.NODE_ENV || 'production'];

ошибка:

Cannot compile namespaces when the '--isolatedModules' flag is provided.

socket.ts

import { socketHost } from 'config';

function connect():Promise<WebSocket {
return new Promise(
    (resolve, reject): Promise<void> => {
        const src = socketHost;
        const ws = new WebSocket(src);
        ws.onopen = () => {
            ws.onmessage = () => resolve(ws);
        };
        ws.onerror = err => {
            return reject(err);
        };
    },
);
}


class SocketService {
public constructor() {
    if (!SocketService.instance) {
        SocketService.instance = this;
    }
    this.reconnectionCount = 0;
    return SocketService.instance;
}

public unsubscribe(model, data, socket = this.socket): void {
    if (socket && socket.readyState === 1) {
        socket.send(JSON.stringify(['leave', model, data]));
    } else {
        processError('unsubscribe failed');
    }
}

public async initSocket() {
    if (this.socket && this.socket.readyState === 1) {
        return this.socket;
    }
    try {
        const socket = await connect();
        this.reconnectionCount = 0;
        this.socket = socket;
        return socket;
    } catch (error) {
        console.log('error', error);

        processError(`initSocket => ${error}`, this.reconnectionCount);
        if (this.reconnectionCount < 60) {
            setTimeout(() => {
                this.initSocket();
                this.reconnectionCount = this.reconnectionCount + 1;
            }, 1000);
        } else {
            console.info('await connection 10s');
            setTimeout(() => {
                this.initSocket();
            }, 10000);
        }
        this.socket = null;
    }
    return null;
}

public async init() {
    const ws = await this.initSocket();
    if (!ws) return;
    // const chainOrder = this.getChain(order);

    ws.onmessage = ({ data: message }) => {
        if (message) {
            console.log('message', message);

            const data = JSON.parse(message);
            resolver(data);
        }
    };

    ws.onerror = error => {
        processError('subscribeFull err', error);
    };

    ws.onclose = ({ wasClean, code, reason }): void => {
        if (wasClean) {
            console.warn('socket closed clear');
        } else {
            processError('socket closed unexpected');
            this.reconnectSocket();
        }
        console.info(`Code: ${code} reason: ${reason}`);
    };
    this.subscribe();
}

public async subscribe(): Promise<void> {
    const { socket } = this;
    try {
        if (socket.readyState === 1) {
            await socket.send(JSON.stringify('init'));
        }
    } catch (error) {
        console.log('subscribe', error);
    }
}

public async closeSocket(): Promise<void> {
    if (this.socket) {
        await this.socket.close();
    }
    this.reconnectionCount = 0;
}

public async reconnectSocket(): Promise<void> {
    await this.closeSocket();
    await this.initSocket();
    await this.subscribe();
}
}

ошибки

"File: config/index.ts is not a module.",

В этот момент я переписал все приложение, и я ударился о стену и просто не понимаю, как переписать эту часть, даже после просмотра документов в течение 3 часов.

любая помощь будет принята с благодарностью

...