@aptpod/iscp-ts
Version:
iSCP 2.0 client library for TypeScript
131 lines • 7.52 kB
JavaScript
"use strict";
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
if (kind === "m") throw new TypeError("Private method is not writable");
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
};
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var _WebSocketNode_url, _WebSocketNode_negotiationParams, _WebSocketNode_agent, _WebSocketNode_ws, _WebSocketNode_streamReader, _WebSocketNode_streamWriter, _WebSocketNode_connectResultResolver, _WebSocketNode_closed;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createWebSocket = void 0;
const web_streams_polyfill_1 = require("web-streams-polyfill");
const ws_1 = require("ws");
const https_proxy_agent_1 = require("https-proxy-agent");
const proxy_from_env_1 = require("proxy-from-env");
const resolver_1 = require("../../utils/resolver");
const exceptions_1 = require("../../exceptions/exceptions");
const transport_1 = require("../transport");
class WebSocketNode {
constructor(config) {
_WebSocketNode_url.set(this, void 0);
_WebSocketNode_negotiationParams.set(this, void 0);
_WebSocketNode_agent.set(this, void 0);
_WebSocketNode_ws.set(this, void 0);
_WebSocketNode_streamReader.set(this, void 0);
_WebSocketNode_streamWriter.set(this, void 0);
_WebSocketNode_connectResultResolver.set(this, void 0);
_WebSocketNode_closed.set(this, void 0);
__classPrivateFieldSet(this, _WebSocketNode_url, config.url, "f");
__classPrivateFieldSet(this, _WebSocketNode_negotiationParams, config.negotiationParams, "f");
__classPrivateFieldSet(this, _WebSocketNode_agent, config.agent, "f");
__classPrivateFieldSet(this, _WebSocketNode_ws, null, "f");
const transformStream = new web_streams_polyfill_1.TransformStream();
__classPrivateFieldSet(this, _WebSocketNode_streamReader, transformStream.readable.getReader(), "f");
__classPrivateFieldSet(this, _WebSocketNode_streamWriter, transformStream.writable.getWriter(), "f");
__classPrivateFieldSet(this, _WebSocketNode_closed, true, "f");
__classPrivateFieldSet(this, _WebSocketNode_connectResultResolver, new resolver_1.Resolver(), "f");
}
async write(message) {
if (__classPrivateFieldGet(this, _WebSocketNode_closed, "f")) {
const errorMessage = 'WebSocket closed.';
throw new exceptions_1.ISCPTransportClosedError(errorMessage);
}
try {
__classPrivateFieldGet(this, _WebSocketNode_ws, "f")?.send(message);
}
catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
throw new exceptions_1.ISCPTransportClosedError(errorMessage);
}
}
async read() {
if (__classPrivateFieldGet(this, _WebSocketNode_closed, "f")) {
const errorMessage = 'WebSocket closed.';
throw new exceptions_1.ISCPTransportClosedError(errorMessage);
}
const result = await __classPrivateFieldGet(this, _WebSocketNode_streamReader, "f").read();
if (result.done) {
const errorMessage = 'WebSocket closed.';
throw new exceptions_1.ISCPTransportClosedError(errorMessage);
}
return result.value;
}
async open() {
const queryString = __classPrivateFieldGet(this, _WebSocketNode_negotiationParams, "f").encodeURLValues();
const url = `${__classPrivateFieldGet(this, _WebSocketNode_url, "f")}?${queryString}`;
__classPrivateFieldSet(this, _WebSocketNode_ws, new ws_1.WebSocket(url, {
agent: __classPrivateFieldGet(this, _WebSocketNode_agent, "f"),
}), "f");
__classPrivateFieldGet(this, _WebSocketNode_ws, "f").binaryType = 'arraybuffer';
__classPrivateFieldGet(this, _WebSocketNode_ws, "f").onopen = () => {
__classPrivateFieldGet(this, _WebSocketNode_connectResultResolver, "f").resolve({
success: true,
});
};
__classPrivateFieldGet(this, _WebSocketNode_ws, "f").onerror = (e) => {
__classPrivateFieldGet(this, _WebSocketNode_connectResultResolver, "f").resolve({
success: false,
reason: e.message,
});
};
__classPrivateFieldGet(this, _WebSocketNode_ws, "f").onmessage = (message) => {
if (!(message.data instanceof ArrayBuffer)) {
throw new exceptions_1.ISCPUnexpectedError('message type is not ArrayBuffer.');
}
__classPrivateFieldGet(this, _WebSocketNode_streamWriter, "f").write(new Uint8Array(message.data));
};
const connectResult = await __classPrivateFieldGet(this, _WebSocketNode_connectResultResolver, "f").wait();
if (!connectResult.success) {
throw new exceptions_1.ISCPUnexpectedError(`Failed to connect WebSocket. reason=[${connectResult.reason}]`);
}
__classPrivateFieldSet(this, _WebSocketNode_closed, false, "f");
}
async close() {
if (__classPrivateFieldGet(this, _WebSocketNode_closed, "f")) {
return;
}
__classPrivateFieldSet(this, _WebSocketNode_closed, true, "f");
__classPrivateFieldGet(this, _WebSocketNode_ws, "f")?.close();
__classPrivateFieldSet(this, _WebSocketNode_ws, null, "f");
await __classPrivateFieldGet(this, _WebSocketNode_streamWriter, "f").close();
await __classPrivateFieldGet(this, _WebSocketNode_streamReader, "f").cancel();
}
get negotiationParams() {
return this.negotiationParams;
}
get address() {
return new URL(__classPrivateFieldGet(this, _WebSocketNode_url, "f")).host;
}
// eslint-disable-next-line class-methods-use-this
get name() {
return transport_1.TRANSPORT_NAME.WEBSOCKET;
}
}
_WebSocketNode_url = new WeakMap(), _WebSocketNode_negotiationParams = new WeakMap(), _WebSocketNode_agent = new WeakMap(), _WebSocketNode_ws = new WeakMap(), _WebSocketNode_streamReader = new WeakMap(), _WebSocketNode_streamWriter = new WeakMap(), _WebSocketNode_connectResultResolver = new WeakMap(), _WebSocketNode_closed = new WeakMap();
const createProxyAgent = (url) => {
const proxyUrl = (0, proxy_from_env_1.getProxyForUrl)(url.replace(/^(ws)/, 'http'));
return proxyUrl === '' ? undefined : new https_proxy_agent_1.HttpsProxyAgent(proxyUrl);
};
const createWebSocket = async (config) => {
const agent = createProxyAgent(config.url);
const ws = new WebSocketNode({ ...config, agent });
await ws.open();
return ws;
};
exports.createWebSocket = createWebSocket;
//# sourceMappingURL=websocket-node.js.map