@trpc/server
Version:
1 lines • 7.26 kB
Source Map (JSON)
{"version":3,"file":"observable-DwUFSuKv.mjs","names":[],"sources":["../src/observable/observable.ts"],"sourcesContent":["import type { Result } from '../unstable-core-do-not-import';\nimport type {\n Observable,\n Observer,\n OperatorFunction,\n TeardownLogic,\n UnaryFunction,\n Unsubscribable,\n} from './types';\n\n/** @public */\nexport type inferObservableValue<TObservable> =\n TObservable extends Observable<infer TValue, unknown> ? TValue : never;\n\n/** @public */\nexport function isObservable(x: unknown): x is Observable<unknown, unknown> {\n return typeof x === 'object' && x !== null && 'subscribe' in x;\n}\n\n/** @public */\nexport function observable<TValue, TError = unknown>(\n subscribe: (observer: Observer<TValue, TError>) => TeardownLogic,\n): Observable<TValue, TError> {\n const self: Observable<TValue, TError> = {\n subscribe(observer) {\n let teardownRef: TeardownLogic | null = null;\n let isDone = false;\n let unsubscribed = false;\n let teardownImmediately = false;\n function unsubscribe() {\n if (teardownRef === null) {\n teardownImmediately = true;\n return;\n }\n if (unsubscribed) {\n return;\n }\n unsubscribed = true;\n\n if (typeof teardownRef === 'function') {\n teardownRef();\n } else if (teardownRef) {\n teardownRef.unsubscribe();\n }\n }\n teardownRef = subscribe({\n next(value) {\n if (isDone) {\n return;\n }\n observer.next?.(value);\n },\n error(err) {\n if (isDone) {\n return;\n }\n isDone = true;\n observer.error?.(err);\n unsubscribe();\n },\n complete() {\n if (isDone) {\n return;\n }\n isDone = true;\n observer.complete?.();\n unsubscribe();\n },\n });\n if (teardownImmediately) {\n unsubscribe();\n }\n return {\n unsubscribe,\n };\n },\n pipe(\n ...operations: OperatorFunction<any, any, any, any>[]\n ): Observable<any, any> {\n return operations.reduce(pipeReducer, self);\n },\n };\n return self;\n}\n\nfunction pipeReducer(prev: any, fn: UnaryFunction<any, any>) {\n return fn(prev);\n}\n\n/** @internal */\nexport function observableToPromise<TValue>(\n observable: Observable<TValue, unknown>,\n) {\n const ac = new AbortController();\n const promise = new Promise<TValue>((resolve, reject) => {\n let isDone = false;\n function onDone() {\n if (isDone) {\n return;\n }\n isDone = true;\n obs$.unsubscribe();\n }\n ac.signal.addEventListener('abort', () => {\n reject(ac.signal.reason);\n });\n const obs$ = observable.subscribe({\n next(data) {\n isDone = true;\n resolve(data);\n onDone();\n },\n error(data) {\n reject(data);\n },\n complete() {\n ac.abort();\n onDone();\n },\n });\n });\n return promise;\n}\n\n/**\n * @internal\n */\nfunction observableToReadableStream<TValue>(\n observable: Observable<TValue, unknown>,\n signal: AbortSignal,\n): ReadableStream<Result<TValue>> {\n let unsub: Unsubscribable | null = null;\n\n const onAbort = () => {\n unsub?.unsubscribe();\n unsub = null;\n signal.removeEventListener('abort', onAbort);\n };\n\n return new ReadableStream<Result<TValue>>({\n start(controller) {\n unsub = observable.subscribe({\n next(data) {\n controller.enqueue({ ok: true, value: data });\n },\n error(error) {\n controller.enqueue({ ok: false, error });\n controller.close();\n },\n complete() {\n controller.close();\n },\n });\n\n if (signal.aborted) {\n onAbort();\n } else {\n signal.addEventListener('abort', onAbort, { once: true });\n }\n },\n cancel() {\n onAbort();\n },\n });\n}\n\n/** @internal */\nexport function observableToAsyncIterable<TValue>(\n observable: Observable<TValue, unknown>,\n signal: AbortSignal,\n): AsyncIterable<TValue> {\n const stream = observableToReadableStream(observable, signal);\n\n const reader = stream.getReader();\n const iterator: AsyncIterator<TValue> = {\n async next() {\n const value = await reader.read();\n if (value.done) {\n return {\n value: undefined,\n done: true,\n };\n }\n const { value: result } = value;\n if (!result.ok) {\n throw result.error;\n }\n return {\n value: result.value,\n done: false,\n };\n },\n async return() {\n await reader.cancel();\n return {\n value: undefined,\n done: true,\n };\n },\n };\n return {\n [Symbol.asyncIterator]() {\n return iterator;\n },\n };\n}\n"],"mappings":"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"}