@trpc/server
Version:
243 lines (241 loc) • 6.81 kB
JavaScript
const require_observable = require("./observable-1zKJIeLl.cjs");
//#region src/observable/operators.ts
/** Maps each value with `project`. */
function map(project) {
return (source) => {
return require_observable.observable((destination) => {
let index = 0;
return source.subscribe({
next(value) {
destination.next(project(value, index++));
},
error(error) {
destination.error(error);
},
complete() {
destination.complete();
}
});
});
};
}
/**
* Shares one subscription to the source between all subscribers. It
* starts with the first subscriber and ends when the last unsubscribes.
*/
function share(_opts) {
return (source) => {
let refCount = 0;
let subscription = null;
let isConnecting = false;
let observers = /* @__PURE__ */ new Set();
function startIfNeeded() {
if (subscription || isConnecting) return;
isConnecting = true;
let isDone = false;
let sourceSubscription;
try {
sourceSubscription = source.subscribe({
next(value) {
notify(observers, (observer) => {
var _observer$next;
return (_observer$next = observer.next) === null || _observer$next === void 0 ? void 0 : _observer$next.call(observer, value);
});
},
error(error) {
isDone = true;
terminate((observer) => {
var _observer$error;
return (_observer$error = observer.error) === null || _observer$error === void 0 ? void 0 : _observer$error.call(observer, error);
});
},
complete() {
isDone = true;
terminate((observer) => {
var _observer$complete;
return (_observer$complete = observer.complete) === null || _observer$complete === void 0 ? void 0 : _observer$complete.call(observer);
});
}
});
} finally {
isConnecting = false;
}
if (isDone) sourceSubscription.unsubscribe();
else subscription = sourceSubscription;
}
function notify(targets, callback) {
for (const observer of [...targets]) if (targets.has(observer)) callback(observer);
}
function terminate(callback) {
const _sub = subscription;
const terminatedObservers = observers;
subscription = null;
observers = /* @__PURE__ */ new Set();
isConnecting = false;
try {
notify(terminatedObservers, callback);
} finally {
_sub === null || _sub === void 0 || _sub.unsubscribe();
}
}
function resetSource() {
const _sub = subscription;
subscription = null;
_sub === null || _sub === void 0 || _sub.unsubscribe();
}
function resetIfNeeded() {
if (refCount === 0 && subscription) resetSource();
}
return require_observable.observable((subscriber) => {
refCount++;
const subscriberObservers = observers;
subscriberObservers.add(subscriber);
startIfNeeded();
return { unsubscribe() {
refCount--;
resetIfNeeded();
subscriberObservers.delete(subscriber);
} };
});
};
}
/** Calls `observer` with each value, error and completion, and passes them on unchanged. */
function tap(observer) {
return (source) => {
return require_observable.observable((destination) => {
return source.subscribe({
next(value) {
var _observer$next2;
(_observer$next2 = observer.next) === null || _observer$next2 === void 0 || _observer$next2.call(observer, value);
destination.next(value);
},
error(error) {
var _observer$error2;
(_observer$error2 = observer.error) === null || _observer$error2 === void 0 || _observer$error2.call(observer, error);
destination.error(error);
},
complete() {
var _observer$complete2;
(_observer$complete2 = observer.complete) === null || _observer$complete2 === void 0 || _observer$complete2.call(observer);
destination.complete();
}
});
});
};
}
const distinctUnsetMarker = Symbol();
/** Skips values equal to the one before, by `compare` (`===` by default). */
function distinctUntilChanged(compare = (a, b) => a === b) {
return (source) => {
return require_observable.observable((destination) => {
let lastValue = distinctUnsetMarker;
return source.subscribe({
next(value) {
if (lastValue !== distinctUnsetMarker && compare(lastValue, value)) return;
lastValue = value;
destination.next(value);
},
error(error) {
destination.error(error);
},
complete() {
destination.complete();
}
});
});
};
}
const isDeepEqual = (a, b) => {
if (a === b) return true;
return !!(a && b && typeof a === "object" && typeof b === "object") && Object.keys(a).length === Object.keys(b).length && Object.entries(a).every(([k, v]) => isDeepEqual(v, b[k]));
};
/**
* Skips values equal to the one before, comparing objects and arrays by
* their own enumerable keys. Objects without such keys, like two `Date`s,
* always count as equal.
*/
function distinctUntilDeepChanged() {
return distinctUntilChanged(isDeepEqual);
}
//#endregion
//#region src/observable/behaviorSubject.ts
/**
* Calls one of several observers. A throw would stop the caller from
* notifying the rest, so it is rethrown asynchronously instead: it still
* shows up as an uncaught exception.
*/
function callObserver(callback) {
try {
callback();
} catch (error) {
setTimeout(() => {
throw error;
});
}
}
/**
* Creates an observable that holds a current value. New subscribers get
* it right away, unless it's `undefined`.
* @internal
*/
function behaviorSubject(initialValue) {
let value = initialValue;
const observerList = /* @__PURE__ */ new Set();
const addObserver = (observer) => {
if (value !== void 0) observer.next(value);
observerList.add(observer);
};
const removeObserver = (observer) => {
observerList.delete(observer);
};
const obs = require_observable.observable((observer) => {
addObserver(observer);
return () => {
removeObserver(observer);
};
});
obs.next = (nextValue) => {
if (value === nextValue) return;
value = nextValue;
for (const observer of [...observerList]) if (observerList.has(observer)) callObserver(() => observer.next(nextValue));
};
obs.get = () => value;
return obs;
}
//#endregion
Object.defineProperty(exports, "behaviorSubject", {
enumerable: true,
get: function() {
return behaviorSubject;
}
});
Object.defineProperty(exports, "distinctUntilChanged", {
enumerable: true,
get: function() {
return distinctUntilChanged;
}
});
Object.defineProperty(exports, "distinctUntilDeepChanged", {
enumerable: true,
get: function() {
return distinctUntilDeepChanged;
}
});
Object.defineProperty(exports, "map", {
enumerable: true,
get: function() {
return map;
}
});
Object.defineProperty(exports, "share", {
enumerable: true,
get: function() {
return share;
}
});
Object.defineProperty(exports, "tap", {
enumerable: true,
get: function() {
return tap;
}
});