@aptpod/iscp-ts
Version:
iSCP 2.0 client library for TypeScript
105 lines • 5.08 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 _StreamReader_reader, _StreamReader_readableStreamController, _StreamReader_readableStreamReader;
Object.defineProperty(exports, "__esModule", { value: true });
exports.StreamReader = void 0;
const web_streams_polyfill_1 = require("web-streams-polyfill");
const exceptions_1 = require("../../exceptions");
const message_decoder_1 = require("../../internal/message-decoder");
class StreamReader {
constructor(config) {
_StreamReader_reader.set(this, void 0);
_StreamReader_readableStreamController.set(this, void 0);
_StreamReader_readableStreamReader.set(this, void 0);
__classPrivateFieldSet(this, _StreamReader_reader, config.reader, "f");
__classPrivateFieldSet(this, _StreamReader_readableStreamController, null, "f");
__classPrivateFieldSet(this, _StreamReader_readableStreamReader, new web_streams_polyfill_1.ReadableStreamDefaultReader(new web_streams_polyfill_1.ReadableStream({
start: (controller) => {
__classPrivateFieldSet(this, _StreamReader_readableStreamController, controller, "f");
},
})), "f");
const messageDecoder = new message_decoder_1.MessageDecoder({
onMessage: (message) => {
__classPrivateFieldGet(this, _StreamReader_readableStreamController, "f")?.enqueue(message);
},
});
listenStream({
streamReader: __classPrivateFieldGet(this, _StreamReader_reader, "f"),
onRead(data) {
messageDecoder.appendData(data);
},
});
}
async dispose() {
__classPrivateFieldGet(this, _StreamReader_readableStreamController, "f")?.close();
await __classPrivateFieldGet(this, _StreamReader_readableStreamReader, "f").cancel();
await __classPrivateFieldGet(this, _StreamReader_reader, "f").cancel();
}
async read() {
const result = await __classPrivateFieldGet(this, _StreamReader_readableStreamReader, "f").read();
if (result.done) {
const errorMessage = 'streamReader closed.';
throw new exceptions_1.ISCPTransportClosedError(errorMessage);
}
return result.value;
}
}
exports.StreamReader = StreamReader;
_StreamReader_reader = new WeakMap(), _StreamReader_readableStreamController = new WeakMap(), _StreamReader_readableStreamReader = new WeakMap();
//
// Static Function
//
const listenStream = (params) => {
return new Promise((resolve, reject) => {
const { streamReader, onRead } = params;
const readerMap = new Map();
(async () => {
try {
for (let i = 0;; i++) {
const { value: readableStream, done: doneStream } = await streamReader.read();
if (doneStream) {
break;
}
const reader = readableStream.getReader();
readerMap.set(i, reader);
(async (j, r, m) => {
for (;;) {
const { value, done } = await r.read();
if (done) {
m.delete(j);
break;
}
onRead(value);
}
})(i, reader, readerMap);
}
const listeningReaders = [...readerMap.values()];
for (const reader of listeningReaders) {
await reader.cancel();
}
if (readerMap.size !== 0) {
reject(new Error('could not cleanup readerMap'));
return;
}
resolve();
}
catch (error) {
reject(error);
}
finally {
readerMap.clear();
}
})();
});
};
//# sourceMappingURL=stream-reader.js.map