UNPKG

@azure/core-sse

Version:

Implementation of the Server-sent events protocol for Node.js and browsers.

90 lines 2.81 kB
// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. import { __asyncGenerator, __await } from "tslib"; export function createStream(asyncIter, cancel) { const stream = iteratorToStream(asyncIter, cancel); /** TODO: remove these polyfills once all supported runtimes support them */ return polyfillStream(stream, cancel); } function polyfillStream(stream, dispose) { makeAsyncIterable(stream); makeAsyncDisposable(stream, dispose); return stream; } function makeAsyncDisposable(webStream, dispose) { var _a; (_a = Symbol.asyncDispose) !== null && _a !== void 0 ? _a : (Symbol.asyncDispose = Symbol("Symbol.asyncDispose")); if (!webStream[Symbol.asyncDispose]) { webStream[Symbol.asyncDispose] = () => dispose(); } } function makeAsyncIterable(webStream) { if (!webStream[Symbol.asyncIterator]) { webStream[Symbol.asyncIterator] = () => toAsyncIterable(webStream); } if (!webStream.values) { webStream.values = () => toAsyncIterable(webStream); } } function iteratorToStream(iterator, cancel) { return new ReadableStream({ async pull(controller) { const { value, done } = await iterator.next(); if (done) { controller.close(); } else { controller.enqueue(value); } }, cancel, }); } export function ensureAsyncIterable(stream) { if (isReadableStream(stream)) { makeAsyncIterable(stream); return { cancel: () => stream.cancel(), iterable: stream, }; } else { return { cancel: async () => { // socket could be null if the connection is already closed if ("socket" in stream && stream.socket) { stream.socket.end(); } else { stream.destroy(); } }, iterable: stream, }; } } function isReadableStream(body) { return Boolean(body && typeof body.getReader === "function" && typeof body.tee === "function"); } function toAsyncIterable(stream) { return __asyncGenerator(this, arguments, function* toAsyncIterable_1() { const reader = stream.getReader(); try { while (true) { const { value, done } = yield __await(reader.read()); if (done) { return yield __await(void 0); } yield yield __await(value); } } finally { const cancelPromise = reader.cancel(); reader.releaseLock(); yield __await(cancelPromise); } }); } //# sourceMappingURL=utils.js.map