Home Reference Source Repository

src/createServiceClient.js

let create_wrapper_function;
if (typeof fetch == "function") {
        create_wrapper_function = url => service_function => async (..._arguments) => {
        const response = await fetch(url, {
            method: "POST",
            body: JSON.stringify({
                service_function,
                arguments: _arguments
            })
        });
        if (response.status != 200) {
            try {
                return await response.json();
            } finally {
                console.warn("Response is not parsable as JSON but server sent HTTP status 200");
            }
        } else {
            switch (response.status) {
                case 400:
                case 405:
                case 406:
                    throw new Error("Internal protocol error: HTTP status " + response.status);
                case 502:
                    throw new Error(await response.text());
            }
        }
        throw new Error("Unknown error");
    };
} else if (typeof require == "function") {
    const http2 = require("http2");
    if (http2) {
        create_wrapper_function = url => service_function => (..._arguments) => {
            return new Promise((resolve, reject) => {
                try {
                    const client = http2.connect(url, {});
                    client.on("error", error => {
                        reject(error);
                    });
                    const request = client.request({
                        ":method": "POST"
                    });
                    request.on("response", headers => {
                        if (headers[":status"] != 200) {
                            reject(new Error("Response status " + headers[":status"]));
                        }
                    });
                    {
                        let data = "";
                        request.on("data", chunk => {
                            data += chunk;
                        });
                        request.on("end", () => {
                            try {
                                const value = JSON.parse(data);
                                resolve(value);
                            } catch (error) {
                                console.warn("Response is not parsable as JSON but server sent HTTP status 200");
                                reject(new Error("Internal protocol error"));
                            } finally {
                                try {
                                    client.close();
                                } catch (error) {
                                    console.error(error);
                                }
                            }
                        });
                    }
                    request.write(JSON.stringify({
                        service_function,
                        arguments: _arguments
                    }));
                    request.end();
                } catch (error) {
                    reject(error);
                }
            });
        };
    }
}

export default url => {
    const wrapper_function = create_wrapper_function(url);
    return new Proxy({
    }, {
        get(target, name) {
            console.log("get", name);
            return wrapper_function(name);
        }
    });
};