@aptpod/iscp-ts
Version:
iSCP 2.0 client library for TypeScript
115 lines • 6.55 kB
JavaScript
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 _WebSocketWeb_url, _WebSocketWeb_negotiationParams, _WebSocketWeb_ws, _WebSocketWeb_streamReader, _WebSocketWeb_streamWriter, _WebSocketWeb_connectResultResolver, _WebSocketWeb_closed;
import { TransformStream } from 'web-streams-polyfill';
import { Resolver } from '../../utils/resolver';
import { ISCPTransportClosedError, ISCPUnexpectedError } from '../../exceptions/exceptions';
import { TRANSPORT_NAME } from '../transport';
class WebSocketWeb {
constructor(config) {
_WebSocketWeb_url.set(this, void 0);
_WebSocketWeb_negotiationParams.set(this, void 0);
_WebSocketWeb_ws.set(this, void 0);
_WebSocketWeb_streamReader.set(this, void 0);
_WebSocketWeb_streamWriter.set(this, void 0);
_WebSocketWeb_connectResultResolver.set(this, void 0);
_WebSocketWeb_closed.set(this, void 0);
__classPrivateFieldSet(this, _WebSocketWeb_url, config.url, "f");
__classPrivateFieldSet(this, _WebSocketWeb_negotiationParams, config.negotiationParams, "f");
__classPrivateFieldSet(this, _WebSocketWeb_ws, null, "f");
const transformStream = new TransformStream();
__classPrivateFieldSet(this, _WebSocketWeb_streamReader, transformStream.readable.getReader(), "f");
__classPrivateFieldSet(this, _WebSocketWeb_streamWriter, transformStream.writable.getWriter(), "f");
__classPrivateFieldSet(this, _WebSocketWeb_closed, true, "f");
__classPrivateFieldSet(this, _WebSocketWeb_connectResultResolver, new Resolver(), "f");
}
async write(message) {
if (__classPrivateFieldGet(this, _WebSocketWeb_closed, "f")) {
const errorMessage = 'WebSocket closed.';
throw new ISCPTransportClosedError(errorMessage);
}
try {
__classPrivateFieldGet(this, _WebSocketWeb_ws, "f")?.send(message);
}
catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
throw new ISCPTransportClosedError(errorMessage);
}
}
async read() {
if (__classPrivateFieldGet(this, _WebSocketWeb_closed, "f")) {
const errorMessage = 'WebSocket closed.';
throw new ISCPTransportClosedError(errorMessage);
}
const result = await __classPrivateFieldGet(this, _WebSocketWeb_streamReader, "f").read();
if (result.done) {
const errorMessage = 'WebSocket closed.';
throw new ISCPTransportClosedError(errorMessage);
}
return result.value;
}
async open() {
const queryString = __classPrivateFieldGet(this, _WebSocketWeb_negotiationParams, "f").encodeURLValues();
const url = `${__classPrivateFieldGet(this, _WebSocketWeb_url, "f")}?${queryString}`;
__classPrivateFieldSet(this, _WebSocketWeb_ws, new WebSocket(url), "f");
__classPrivateFieldGet(this, _WebSocketWeb_ws, "f").binaryType = 'arraybuffer';
__classPrivateFieldGet(this, _WebSocketWeb_ws, "f").onopen = () => {
__classPrivateFieldGet(this, _WebSocketWeb_connectResultResolver, "f").resolve({
success: true,
});
};
__classPrivateFieldGet(this, _WebSocketWeb_ws, "f").onerror = () => {
__classPrivateFieldGet(this, _WebSocketWeb_connectResultResolver, "f").resolve({
success: false,
reason: 'Check for details in the console.',
});
};
__classPrivateFieldGet(this, _WebSocketWeb_ws, "f").onmessage = (message) => {
if (!(message.data instanceof ArrayBuffer)) {
throw new ISCPUnexpectedError('message type is not ArrayBuffer.');
}
__classPrivateFieldGet(this, _WebSocketWeb_streamWriter, "f").write(new Uint8Array(message.data));
};
const connectResult = await __classPrivateFieldGet(this, _WebSocketWeb_connectResultResolver, "f").wait();
if (!connectResult.success) {
throw new ISCPUnexpectedError(`Failed to connect WebSocket. reason=[${connectResult.reason}]`);
}
__classPrivateFieldSet(this, _WebSocketWeb_closed, false, "f");
}
async close() {
if (__classPrivateFieldGet(this, _WebSocketWeb_closed, "f")) {
return;
}
__classPrivateFieldSet(this, _WebSocketWeb_closed, true, "f");
__classPrivateFieldGet(this, _WebSocketWeb_ws, "f")?.close();
__classPrivateFieldSet(this, _WebSocketWeb_ws, null, "f");
await __classPrivateFieldGet(this, _WebSocketWeb_streamWriter, "f").close();
await __classPrivateFieldGet(this, _WebSocketWeb_streamReader, "f").cancel();
}
get negotiationParams() {
return this.negotiationParams;
}
get address() {
return new URL(__classPrivateFieldGet(this, _WebSocketWeb_url, "f")).host;
}
// eslint-disable-next-line class-methods-use-this
get name() {
return TRANSPORT_NAME.WEBSOCKET;
}
}
_WebSocketWeb_url = new WeakMap(), _WebSocketWeb_negotiationParams = new WeakMap(), _WebSocketWeb_ws = new WeakMap(), _WebSocketWeb_streamReader = new WeakMap(), _WebSocketWeb_streamWriter = new WeakMap(), _WebSocketWeb_connectResultResolver = new WeakMap(), _WebSocketWeb_closed = new WeakMap();
export const createWebSocket = async (config) => {
const ws = new WebSocketWeb(config);
await ws.open();
return ws;
};
//# sourceMappingURL=websocket-web.js.map