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);
}
});
};