- Consolidated duplicate UndoManagers to single instance - Fixed connection promise to only resolve on 'connected' status - Fixed WebSocketProvider import (WebsocketProvider) - Added proper doc.destroy() cleanup - Renamed isPresenceInitialized property to avoid conflict Co-Authored-By: Paperclip <noreply@paperclip.ing>
2365 lines
81 KiB
JavaScript
2365 lines
81 KiB
JavaScript
const require_getErrorShape = require('./getErrorShape-MR4DZeb7.cjs');
|
|
const require_codes = require('./codes-BfZsPdy-.cjs');
|
|
const require_tracked = require('./tracked-Dj_dpOJE.cjs');
|
|
const require_observable = require('./observable-B1Nk6r1H.cjs');
|
|
|
|
//#region src/unstable-core-do-not-import/http/parseConnectionParams.ts
|
|
function parseConnectionParamsFromUnknown(parsed) {
|
|
try {
|
|
if (parsed === null) return null;
|
|
if (!require_codes.isObject(parsed)) throw new Error("Expected object");
|
|
const nonStringValues = Object.entries(parsed).filter(([_key, value]) => typeof value !== "string");
|
|
if (nonStringValues.length > 0) throw new Error(`Expected connectionParams to be string values. Got ${nonStringValues.map(([key, value]) => `${key}: ${typeof value}`).join(", ")}`);
|
|
return parsed;
|
|
} catch (cause) {
|
|
throw new require_tracked.TRPCError({
|
|
code: "PARSE_ERROR",
|
|
message: "Invalid connection params shape",
|
|
cause
|
|
});
|
|
}
|
|
}
|
|
function parseConnectionParamsFromString(str) {
|
|
let parsed;
|
|
try {
|
|
parsed = JSON.parse(str);
|
|
} catch (cause) {
|
|
throw new require_tracked.TRPCError({
|
|
code: "PARSE_ERROR",
|
|
message: "Not JSON-parsable query params",
|
|
cause
|
|
});
|
|
}
|
|
return parseConnectionParamsFromUnknown(parsed);
|
|
}
|
|
|
|
//#endregion
|
|
//#region src/unstable-core-do-not-import/http/contentType.ts
|
|
var import_objectSpread2$1 = require_getErrorShape.__toESM(require_getErrorShape.require_objectSpread2(), 1);
|
|
function getAcceptHeader(headers) {
|
|
var _ref, _headers$get;
|
|
return (_ref = headers.get("trpc-accept")) !== null && _ref !== void 0 ? _ref : ((_headers$get = headers.get("accept")) === null || _headers$get === void 0 ? void 0 : _headers$get.split(",").some((t) => t.trim() === "application/jsonl")) ? "application/jsonl" : null;
|
|
}
|
|
/**
|
|
* Memoize a function that takes no arguments
|
|
* @internal
|
|
*/
|
|
function memo(fn) {
|
|
let promise = null;
|
|
const sym = Symbol.for("@trpc/server/http/memo");
|
|
let value = sym;
|
|
return {
|
|
read: async () => {
|
|
var _promise;
|
|
if (value !== sym) return value;
|
|
(_promise = promise) !== null && _promise !== void 0 || (promise = fn().catch((cause) => {
|
|
if (cause instanceof require_tracked.TRPCError) throw cause;
|
|
throw new require_tracked.TRPCError({
|
|
code: "BAD_REQUEST",
|
|
message: cause instanceof Error ? cause.message : "Invalid input",
|
|
cause
|
|
});
|
|
}));
|
|
value = await promise;
|
|
promise = null;
|
|
return value;
|
|
},
|
|
result: () => {
|
|
return value !== sym ? value : void 0;
|
|
}
|
|
};
|
|
}
|
|
const jsonContentTypeHandler = {
|
|
isMatch(req) {
|
|
var _req$headers$get;
|
|
return !!((_req$headers$get = req.headers.get("content-type")) === null || _req$headers$get === void 0 ? void 0 : _req$headers$get.startsWith("application/json"));
|
|
},
|
|
async parse(opts) {
|
|
var _types$values$next$va;
|
|
const { req } = opts;
|
|
const isBatchCall = opts.searchParams.get("batch") === "1";
|
|
const maxBatchSize = opts.maxBatchSize;
|
|
const paths = isBatchCall ? opts.path.split(",") : [opts.path];
|
|
if (isBatchCall && typeof maxBatchSize === "number" && paths.length > maxBatchSize) throw new require_tracked.TRPCError({
|
|
code: "BAD_REQUEST",
|
|
message: `Batch call exceeds maximum size`
|
|
});
|
|
const getInputs = memo(async () => {
|
|
let inputs = void 0;
|
|
if (req.method === "GET") {
|
|
const queryInput = opts.searchParams.get("input");
|
|
if (queryInput) inputs = JSON.parse(queryInput);
|
|
} else inputs = await req.json();
|
|
if (inputs === void 0) return require_codes.emptyObject();
|
|
if (!isBatchCall) {
|
|
const result = require_codes.emptyObject();
|
|
result[0] = opts.router._def._config.transformer.input.deserialize(inputs);
|
|
return result;
|
|
}
|
|
if (!require_codes.isObject(inputs)) throw new require_tracked.TRPCError({
|
|
code: "BAD_REQUEST",
|
|
message: "\"input\" needs to be an object when doing a batch call"
|
|
});
|
|
const acc = require_codes.emptyObject();
|
|
for (const index of paths.keys()) {
|
|
const input = inputs[index];
|
|
if (input !== void 0) acc[index] = opts.router._def._config.transformer.input.deserialize(input);
|
|
}
|
|
return acc;
|
|
});
|
|
const calls = await Promise.all(paths.map(async (path, index) => {
|
|
const procedure = await require_tracked.getProcedureAtPath(opts.router, path);
|
|
return {
|
|
batchIndex: index,
|
|
path,
|
|
procedure,
|
|
getRawInput: async () => {
|
|
const inputs = await getInputs.read();
|
|
let input = inputs[index];
|
|
if ((procedure === null || procedure === void 0 ? void 0 : procedure._def.type) === "subscription") {
|
|
var _ref2, _opts$headers$get;
|
|
const lastEventId = (_ref2 = (_opts$headers$get = opts.headers.get("last-event-id")) !== null && _opts$headers$get !== void 0 ? _opts$headers$get : opts.searchParams.get("lastEventId")) !== null && _ref2 !== void 0 ? _ref2 : opts.searchParams.get("Last-Event-Id");
|
|
if (lastEventId) if (require_codes.isObject(input)) input = (0, import_objectSpread2$1.default)((0, import_objectSpread2$1.default)({}, input), {}, { lastEventId });
|
|
else {
|
|
var _input;
|
|
(_input = input) !== null && _input !== void 0 || (input = { lastEventId });
|
|
}
|
|
}
|
|
return input;
|
|
},
|
|
result: () => {
|
|
var _getInputs$result;
|
|
return (_getInputs$result = getInputs.result()) === null || _getInputs$result === void 0 ? void 0 : _getInputs$result[index];
|
|
}
|
|
};
|
|
}));
|
|
const types = new Set(calls.map((call) => {
|
|
var _call$procedure;
|
|
return (_call$procedure = call.procedure) === null || _call$procedure === void 0 ? void 0 : _call$procedure._def.type;
|
|
}).filter(Boolean));
|
|
/* istanbul ignore if -- @preserve */
|
|
if (types.size > 1) throw new require_tracked.TRPCError({
|
|
code: "BAD_REQUEST",
|
|
message: `Cannot mix procedure types in call: ${Array.from(types).join(", ")}`
|
|
});
|
|
const type = (_types$values$next$va = types.values().next().value) !== null && _types$values$next$va !== void 0 ? _types$values$next$va : "unknown";
|
|
const connectionParamsStr = opts.searchParams.get("connectionParams");
|
|
const info = {
|
|
isBatchCall,
|
|
accept: getAcceptHeader(req.headers),
|
|
calls,
|
|
type,
|
|
connectionParams: connectionParamsStr === null ? null : parseConnectionParamsFromString(connectionParamsStr),
|
|
signal: req.signal,
|
|
url: opts.url
|
|
};
|
|
return info;
|
|
}
|
|
};
|
|
const formDataContentTypeHandler = {
|
|
isMatch(req) {
|
|
var _req$headers$get2;
|
|
return !!((_req$headers$get2 = req.headers.get("content-type")) === null || _req$headers$get2 === void 0 ? void 0 : _req$headers$get2.startsWith("multipart/form-data"));
|
|
},
|
|
async parse(opts) {
|
|
const { req } = opts;
|
|
if (req.method !== "POST") throw new require_tracked.TRPCError({
|
|
code: "METHOD_NOT_SUPPORTED",
|
|
message: "Only POST requests are supported for multipart/form-data requests"
|
|
});
|
|
const getInputs = memo(async () => {
|
|
const fd = await req.formData();
|
|
return fd;
|
|
});
|
|
const procedure = await require_tracked.getProcedureAtPath(opts.router, opts.path);
|
|
return {
|
|
accept: null,
|
|
calls: [{
|
|
batchIndex: 0,
|
|
path: opts.path,
|
|
getRawInput: getInputs.read,
|
|
result: getInputs.result,
|
|
procedure
|
|
}],
|
|
isBatchCall: false,
|
|
type: "mutation",
|
|
connectionParams: null,
|
|
signal: req.signal,
|
|
url: opts.url
|
|
};
|
|
}
|
|
};
|
|
const octetStreamContentTypeHandler = {
|
|
isMatch(req) {
|
|
var _req$headers$get3;
|
|
return !!((_req$headers$get3 = req.headers.get("content-type")) === null || _req$headers$get3 === void 0 ? void 0 : _req$headers$get3.startsWith("application/octet-stream"));
|
|
},
|
|
async parse(opts) {
|
|
const { req } = opts;
|
|
if (req.method !== "POST") throw new require_tracked.TRPCError({
|
|
code: "METHOD_NOT_SUPPORTED",
|
|
message: "Only POST requests are supported for application/octet-stream requests"
|
|
});
|
|
const getInputs = memo(async () => {
|
|
return req.body;
|
|
});
|
|
return {
|
|
calls: [{
|
|
batchIndex: 0,
|
|
path: opts.path,
|
|
getRawInput: getInputs.read,
|
|
result: getInputs.result,
|
|
procedure: await require_tracked.getProcedureAtPath(opts.router, opts.path)
|
|
}],
|
|
isBatchCall: false,
|
|
accept: null,
|
|
type: "mutation",
|
|
connectionParams: null,
|
|
signal: req.signal,
|
|
url: opts.url
|
|
};
|
|
}
|
|
};
|
|
const handlers = [
|
|
jsonContentTypeHandler,
|
|
formDataContentTypeHandler,
|
|
octetStreamContentTypeHandler
|
|
];
|
|
function getContentTypeHandler(req) {
|
|
const handler = handlers.find((handler$1) => handler$1.isMatch(req));
|
|
if (handler) return handler;
|
|
if (!handler && req.method === "GET") return jsonContentTypeHandler;
|
|
throw new require_tracked.TRPCError({
|
|
code: "UNSUPPORTED_MEDIA_TYPE",
|
|
message: req.headers.has("content-type") ? `Unsupported content-type "${req.headers.get("content-type")}` : "Missing content-type header"
|
|
});
|
|
}
|
|
async function getRequestInfo(opts) {
|
|
const handler = getContentTypeHandler(opts.req);
|
|
return await handler.parse(opts);
|
|
}
|
|
|
|
//#endregion
|
|
//#region src/unstable-core-do-not-import/http/abortError.ts
|
|
function isAbortError(error) {
|
|
return require_codes.isObject(error) && error["name"] === "AbortError";
|
|
}
|
|
function throwAbortError(message = "AbortError") {
|
|
throw new DOMException(message, "AbortError");
|
|
}
|
|
|
|
//#endregion
|
|
//#region src/vendor/is-plain-object.ts
|
|
/*!
|
|
* is-plain-object <https://github.com/jonschlinkert/is-plain-object>
|
|
*
|
|
* Copyright (c) 2014-2017, Jon Schlinkert.
|
|
* Released under the MIT License.
|
|
*/
|
|
function isObject$1(o) {
|
|
return Object.prototype.toString.call(o) === "[object Object]";
|
|
}
|
|
function isPlainObject(o) {
|
|
var ctor, prot;
|
|
if (isObject$1(o) === false) return false;
|
|
ctor = o.constructor;
|
|
if (ctor === void 0) return true;
|
|
prot = ctor.prototype;
|
|
if (isObject$1(prot) === false) return false;
|
|
if (prot.hasOwnProperty("isPrototypeOf") === false) return false;
|
|
return true;
|
|
}
|
|
|
|
//#endregion
|
|
//#region src/vendor/unpromise/unpromise.ts
|
|
var import_defineProperty = require_getErrorShape.__toESM(require_getErrorShape.require_defineProperty(), 1);
|
|
let _Symbol$toStringTag;
|
|
/** Memory safe (weakmapped) cache of the ProxyPromise for each Promise,
|
|
* which is retained for the lifetime of the original Promise.
|
|
*/
|
|
const subscribableCache = /* @__PURE__ */ new WeakMap();
|
|
/** A NOOP function allowing a consistent interface for settled
|
|
* SubscribedPromises (settled promises are not subscribed - they resolve
|
|
* immediately). */
|
|
const NOOP = () => {};
|
|
_Symbol$toStringTag = Symbol.toStringTag;
|
|
/**
|
|
* Every `Promise<T>` can be shadowed by a single `ProxyPromise<T>`. It is
|
|
* created once, cached and reused throughout the lifetime of the Promise. Get a
|
|
* Promise's ProxyPromise using `Unpromise.proxy(promise)`.
|
|
*
|
|
* The `ProxyPromise<T>` attaches handlers to the original `Promise<T>`
|
|
* `.then()` and `.catch()` just once. Promises derived from it use a
|
|
* subscription- (and unsubscription-) based mechanism that monitors these
|
|
* handlers.
|
|
*
|
|
* Every time you call `.subscribe()`, `.then()` `.catch()` or `.finally()` on a
|
|
* `ProxyPromise<T>` it returns a `SubscribedPromise<T>` having an additional
|
|
* `unsubscribe()` method. Calling `unsubscribe()` detaches reference chains
|
|
* from the original, potentially long-lived Promise, eliminating memory leaks.
|
|
*
|
|
* This approach can eliminate the memory leaks that otherwise come about from
|
|
* repeated `race()` or `any()` calls invoking `.then()` and `.catch()` multiple
|
|
* times on the same long-lived native Promise (subscriptions which can never be
|
|
* cleaned up).
|
|
*
|
|
* `Unpromise.race(promises)` is a reference implementation of `Promise.race`
|
|
* avoiding memory leaks when using long-lived unsettled Promises.
|
|
*
|
|
* `Unpromise.any(promises)` is a reference implementation of `Promise.any`
|
|
* avoiding memory leaks when using long-lived unsettled Promises.
|
|
*
|
|
* `Unpromise.resolve(promise)` returns an ephemeral `SubscribedPromise<T>` for
|
|
* any given `Promise<T>` facilitating arbitrary async/await patterns. Behind
|
|
* the scenes, `resolve` is implemented simply as
|
|
* `Unpromise.proxy(promise).subscribe()`. Don't forget to call `.unsubscribe()`
|
|
* to tidy up!
|
|
*
|
|
*/
|
|
var Unpromise = class Unpromise {
|
|
constructor(arg) {
|
|
(0, import_defineProperty.default)(this, "promise", void 0);
|
|
(0, import_defineProperty.default)(this, "subscribers", []);
|
|
(0, import_defineProperty.default)(this, "settlement", null);
|
|
(0, import_defineProperty.default)(this, _Symbol$toStringTag, "Unpromise");
|
|
if (typeof arg === "function") this.promise = new Promise(arg);
|
|
else this.promise = arg;
|
|
const thenReturn = this.promise.then((value) => {
|
|
const { subscribers } = this;
|
|
this.subscribers = null;
|
|
this.settlement = {
|
|
status: "fulfilled",
|
|
value
|
|
};
|
|
subscribers === null || subscribers === void 0 || subscribers.forEach(({ resolve }) => {
|
|
resolve(value);
|
|
});
|
|
});
|
|
if ("catch" in thenReturn) thenReturn.catch((reason) => {
|
|
const { subscribers } = this;
|
|
this.subscribers = null;
|
|
this.settlement = {
|
|
status: "rejected",
|
|
reason
|
|
};
|
|
subscribers === null || subscribers === void 0 || subscribers.forEach(({ reject }) => {
|
|
reject(reason);
|
|
});
|
|
});
|
|
}
|
|
/** Create a promise that mitigates uncontrolled subscription to a long-lived
|
|
* Promise via .then() and .catch() - otherwise a source of memory leaks.
|
|
*
|
|
* The returned promise has an `unsubscribe()` method which can be called when
|
|
* the Promise is no longer being tracked by application logic, and which
|
|
* ensures that there is no reference chain from the original promise to the
|
|
* new one, and therefore no memory leak.
|
|
*
|
|
* If original promise has not yet settled, this adds a new unique promise
|
|
* that listens to then/catch events, along with an `unsubscribe()` method to
|
|
* detach it.
|
|
*
|
|
* If original promise has settled, then creates a new Promise.resolve() or
|
|
* Promise.reject() and provided unsubscribe is a noop.
|
|
*
|
|
* If you call `unsubscribe()` before the returned Promise has settled, it
|
|
* will never settle.
|
|
*/
|
|
subscribe() {
|
|
let promise;
|
|
let unsubscribe;
|
|
const { settlement } = this;
|
|
if (settlement === null) {
|
|
if (this.subscribers === null) throw new Error("Unpromise settled but still has subscribers");
|
|
const subscriber = withResolvers();
|
|
this.subscribers = listWithMember(this.subscribers, subscriber);
|
|
promise = subscriber.promise;
|
|
unsubscribe = () => {
|
|
if (this.subscribers !== null) this.subscribers = listWithoutMember(this.subscribers, subscriber);
|
|
};
|
|
} else {
|
|
const { status } = settlement;
|
|
if (status === "fulfilled") promise = Promise.resolve(settlement.value);
|
|
else promise = Promise.reject(settlement.reason);
|
|
unsubscribe = NOOP;
|
|
}
|
|
return Object.assign(promise, { unsubscribe });
|
|
}
|
|
/** STANDARD PROMISE METHODS (but returning a SubscribedPromise) */
|
|
then(onfulfilled, onrejected) {
|
|
const subscribed = this.subscribe();
|
|
const { unsubscribe } = subscribed;
|
|
return Object.assign(subscribed.then(onfulfilled, onrejected), { unsubscribe });
|
|
}
|
|
catch(onrejected) {
|
|
const subscribed = this.subscribe();
|
|
const { unsubscribe } = subscribed;
|
|
return Object.assign(subscribed.catch(onrejected), { unsubscribe });
|
|
}
|
|
finally(onfinally) {
|
|
const subscribed = this.subscribe();
|
|
const { unsubscribe } = subscribed;
|
|
return Object.assign(subscribed.finally(onfinally), { unsubscribe });
|
|
}
|
|
/** Unpromise STATIC METHODS */
|
|
/** Create or Retrieve the proxy Unpromise (a re-used Unpromise for the VM lifetime
|
|
* of the provided Promise reference) */
|
|
static proxy(promise) {
|
|
const cached = Unpromise.getSubscribablePromise(promise);
|
|
return typeof cached !== "undefined" ? cached : Unpromise.createSubscribablePromise(promise);
|
|
}
|
|
/** Create and store an Unpromise keyed by an original Promise. */
|
|
static createSubscribablePromise(promise) {
|
|
const created = new Unpromise(promise);
|
|
subscribableCache.set(promise, created);
|
|
subscribableCache.set(created, created);
|
|
return created;
|
|
}
|
|
/** Retrieve a previously-created Unpromise keyed by an original Promise. */
|
|
static getSubscribablePromise(promise) {
|
|
return subscribableCache.get(promise);
|
|
}
|
|
/** Promise STATIC METHODS */
|
|
/** Lookup the Unpromise for this promise, and derive a SubscribedPromise from
|
|
* it (that can be later unsubscribed to eliminate Memory leaks) */
|
|
static resolve(value) {
|
|
const promise = typeof value === "object" && value !== null && "then" in value && typeof value.then === "function" ? value : Promise.resolve(value);
|
|
return Unpromise.proxy(promise).subscribe();
|
|
}
|
|
static async any(values) {
|
|
const valuesArray = Array.isArray(values) ? values : [...values];
|
|
const subscribedPromises = valuesArray.map(Unpromise.resolve);
|
|
try {
|
|
return await Promise.any(subscribedPromises);
|
|
} finally {
|
|
subscribedPromises.forEach(({ unsubscribe }) => {
|
|
unsubscribe();
|
|
});
|
|
}
|
|
}
|
|
static async race(values) {
|
|
const valuesArray = Array.isArray(values) ? values : [...values];
|
|
const subscribedPromises = valuesArray.map(Unpromise.resolve);
|
|
try {
|
|
return await Promise.race(subscribedPromises);
|
|
} finally {
|
|
subscribedPromises.forEach(({ unsubscribe }) => {
|
|
unsubscribe();
|
|
});
|
|
}
|
|
}
|
|
/** Create a race of SubscribedPromises that will fulfil to a single winning
|
|
* Promise (in a 1-Tuple). Eliminates memory leaks from long-lived promises
|
|
* accumulating .then() and .catch() subscribers. Allows simple logic to
|
|
* consume the result, like...
|
|
* ```ts
|
|
* const [ winner ] = await Unpromise.race([ promiseA, promiseB ]);
|
|
* if(winner === promiseB){
|
|
* const result = await promiseB;
|
|
* // do the thing
|
|
* }
|
|
* ```
|
|
* */
|
|
static async raceReferences(promises) {
|
|
const selfPromises = promises.map(resolveSelfTuple);
|
|
try {
|
|
return await Promise.race(selfPromises);
|
|
} finally {
|
|
for (const promise of selfPromises) promise.unsubscribe();
|
|
}
|
|
}
|
|
};
|
|
/** Promises a 1-tuple containing the original promise when it resolves. Allows
|
|
* awaiting the eventual Promise ***reference*** (easy to destructure and
|
|
* exactly compare with ===). Avoids resolving to the Promise ***value*** (which
|
|
* may be ambiguous and therefore hard to identify as the winner of a race).
|
|
* You can call unsubscribe on the Promise to mitigate memory leaks.
|
|
* */
|
|
function resolveSelfTuple(promise) {
|
|
return Unpromise.proxy(promise).then(() => [promise]);
|
|
}
|
|
/** VENDORED (Future) PROMISE UTILITIES */
|
|
/** Reference implementation of https://github.com/tc39/proposal-promise-with-resolvers */
|
|
function withResolvers() {
|
|
let resolve;
|
|
let reject;
|
|
const promise = new Promise((_resolve, _reject) => {
|
|
resolve = _resolve;
|
|
reject = _reject;
|
|
});
|
|
return {
|
|
promise,
|
|
resolve,
|
|
reject
|
|
};
|
|
}
|
|
/** IMMUTABLE LIST OPERATIONS */
|
|
function listWithMember(arr, member) {
|
|
return [...arr, member];
|
|
}
|
|
function listWithoutIndex(arr, index) {
|
|
return [...arr.slice(0, index), ...arr.slice(index + 1)];
|
|
}
|
|
function listWithoutMember(arr, member) {
|
|
const index = arr.indexOf(member);
|
|
if (index !== -1) return listWithoutIndex(arr, index);
|
|
return arr;
|
|
}
|
|
|
|
//#endregion
|
|
//#region src/unstable-core-do-not-import/stream/utils/disposable.ts
|
|
var _Symbol, _Symbol$dispose, _Symbol2, _Symbol2$asyncDispose;
|
|
(_Symbol$dispose = (_Symbol = Symbol).dispose) !== null && _Symbol$dispose !== void 0 || (_Symbol.dispose = Symbol());
|
|
(_Symbol2$asyncDispose = (_Symbol2 = Symbol).asyncDispose) !== null && _Symbol2$asyncDispose !== void 0 || (_Symbol2.asyncDispose = Symbol());
|
|
/**
|
|
* Takes a value and a dispose function and returns a new object that implements the Disposable interface.
|
|
* The returned object is the original value augmented with a Symbol.dispose method.
|
|
* @param thing The value to make disposable
|
|
* @param dispose Function to call when disposing the resource
|
|
* @returns The original value with Symbol.dispose method added
|
|
*/
|
|
function makeResource(thing, dispose) {
|
|
const it = thing;
|
|
const existing = it[Symbol.dispose];
|
|
it[Symbol.dispose] = () => {
|
|
dispose();
|
|
existing === null || existing === void 0 || existing();
|
|
};
|
|
return it;
|
|
}
|
|
/**
|
|
* Takes a value and an async dispose function and returns a new object that implements the AsyncDisposable interface.
|
|
* The returned object is the original value augmented with a Symbol.asyncDispose method.
|
|
* @param thing The value to make async disposable
|
|
* @param dispose Async function to call when disposing the resource
|
|
* @returns The original value with Symbol.asyncDispose method added
|
|
*/
|
|
function makeAsyncResource(thing, dispose) {
|
|
const it = thing;
|
|
const existing = it[Symbol.asyncDispose];
|
|
it[Symbol.asyncDispose] = async () => {
|
|
await dispose();
|
|
await (existing === null || existing === void 0 ? void 0 : existing());
|
|
};
|
|
return it;
|
|
}
|
|
|
|
//#endregion
|
|
//#region src/unstable-core-do-not-import/stream/utils/timerResource.ts
|
|
const disposablePromiseTimerResult = Symbol();
|
|
function timerResource(ms) {
|
|
let timer = null;
|
|
return makeResource({ start() {
|
|
if (timer) throw new Error("Timer already started");
|
|
const promise = new Promise((resolve) => {
|
|
timer = setTimeout(() => resolve(disposablePromiseTimerResult), ms);
|
|
});
|
|
return promise;
|
|
} }, () => {
|
|
if (timer) clearTimeout(timer);
|
|
});
|
|
}
|
|
|
|
//#endregion
|
|
//#region ../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/usingCtx.js
|
|
var require_usingCtx = require_getErrorShape.__commonJS({ "../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/usingCtx.js"(exports, module) {
|
|
function _usingCtx() {
|
|
var r = "function" == typeof SuppressedError ? SuppressedError : function(r$1, e$1) {
|
|
var n$1 = Error();
|
|
return n$1.name = "SuppressedError", n$1.error = r$1, n$1.suppressed = e$1, n$1;
|
|
}, e = {}, n = [];
|
|
function using(r$1, e$1) {
|
|
if (null != e$1) {
|
|
if (Object(e$1) !== e$1) throw new TypeError("using declarations can only be used with objects, functions, null, or undefined.");
|
|
if (r$1) var o = e$1[Symbol.asyncDispose || Symbol["for"]("Symbol.asyncDispose")];
|
|
if (void 0 === o && (o = e$1[Symbol.dispose || Symbol["for"]("Symbol.dispose")], r$1)) var t = o;
|
|
if ("function" != typeof o) throw new TypeError("Object is not disposable.");
|
|
t && (o = function o$1() {
|
|
try {
|
|
t.call(e$1);
|
|
} catch (r$2) {
|
|
return Promise.reject(r$2);
|
|
}
|
|
}), n.push({
|
|
v: e$1,
|
|
d: o,
|
|
a: r$1
|
|
});
|
|
} else r$1 && n.push({
|
|
d: e$1,
|
|
a: r$1
|
|
});
|
|
return e$1;
|
|
}
|
|
return {
|
|
e,
|
|
u: using.bind(null, !1),
|
|
a: using.bind(null, !0),
|
|
d: function d() {
|
|
var o, t = this.e, s = 0;
|
|
function next() {
|
|
for (; o = n.pop();) try {
|
|
if (!o.a && 1 === s) return s = 0, n.push(o), Promise.resolve().then(next);
|
|
if (o.d) {
|
|
var r$1 = o.d.call(o.v);
|
|
if (o.a) return s |= 2, Promise.resolve(r$1).then(next, err);
|
|
} else s |= 1;
|
|
} catch (r$2) {
|
|
return err(r$2);
|
|
}
|
|
if (1 === s) return t !== e ? Promise.reject(t) : Promise.resolve();
|
|
if (t !== e) throw t;
|
|
}
|
|
function err(n$1) {
|
|
return t = t !== e ? new r(n$1, t) : n$1, next();
|
|
}
|
|
return next();
|
|
}
|
|
};
|
|
}
|
|
module.exports = _usingCtx, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
} });
|
|
|
|
//#endregion
|
|
//#region ../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/OverloadYield.js
|
|
var require_OverloadYield = require_getErrorShape.__commonJS({ "../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/OverloadYield.js"(exports, module) {
|
|
function _OverloadYield(e, d) {
|
|
this.v = e, this.k = d;
|
|
}
|
|
module.exports = _OverloadYield, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
} });
|
|
|
|
//#endregion
|
|
//#region ../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/awaitAsyncGenerator.js
|
|
var require_awaitAsyncGenerator = require_getErrorShape.__commonJS({ "../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/awaitAsyncGenerator.js"(exports, module) {
|
|
var OverloadYield$2 = require_OverloadYield();
|
|
function _awaitAsyncGenerator$5(e) {
|
|
return new OverloadYield$2(e, 0);
|
|
}
|
|
module.exports = _awaitAsyncGenerator$5, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
} });
|
|
|
|
//#endregion
|
|
//#region ../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/wrapAsyncGenerator.js
|
|
var require_wrapAsyncGenerator = require_getErrorShape.__commonJS({ "../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/wrapAsyncGenerator.js"(exports, module) {
|
|
var OverloadYield$1 = require_OverloadYield();
|
|
function _wrapAsyncGenerator$6(e) {
|
|
return function() {
|
|
return new AsyncGenerator(e.apply(this, arguments));
|
|
};
|
|
}
|
|
function AsyncGenerator(e) {
|
|
var r, t;
|
|
function resume(r$1, t$1) {
|
|
try {
|
|
var n = e[r$1](t$1), o = n.value, u = o instanceof OverloadYield$1;
|
|
Promise.resolve(u ? o.v : o).then(function(t$2) {
|
|
if (u) {
|
|
var i = "return" === r$1 ? "return" : "next";
|
|
if (!o.k || t$2.done) return resume(i, t$2);
|
|
t$2 = e[i](t$2).value;
|
|
}
|
|
settle(n.done ? "return" : "normal", t$2);
|
|
}, function(e$1) {
|
|
resume("throw", e$1);
|
|
});
|
|
} catch (e$1) {
|
|
settle("throw", e$1);
|
|
}
|
|
}
|
|
function settle(e$1, n) {
|
|
switch (e$1) {
|
|
case "return":
|
|
r.resolve({
|
|
value: n,
|
|
done: !0
|
|
});
|
|
break;
|
|
case "throw":
|
|
r.reject(n);
|
|
break;
|
|
default: r.resolve({
|
|
value: n,
|
|
done: !1
|
|
});
|
|
}
|
|
(r = r.next) ? resume(r.key, r.arg) : t = null;
|
|
}
|
|
this._invoke = function(e$1, n) {
|
|
return new Promise(function(o, u) {
|
|
var i = {
|
|
key: e$1,
|
|
arg: n,
|
|
resolve: o,
|
|
reject: u,
|
|
next: null
|
|
};
|
|
t ? t = t.next = i : (r = t = i, resume(e$1, n));
|
|
});
|
|
}, "function" != typeof e["return"] && (this["return"] = void 0);
|
|
}
|
|
AsyncGenerator.prototype["function" == typeof Symbol && Symbol.asyncIterator || "@@asyncIterator"] = function() {
|
|
return this;
|
|
}, AsyncGenerator.prototype.next = function(e) {
|
|
return this._invoke("next", e);
|
|
}, AsyncGenerator.prototype["throw"] = function(e) {
|
|
return this._invoke("throw", e);
|
|
}, AsyncGenerator.prototype["return"] = function(e) {
|
|
return this._invoke("return", e);
|
|
};
|
|
module.exports = _wrapAsyncGenerator$6, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
} });
|
|
|
|
//#endregion
|
|
//#region src/unstable-core-do-not-import/stream/utils/asyncIterable.ts
|
|
var import_usingCtx$4 = require_getErrorShape.__toESM(require_usingCtx(), 1);
|
|
var import_awaitAsyncGenerator$4 = require_getErrorShape.__toESM(require_awaitAsyncGenerator(), 1);
|
|
var import_wrapAsyncGenerator$5 = require_getErrorShape.__toESM(require_wrapAsyncGenerator(), 1);
|
|
function iteratorResource(iterable) {
|
|
const iterator = iterable[Symbol.asyncIterator]();
|
|
if (iterator[Symbol.asyncDispose]) return iterator;
|
|
return makeAsyncResource(iterator, async () => {
|
|
var _iterator$return;
|
|
await ((_iterator$return = iterator.return) === null || _iterator$return === void 0 ? void 0 : _iterator$return.call(iterator));
|
|
});
|
|
}
|
|
/**
|
|
* Derives a new {@link AsyncGenerator} based of {@link iterable}, that yields its first
|
|
* {@link count} values. Then, a grace period of {@link gracePeriodMs} is started in which further
|
|
* values may still come through. After this period, the generator aborts.
|
|
*/
|
|
function takeWithGrace(_x, _x2) {
|
|
return _takeWithGrace.apply(this, arguments);
|
|
}
|
|
function _takeWithGrace() {
|
|
_takeWithGrace = (0, import_wrapAsyncGenerator$5.default)(function* (iterable, opts) {
|
|
try {
|
|
var _usingCtx$1 = (0, import_usingCtx$4.default)();
|
|
const iterator = _usingCtx$1.a(iteratorResource(iterable));
|
|
let result;
|
|
const timer = _usingCtx$1.u(timerResource(opts.gracePeriodMs));
|
|
let count = opts.count;
|
|
let timerPromise = new Promise(() => {});
|
|
while (true) {
|
|
result = yield (0, import_awaitAsyncGenerator$4.default)(Unpromise.race([iterator.next(), timerPromise]));
|
|
if (result === disposablePromiseTimerResult) throwAbortError();
|
|
if (result.done) return result.value;
|
|
yield result.value;
|
|
if (--count === 0) timerPromise = timer.start();
|
|
result = null;
|
|
}
|
|
} catch (_) {
|
|
_usingCtx$1.e = _;
|
|
} finally {
|
|
yield (0, import_awaitAsyncGenerator$4.default)(_usingCtx$1.d());
|
|
}
|
|
});
|
|
return _takeWithGrace.apply(this, arguments);
|
|
}
|
|
|
|
//#endregion
|
|
//#region src/unstable-core-do-not-import/stream/utils/createDeferred.ts
|
|
function createDeferred() {
|
|
let resolve;
|
|
let reject;
|
|
const promise = new Promise((res, rej) => {
|
|
resolve = res;
|
|
reject = rej;
|
|
});
|
|
return {
|
|
promise,
|
|
resolve,
|
|
reject
|
|
};
|
|
}
|
|
|
|
//#endregion
|
|
//#region src/unstable-core-do-not-import/stream/utils/mergeAsyncIterables.ts
|
|
var import_usingCtx$3 = require_getErrorShape.__toESM(require_usingCtx(), 1);
|
|
var import_awaitAsyncGenerator$3 = require_getErrorShape.__toESM(require_awaitAsyncGenerator(), 1);
|
|
var import_wrapAsyncGenerator$4 = require_getErrorShape.__toESM(require_wrapAsyncGenerator(), 1);
|
|
function createManagedIterator(iterable, onResult) {
|
|
const iterator = iterable[Symbol.asyncIterator]();
|
|
let state = "idle";
|
|
function cleanup() {
|
|
state = "done";
|
|
onResult = () => {};
|
|
}
|
|
function pull() {
|
|
if (state !== "idle") return;
|
|
state = "pending";
|
|
const next = iterator.next();
|
|
next.then((result) => {
|
|
if (result.done) {
|
|
state = "done";
|
|
onResult({
|
|
status: "return",
|
|
value: result.value
|
|
});
|
|
cleanup();
|
|
return;
|
|
}
|
|
state = "idle";
|
|
onResult({
|
|
status: "yield",
|
|
value: result.value
|
|
});
|
|
}).catch((cause) => {
|
|
onResult({
|
|
status: "error",
|
|
error: cause
|
|
});
|
|
cleanup();
|
|
});
|
|
}
|
|
return {
|
|
pull,
|
|
destroy: async () => {
|
|
var _iterator$return;
|
|
cleanup();
|
|
await ((_iterator$return = iterator.return) === null || _iterator$return === void 0 ? void 0 : _iterator$return.call(iterator));
|
|
}
|
|
};
|
|
}
|
|
/**
|
|
* Creates a new async iterable that merges multiple async iterables into a single stream.
|
|
* Values from the input iterables are yielded in the order they resolve, similar to Promise.race().
|
|
*
|
|
* New iterables can be added dynamically using the returned {@link MergedAsyncIterables.add} method, even after iteration has started.
|
|
*
|
|
* If any of the input iterables throws an error, that error will be propagated through the merged stream.
|
|
* Other iterables will not continue to be processed.
|
|
*
|
|
* @template TYield The type of values yielded by the input iterables
|
|
*/
|
|
function mergeAsyncIterables() {
|
|
let state = "idle";
|
|
let flushSignal = createDeferred();
|
|
/**
|
|
* used while {@link state} is `idle`
|
|
*/
|
|
const iterables = [];
|
|
/**
|
|
* used while {@link state} is `pending`
|
|
*/
|
|
const iterators = /* @__PURE__ */ new Set();
|
|
const buffer = [];
|
|
function initIterable(iterable) {
|
|
if (state !== "pending") return;
|
|
const iterator = createManagedIterator(iterable, (result) => {
|
|
if (state !== "pending") return;
|
|
switch (result.status) {
|
|
case "yield":
|
|
buffer.push([iterator, result]);
|
|
break;
|
|
case "return":
|
|
iterators.delete(iterator);
|
|
break;
|
|
case "error":
|
|
buffer.push([iterator, result]);
|
|
iterators.delete(iterator);
|
|
break;
|
|
}
|
|
flushSignal.resolve();
|
|
});
|
|
iterators.add(iterator);
|
|
iterator.pull();
|
|
}
|
|
return {
|
|
add(iterable) {
|
|
switch (state) {
|
|
case "idle":
|
|
iterables.push(iterable);
|
|
break;
|
|
case "pending":
|
|
initIterable(iterable);
|
|
break;
|
|
case "done": break;
|
|
}
|
|
},
|
|
[Symbol.asyncIterator]() {
|
|
return (0, import_wrapAsyncGenerator$4.default)(function* () {
|
|
try {
|
|
var _usingCtx$1 = (0, import_usingCtx$3.default)();
|
|
if (state !== "idle") throw new Error("Cannot iterate twice");
|
|
state = "pending";
|
|
const _finally = _usingCtx$1.a(makeAsyncResource({}, async () => {
|
|
state = "done";
|
|
const errors = [];
|
|
await Promise.all(Array.from(iterators.values()).map(async (it) => {
|
|
try {
|
|
await it.destroy();
|
|
} catch (cause) {
|
|
errors.push(cause);
|
|
}
|
|
}));
|
|
buffer.length = 0;
|
|
iterators.clear();
|
|
flushSignal.resolve();
|
|
if (errors.length > 0) throw new AggregateError(errors);
|
|
}));
|
|
while (iterables.length > 0) initIterable(iterables.shift());
|
|
while (iterators.size > 0) {
|
|
yield (0, import_awaitAsyncGenerator$3.default)(flushSignal.promise);
|
|
while (buffer.length > 0) {
|
|
const [iterator, result] = buffer.shift();
|
|
switch (result.status) {
|
|
case "yield":
|
|
yield result.value;
|
|
iterator.pull();
|
|
break;
|
|
case "error": throw result.error;
|
|
}
|
|
}
|
|
flushSignal = createDeferred();
|
|
}
|
|
} catch (_) {
|
|
_usingCtx$1.e = _;
|
|
} finally {
|
|
yield (0, import_awaitAsyncGenerator$3.default)(_usingCtx$1.d());
|
|
}
|
|
})();
|
|
}
|
|
};
|
|
}
|
|
|
|
//#endregion
|
|
//#region src/unstable-core-do-not-import/stream/utils/readableStreamFrom.ts
|
|
/**
|
|
* Creates a ReadableStream from an AsyncIterable.
|
|
*
|
|
* @param iterable - The source AsyncIterable to stream from
|
|
* @returns A ReadableStream that yields values from the AsyncIterable
|
|
*/
|
|
function readableStreamFrom(iterable) {
|
|
const iterator = iterable[Symbol.asyncIterator]();
|
|
return new ReadableStream({
|
|
async cancel() {
|
|
var _iterator$return;
|
|
await ((_iterator$return = iterator.return) === null || _iterator$return === void 0 ? void 0 : _iterator$return.call(iterator));
|
|
},
|
|
async pull(controller) {
|
|
const result = await iterator.next();
|
|
if (result.done) {
|
|
controller.close();
|
|
return;
|
|
}
|
|
controller.enqueue(result.value);
|
|
}
|
|
});
|
|
}
|
|
|
|
//#endregion
|
|
//#region src/unstable-core-do-not-import/stream/utils/withPing.ts
|
|
var import_usingCtx$2 = require_getErrorShape.__toESM(require_usingCtx(), 1);
|
|
var import_awaitAsyncGenerator$2 = require_getErrorShape.__toESM(require_awaitAsyncGenerator(), 1);
|
|
var import_wrapAsyncGenerator$3 = require_getErrorShape.__toESM(require_wrapAsyncGenerator(), 1);
|
|
const PING_SYM = Symbol("ping");
|
|
/**
|
|
* Derives a new {@link AsyncGenerator} based of {@link iterable}, that yields {@link PING_SYM}
|
|
* whenever no value has been yielded for {@link pingIntervalMs}.
|
|
*/
|
|
function withPing(_x, _x2) {
|
|
return _withPing.apply(this, arguments);
|
|
}
|
|
function _withPing() {
|
|
_withPing = (0, import_wrapAsyncGenerator$3.default)(function* (iterable, pingIntervalMs) {
|
|
try {
|
|
var _usingCtx$1 = (0, import_usingCtx$2.default)();
|
|
const iterator = _usingCtx$1.a(iteratorResource(iterable));
|
|
let result;
|
|
let nextPromise = iterator.next();
|
|
while (true) try {
|
|
var _usingCtx3 = (0, import_usingCtx$2.default)();
|
|
const pingPromise = _usingCtx3.u(timerResource(pingIntervalMs));
|
|
result = yield (0, import_awaitAsyncGenerator$2.default)(Unpromise.race([nextPromise, pingPromise.start()]));
|
|
if (result === disposablePromiseTimerResult) {
|
|
yield PING_SYM;
|
|
continue;
|
|
}
|
|
if (result.done) return result.value;
|
|
nextPromise = iterator.next();
|
|
yield result.value;
|
|
result = null;
|
|
} catch (_) {
|
|
_usingCtx3.e = _;
|
|
} finally {
|
|
_usingCtx3.d();
|
|
}
|
|
} catch (_) {
|
|
_usingCtx$1.e = _;
|
|
} finally {
|
|
yield (0, import_awaitAsyncGenerator$2.default)(_usingCtx$1.d());
|
|
}
|
|
});
|
|
return _withPing.apply(this, arguments);
|
|
}
|
|
|
|
//#endregion
|
|
//#region ../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/asyncIterator.js
|
|
var require_asyncIterator = require_getErrorShape.__commonJS({ "../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/asyncIterator.js"(exports, module) {
|
|
function _asyncIterator$2(r) {
|
|
var n, t, o, e = 2;
|
|
for ("undefined" != typeof Symbol && (t = Symbol.asyncIterator, o = Symbol.iterator); e--;) {
|
|
if (t && null != (n = r[t])) return n.call(r);
|
|
if (o && null != (n = r[o])) return new AsyncFromSyncIterator(n.call(r));
|
|
t = "@@asyncIterator", o = "@@iterator";
|
|
}
|
|
throw new TypeError("Object is not async iterable");
|
|
}
|
|
function AsyncFromSyncIterator(r) {
|
|
function AsyncFromSyncIteratorContinuation(r$1) {
|
|
if (Object(r$1) !== r$1) return Promise.reject(new TypeError(r$1 + " is not an object."));
|
|
var n = r$1.done;
|
|
return Promise.resolve(r$1.value).then(function(r$2) {
|
|
return {
|
|
value: r$2,
|
|
done: n
|
|
};
|
|
});
|
|
}
|
|
return AsyncFromSyncIterator = function AsyncFromSyncIterator$1(r$1) {
|
|
this.s = r$1, this.n = r$1.next;
|
|
}, AsyncFromSyncIterator.prototype = {
|
|
s: null,
|
|
n: null,
|
|
next: function next() {
|
|
return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments));
|
|
},
|
|
"return": function _return(r$1) {
|
|
var n = this.s["return"];
|
|
return void 0 === n ? Promise.resolve({
|
|
value: r$1,
|
|
done: !0
|
|
}) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments));
|
|
},
|
|
"throw": function _throw(r$1) {
|
|
var n = this.s["return"];
|
|
return void 0 === n ? Promise.reject(r$1) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments));
|
|
}
|
|
}, new AsyncFromSyncIterator(r);
|
|
}
|
|
module.exports = _asyncIterator$2, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
} });
|
|
|
|
//#endregion
|
|
//#region src/unstable-core-do-not-import/stream/jsonl.ts
|
|
var import_awaitAsyncGenerator$1 = require_getErrorShape.__toESM(require_awaitAsyncGenerator(), 1);
|
|
var import_wrapAsyncGenerator$2 = require_getErrorShape.__toESM(require_wrapAsyncGenerator(), 1);
|
|
var import_usingCtx$1 = require_getErrorShape.__toESM(require_usingCtx(), 1);
|
|
var import_asyncIterator$1 = require_getErrorShape.__toESM(require_asyncIterator(), 1);
|
|
const CHUNK_VALUE_TYPE_PROMISE = 0;
|
|
const CHUNK_VALUE_TYPE_ASYNC_ITERABLE = 1;
|
|
const PROMISE_STATUS_FULFILLED = 0;
|
|
const PROMISE_STATUS_REJECTED = 1;
|
|
const ASYNC_ITERABLE_STATUS_RETURN = 0;
|
|
const ASYNC_ITERABLE_STATUS_YIELD = 1;
|
|
const ASYNC_ITERABLE_STATUS_ERROR = 2;
|
|
function isPromise(value) {
|
|
return (require_codes.isObject(value) || require_codes.isFunction(value)) && typeof (value === null || value === void 0 ? void 0 : value["then"]) === "function" && typeof (value === null || value === void 0 ? void 0 : value["catch"]) === "function";
|
|
}
|
|
var MaxDepthError = class extends Error {
|
|
constructor(path) {
|
|
super("Max depth reached at path: " + path.join("."));
|
|
this.path = path;
|
|
}
|
|
};
|
|
function createBatchStreamProducer(_x3) {
|
|
return _createBatchStreamProducer.apply(this, arguments);
|
|
}
|
|
function _createBatchStreamProducer() {
|
|
_createBatchStreamProducer = (0, import_wrapAsyncGenerator$2.default)(function* (opts) {
|
|
const { data } = opts;
|
|
let counter = 0;
|
|
const placeholder = 0;
|
|
const mergedIterables = mergeAsyncIterables();
|
|
function registerAsync(callback) {
|
|
const idx = counter++;
|
|
const iterable$1 = callback(idx);
|
|
mergedIterables.add(iterable$1);
|
|
return idx;
|
|
}
|
|
function encodePromise(promise, path) {
|
|
return registerAsync(/* @__PURE__ */ function() {
|
|
var _ref = (0, import_wrapAsyncGenerator$2.default)(function* (idx) {
|
|
const error = checkMaxDepth(path);
|
|
if (error) {
|
|
promise.catch((cause) => {
|
|
var _opts$onError;
|
|
(_opts$onError = opts.onError) === null || _opts$onError === void 0 || _opts$onError.call(opts, {
|
|
error: cause,
|
|
path
|
|
});
|
|
});
|
|
promise = Promise.reject(error);
|
|
}
|
|
try {
|
|
const next = yield (0, import_awaitAsyncGenerator$1.default)(promise);
|
|
yield [
|
|
idx,
|
|
PROMISE_STATUS_FULFILLED,
|
|
encode(next, path)
|
|
];
|
|
} catch (cause) {
|
|
var _opts$onError2, _opts$formatError;
|
|
(_opts$onError2 = opts.onError) === null || _opts$onError2 === void 0 || _opts$onError2.call(opts, {
|
|
error: cause,
|
|
path
|
|
});
|
|
yield [
|
|
idx,
|
|
PROMISE_STATUS_REJECTED,
|
|
(_opts$formatError = opts.formatError) === null || _opts$formatError === void 0 ? void 0 : _opts$formatError.call(opts, {
|
|
error: cause,
|
|
path
|
|
})
|
|
];
|
|
}
|
|
});
|
|
return function(_x) {
|
|
return _ref.apply(this, arguments);
|
|
};
|
|
}());
|
|
}
|
|
function encodeAsyncIterable(iterable$1, path) {
|
|
return registerAsync(/* @__PURE__ */ function() {
|
|
var _ref2 = (0, import_wrapAsyncGenerator$2.default)(function* (idx) {
|
|
try {
|
|
var _usingCtx$1 = (0, import_usingCtx$1.default)();
|
|
const error = checkMaxDepth(path);
|
|
if (error) throw error;
|
|
const iterator = _usingCtx$1.a(iteratorResource(iterable$1));
|
|
try {
|
|
while (true) {
|
|
const next = yield (0, import_awaitAsyncGenerator$1.default)(iterator.next());
|
|
if (next.done) {
|
|
yield [
|
|
idx,
|
|
ASYNC_ITERABLE_STATUS_RETURN,
|
|
encode(next.value, path)
|
|
];
|
|
break;
|
|
}
|
|
yield [
|
|
idx,
|
|
ASYNC_ITERABLE_STATUS_YIELD,
|
|
encode(next.value, path)
|
|
];
|
|
}
|
|
} catch (cause) {
|
|
var _opts$onError3, _opts$formatError2;
|
|
(_opts$onError3 = opts.onError) === null || _opts$onError3 === void 0 || _opts$onError3.call(opts, {
|
|
error: cause,
|
|
path
|
|
});
|
|
yield [
|
|
idx,
|
|
ASYNC_ITERABLE_STATUS_ERROR,
|
|
(_opts$formatError2 = opts.formatError) === null || _opts$formatError2 === void 0 ? void 0 : _opts$formatError2.call(opts, {
|
|
error: cause,
|
|
path
|
|
})
|
|
];
|
|
}
|
|
} catch (_) {
|
|
_usingCtx$1.e = _;
|
|
} finally {
|
|
yield (0, import_awaitAsyncGenerator$1.default)(_usingCtx$1.d());
|
|
}
|
|
});
|
|
return function(_x2) {
|
|
return _ref2.apply(this, arguments);
|
|
};
|
|
}());
|
|
}
|
|
function checkMaxDepth(path) {
|
|
if (opts.maxDepth && path.length > opts.maxDepth) return new MaxDepthError(path);
|
|
return null;
|
|
}
|
|
function encodeAsync(value, path) {
|
|
if (isPromise(value)) return [CHUNK_VALUE_TYPE_PROMISE, encodePromise(value, path)];
|
|
if (require_codes.isAsyncIterable(value)) {
|
|
if (opts.maxDepth && path.length >= opts.maxDepth) throw new Error("Max depth reached");
|
|
return [CHUNK_VALUE_TYPE_ASYNC_ITERABLE, encodeAsyncIterable(value, path)];
|
|
}
|
|
return null;
|
|
}
|
|
function encode(value, path) {
|
|
if (value === void 0) return [[]];
|
|
const reg = encodeAsync(value, path);
|
|
if (reg) return [[placeholder], [null, ...reg]];
|
|
if (!isPlainObject(value)) return [[value]];
|
|
const newObj = require_codes.emptyObject();
|
|
const asyncValues = [];
|
|
for (const [key, item] of Object.entries(value)) {
|
|
const transformed = encodeAsync(item, [...path, key]);
|
|
if (!transformed) {
|
|
newObj[key] = item;
|
|
continue;
|
|
}
|
|
newObj[key] = placeholder;
|
|
asyncValues.push([key, ...transformed]);
|
|
}
|
|
return [[newObj], ...asyncValues];
|
|
}
|
|
const newHead = require_codes.emptyObject();
|
|
for (const [key, item] of Object.entries(data)) newHead[key] = encode(item, [key]);
|
|
yield newHead;
|
|
let iterable = mergedIterables;
|
|
if (opts.pingMs) iterable = withPing(mergedIterables, opts.pingMs);
|
|
var _iteratorAbruptCompletion = false;
|
|
var _didIteratorError = false;
|
|
var _iteratorError;
|
|
try {
|
|
for (var _iterator = (0, import_asyncIterator$1.default)(iterable), _step; _iteratorAbruptCompletion = !(_step = yield (0, import_awaitAsyncGenerator$1.default)(_iterator.next())).done; _iteratorAbruptCompletion = false) {
|
|
const value = _step.value;
|
|
yield value;
|
|
}
|
|
} catch (err) {
|
|
_didIteratorError = true;
|
|
_iteratorError = err;
|
|
} finally {
|
|
try {
|
|
if (_iteratorAbruptCompletion && _iterator.return != null) yield (0, import_awaitAsyncGenerator$1.default)(_iterator.return());
|
|
} finally {
|
|
if (_didIteratorError) throw _iteratorError;
|
|
}
|
|
}
|
|
});
|
|
return _createBatchStreamProducer.apply(this, arguments);
|
|
}
|
|
/**
|
|
* JSON Lines stream producer
|
|
* @see https://jsonlines.org/
|
|
*/
|
|
function jsonlStreamProducer(opts) {
|
|
let stream = readableStreamFrom(createBatchStreamProducer(opts));
|
|
const { serialize } = opts;
|
|
if (serialize) stream = stream.pipeThrough(new TransformStream({ transform(chunk, controller) {
|
|
if (chunk === PING_SYM) controller.enqueue(PING_SYM);
|
|
else controller.enqueue(serialize(chunk));
|
|
} }));
|
|
return stream.pipeThrough(new TransformStream({ transform(chunk, controller) {
|
|
if (chunk === PING_SYM) controller.enqueue(" ");
|
|
else controller.enqueue(JSON.stringify(chunk) + "\n");
|
|
} })).pipeThrough(new TextEncoderStream());
|
|
}
|
|
var AsyncError = class extends Error {
|
|
constructor(data) {
|
|
super("Received error from server");
|
|
this.data = data;
|
|
}
|
|
};
|
|
const nodeJsStreamToReaderEsque = (source) => {
|
|
return { getReader() {
|
|
const stream = new ReadableStream({ start(controller) {
|
|
source.on("data", (chunk) => {
|
|
controller.enqueue(chunk);
|
|
});
|
|
source.on("end", () => {
|
|
controller.close();
|
|
});
|
|
source.on("error", (error) => {
|
|
controller.error(error);
|
|
});
|
|
} });
|
|
return stream.getReader();
|
|
} };
|
|
};
|
|
function createLineAccumulator(from) {
|
|
const reader = "getReader" in from ? from.getReader() : nodeJsStreamToReaderEsque(from).getReader();
|
|
let lineAggregate = "";
|
|
return new ReadableStream({
|
|
async pull(controller) {
|
|
const { done, value } = await reader.read();
|
|
if (done) controller.close();
|
|
else controller.enqueue(value);
|
|
},
|
|
cancel() {
|
|
return reader.cancel();
|
|
}
|
|
}).pipeThrough(new TextDecoderStream()).pipeThrough(new TransformStream({ transform(chunk, controller) {
|
|
var _parts$pop;
|
|
lineAggregate += chunk;
|
|
const parts = lineAggregate.split("\n");
|
|
lineAggregate = (_parts$pop = parts.pop()) !== null && _parts$pop !== void 0 ? _parts$pop : "";
|
|
for (const part of parts) controller.enqueue(part);
|
|
} }));
|
|
}
|
|
function createConsumerStream(from) {
|
|
const stream = createLineAccumulator(from);
|
|
let sentHead = false;
|
|
return stream.pipeThrough(new TransformStream({ transform(line, controller) {
|
|
if (!sentHead) {
|
|
const head = JSON.parse(line);
|
|
controller.enqueue(head);
|
|
sentHead = true;
|
|
} else {
|
|
const chunk = JSON.parse(line);
|
|
controller.enqueue(chunk);
|
|
}
|
|
} }));
|
|
}
|
|
/**
|
|
* Creates a handler for managing stream controllers and their lifecycle
|
|
*/
|
|
function createStreamsManager(abortController) {
|
|
const controllerMap = /* @__PURE__ */ new Map();
|
|
/**
|
|
* Checks if there are no pending controllers or deferred promises
|
|
*/
|
|
function isEmpty() {
|
|
return Array.from(controllerMap.values()).every((c) => c.closed);
|
|
}
|
|
/**
|
|
* Creates a stream controller
|
|
*/
|
|
function createStreamController() {
|
|
let originalController;
|
|
const stream = new ReadableStream({ start(controller) {
|
|
originalController = controller;
|
|
} });
|
|
const streamController = {
|
|
enqueue: (v) => originalController.enqueue(v),
|
|
close: () => {
|
|
originalController.close();
|
|
clear();
|
|
if (isEmpty()) abortController.abort();
|
|
},
|
|
closed: false,
|
|
getReaderResource: () => {
|
|
const reader = stream.getReader();
|
|
return makeResource(reader, () => {
|
|
streamController.close();
|
|
reader.releaseLock();
|
|
});
|
|
},
|
|
error: (reason) => {
|
|
originalController.error(reason);
|
|
clear();
|
|
}
|
|
};
|
|
function clear() {
|
|
Object.assign(streamController, {
|
|
closed: true,
|
|
close: () => {},
|
|
enqueue: () => {},
|
|
getReaderResource: null,
|
|
error: () => {}
|
|
});
|
|
}
|
|
return streamController;
|
|
}
|
|
/**
|
|
* Gets or creates a stream controller
|
|
*/
|
|
function getOrCreate(chunkId) {
|
|
let c = controllerMap.get(chunkId);
|
|
if (!c) {
|
|
c = createStreamController();
|
|
controllerMap.set(chunkId, c);
|
|
}
|
|
return c;
|
|
}
|
|
/**
|
|
* Cancels all pending controllers and rejects deferred promises
|
|
*/
|
|
function cancelAll(reason) {
|
|
for (const controller of controllerMap.values()) controller.error(reason);
|
|
}
|
|
/**
|
|
* Closes all pending controllers to preserve buffered data
|
|
*/
|
|
function closeAll() {
|
|
for (const controller of controllerMap.values()) controller.close();
|
|
}
|
|
return {
|
|
getOrCreate,
|
|
cancelAll,
|
|
closeAll
|
|
};
|
|
}
|
|
/**
|
|
* JSON Lines stream consumer
|
|
* @see https://jsonlines.org/
|
|
*/
|
|
async function jsonlStreamConsumer(opts) {
|
|
const { deserialize = (v) => v } = opts;
|
|
let source = createConsumerStream(opts.from);
|
|
if (deserialize) source = source.pipeThrough(new TransformStream({ transform(chunk, controller) {
|
|
controller.enqueue(deserialize(chunk));
|
|
} }));
|
|
let headDeferred = createDeferred();
|
|
const streamManager = createStreamsManager(opts.abortController);
|
|
function decodeChunkDefinition(value) {
|
|
const [_path, type, chunkId] = value;
|
|
const controller = streamManager.getOrCreate(chunkId);
|
|
switch (type) {
|
|
case CHUNK_VALUE_TYPE_PROMISE: return require_codes.run(async () => {
|
|
try {
|
|
var _usingCtx3 = (0, import_usingCtx$1.default)();
|
|
const reader = _usingCtx3.u(controller.getReaderResource());
|
|
const { value: value$1 } = await reader.read();
|
|
const [_chunkId, status, data] = value$1;
|
|
switch (status) {
|
|
case PROMISE_STATUS_FULFILLED: return decode(data);
|
|
case PROMISE_STATUS_REJECTED:
|
|
var _opts$formatError3, _opts$formatError4;
|
|
throw (_opts$formatError3 = (_opts$formatError4 = opts.formatError) === null || _opts$formatError4 === void 0 ? void 0 : _opts$formatError4.call(opts, { error: data })) !== null && _opts$formatError3 !== void 0 ? _opts$formatError3 : new AsyncError(data);
|
|
}
|
|
} catch (_) {
|
|
_usingCtx3.e = _;
|
|
} finally {
|
|
_usingCtx3.d();
|
|
}
|
|
});
|
|
case CHUNK_VALUE_TYPE_ASYNC_ITERABLE: return require_codes.run((0, import_wrapAsyncGenerator$2.default)(function* () {
|
|
try {
|
|
var _usingCtx4 = (0, import_usingCtx$1.default)();
|
|
const reader = _usingCtx4.u(controller.getReaderResource());
|
|
while (true) {
|
|
const { value: value$1 } = yield (0, import_awaitAsyncGenerator$1.default)(reader.read());
|
|
const [_chunkId, status, data] = value$1;
|
|
switch (status) {
|
|
case ASYNC_ITERABLE_STATUS_YIELD:
|
|
yield decode(data);
|
|
break;
|
|
case ASYNC_ITERABLE_STATUS_RETURN: return decode(data);
|
|
case ASYNC_ITERABLE_STATUS_ERROR:
|
|
var _opts$formatError5, _opts$formatError6;
|
|
throw (_opts$formatError5 = (_opts$formatError6 = opts.formatError) === null || _opts$formatError6 === void 0 ? void 0 : _opts$formatError6.call(opts, { error: data })) !== null && _opts$formatError5 !== void 0 ? _opts$formatError5 : new AsyncError(data);
|
|
}
|
|
}
|
|
} catch (_) {
|
|
_usingCtx4.e = _;
|
|
} finally {
|
|
_usingCtx4.d();
|
|
}
|
|
}));
|
|
}
|
|
}
|
|
function decode(value) {
|
|
const [[data], ...asyncProps] = value;
|
|
for (const value$1 of asyncProps) {
|
|
const [key] = value$1;
|
|
const decoded = decodeChunkDefinition(value$1);
|
|
if (key === null) return decoded;
|
|
data[key] = decoded;
|
|
}
|
|
return data;
|
|
}
|
|
const handleClose = () => {
|
|
if (headDeferred) {
|
|
headDeferred.reject(new Error("Stream closed before head was received"));
|
|
headDeferred = null;
|
|
}
|
|
streamManager.closeAll();
|
|
};
|
|
const handleAbort = (reason) => {
|
|
headDeferred === null || headDeferred === void 0 || headDeferred.reject(reason);
|
|
headDeferred = null;
|
|
streamManager.cancelAll(reason);
|
|
};
|
|
source.pipeTo(new WritableStream({
|
|
write(chunkOrHead) {
|
|
if (headDeferred) {
|
|
const head = chunkOrHead;
|
|
for (const [key, value] of Object.entries(chunkOrHead)) {
|
|
const parsed = decode(value);
|
|
head[key] = parsed;
|
|
}
|
|
headDeferred.resolve(head);
|
|
headDeferred = null;
|
|
return;
|
|
}
|
|
const chunk = chunkOrHead;
|
|
const [idx] = chunk;
|
|
const controller = streamManager.getOrCreate(idx);
|
|
controller.enqueue(chunk);
|
|
},
|
|
close: handleClose,
|
|
abort: handleAbort
|
|
})).catch((error) => {
|
|
var _opts$onError4;
|
|
(_opts$onError4 = opts.onError) === null || _opts$onError4 === void 0 || _opts$onError4.call(opts, { error });
|
|
handleAbort(error);
|
|
});
|
|
return [await headDeferred.promise];
|
|
}
|
|
|
|
//#endregion
|
|
//#region ../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/asyncGeneratorDelegate.js
|
|
var require_asyncGeneratorDelegate = require_getErrorShape.__commonJS({ "../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/asyncGeneratorDelegate.js"(exports, module) {
|
|
var OverloadYield = require_OverloadYield();
|
|
function _asyncGeneratorDelegate$1(t) {
|
|
var e = {}, n = !1;
|
|
function pump(e$1, r) {
|
|
return n = !0, r = new Promise(function(n$1) {
|
|
n$1(t[e$1](r));
|
|
}), {
|
|
done: !1,
|
|
value: new OverloadYield(r, 1)
|
|
};
|
|
}
|
|
return e["undefined" != typeof Symbol && Symbol.iterator || "@@iterator"] = function() {
|
|
return this;
|
|
}, e.next = function(t$1) {
|
|
return n ? (n = !1, t$1) : pump("next", t$1);
|
|
}, "function" == typeof t["throw"] && (e["throw"] = function(t$1) {
|
|
if (n) throw n = !1, t$1;
|
|
return pump("throw", t$1);
|
|
}), "function" == typeof t["return"] && (e["return"] = function(t$1) {
|
|
return n ? (n = !1, t$1) : pump("return", t$1);
|
|
}), e;
|
|
}
|
|
module.exports = _asyncGeneratorDelegate$1, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
} });
|
|
|
|
//#endregion
|
|
//#region src/unstable-core-do-not-import/stream/sse.ts
|
|
var import_asyncIterator = require_getErrorShape.__toESM(require_asyncIterator(), 1);
|
|
var import_awaitAsyncGenerator = require_getErrorShape.__toESM(require_awaitAsyncGenerator(), 1);
|
|
var import_wrapAsyncGenerator$1 = require_getErrorShape.__toESM(require_wrapAsyncGenerator(), 1);
|
|
var import_asyncGeneratorDelegate = require_getErrorShape.__toESM(require_asyncGeneratorDelegate(), 1);
|
|
var import_usingCtx = require_getErrorShape.__toESM(require_usingCtx(), 1);
|
|
const PING_EVENT = "ping";
|
|
const SERIALIZED_ERROR_EVENT = "serialized-error";
|
|
const CONNECTED_EVENT = "connected";
|
|
const RETURN_EVENT = "return";
|
|
/**
|
|
*
|
|
* @see https://html.spec.whatwg.org/multipage/server-sent-events.html
|
|
*/
|
|
function sseStreamProducer(opts) {
|
|
var _opts$ping$enabled, _opts$ping, _opts$ping$intervalMs, _opts$ping2, _opts$client;
|
|
const { serialize = require_codes.identity } = opts;
|
|
const ping = {
|
|
enabled: (_opts$ping$enabled = (_opts$ping = opts.ping) === null || _opts$ping === void 0 ? void 0 : _opts$ping.enabled) !== null && _opts$ping$enabled !== void 0 ? _opts$ping$enabled : false,
|
|
intervalMs: (_opts$ping$intervalMs = (_opts$ping2 = opts.ping) === null || _opts$ping2 === void 0 ? void 0 : _opts$ping2.intervalMs) !== null && _opts$ping$intervalMs !== void 0 ? _opts$ping$intervalMs : 1e3
|
|
};
|
|
const client = (_opts$client = opts.client) !== null && _opts$client !== void 0 ? _opts$client : {};
|
|
if (ping.enabled && client.reconnectAfterInactivityMs && ping.intervalMs > client.reconnectAfterInactivityMs) throw new Error(`Ping interval must be less than client reconnect interval to prevent unnecessary reconnection - ping.intervalMs: ${ping.intervalMs} client.reconnectAfterInactivityMs: ${client.reconnectAfterInactivityMs}`);
|
|
function generator() {
|
|
return _generator.apply(this, arguments);
|
|
}
|
|
function _generator() {
|
|
_generator = (0, import_wrapAsyncGenerator$1.default)(function* () {
|
|
yield {
|
|
event: CONNECTED_EVENT,
|
|
data: JSON.stringify(client)
|
|
};
|
|
let iterable = opts.data;
|
|
if (opts.emitAndEndImmediately) iterable = takeWithGrace(iterable, {
|
|
count: 1,
|
|
gracePeriodMs: 1
|
|
});
|
|
if (ping.enabled && ping.intervalMs !== Infinity && ping.intervalMs > 0) iterable = withPing(iterable, ping.intervalMs);
|
|
let value;
|
|
let chunk;
|
|
var _iteratorAbruptCompletion = false;
|
|
var _didIteratorError = false;
|
|
var _iteratorError;
|
|
try {
|
|
for (var _iterator = (0, import_asyncIterator.default)(iterable), _step; _iteratorAbruptCompletion = !(_step = yield (0, import_awaitAsyncGenerator.default)(_iterator.next())).done; _iteratorAbruptCompletion = false) {
|
|
value = _step.value;
|
|
{
|
|
if (value === PING_SYM) {
|
|
yield {
|
|
event: PING_EVENT,
|
|
data: ""
|
|
};
|
|
continue;
|
|
}
|
|
chunk = require_tracked.isTrackedEnvelope(value) ? {
|
|
id: value[0],
|
|
data: value[1]
|
|
} : { data: value };
|
|
chunk.data = JSON.stringify(serialize(chunk.data));
|
|
yield chunk;
|
|
value = null;
|
|
chunk = null;
|
|
}
|
|
}
|
|
} catch (err) {
|
|
_didIteratorError = true;
|
|
_iteratorError = err;
|
|
} finally {
|
|
try {
|
|
if (_iteratorAbruptCompletion && _iterator.return != null) yield (0, import_awaitAsyncGenerator.default)(_iterator.return());
|
|
} finally {
|
|
if (_didIteratorError) throw _iteratorError;
|
|
}
|
|
}
|
|
});
|
|
return _generator.apply(this, arguments);
|
|
}
|
|
function generatorWithErrorHandling() {
|
|
return _generatorWithErrorHandling.apply(this, arguments);
|
|
}
|
|
function _generatorWithErrorHandling() {
|
|
_generatorWithErrorHandling = (0, import_wrapAsyncGenerator$1.default)(function* () {
|
|
try {
|
|
yield* (0, import_asyncGeneratorDelegate.default)((0, import_asyncIterator.default)(generator()));
|
|
yield {
|
|
event: RETURN_EVENT,
|
|
data: ""
|
|
};
|
|
} catch (cause) {
|
|
var _opts$formatError, _opts$formatError2;
|
|
if (isAbortError(cause)) return;
|
|
const error = require_tracked.getTRPCErrorFromUnknown(cause);
|
|
const data = (_opts$formatError = (_opts$formatError2 = opts.formatError) === null || _opts$formatError2 === void 0 ? void 0 : _opts$formatError2.call(opts, { error })) !== null && _opts$formatError !== void 0 ? _opts$formatError : null;
|
|
yield {
|
|
event: SERIALIZED_ERROR_EVENT,
|
|
data: JSON.stringify(serialize(data))
|
|
};
|
|
}
|
|
});
|
|
return _generatorWithErrorHandling.apply(this, arguments);
|
|
}
|
|
const stream = readableStreamFrom(generatorWithErrorHandling());
|
|
return stream.pipeThrough(new TransformStream({ transform(chunk, controller) {
|
|
if ("event" in chunk) controller.enqueue(`event: ${chunk.event}\n`);
|
|
if ("data" in chunk) controller.enqueue(`data: ${chunk.data}\n`);
|
|
if ("id" in chunk) controller.enqueue(`id: ${chunk.id}\n`);
|
|
if ("comment" in chunk) controller.enqueue(`: ${chunk.comment}\n`);
|
|
controller.enqueue("\n\n");
|
|
} })).pipeThrough(new TextEncoderStream());
|
|
}
|
|
async function withTimeout(opts) {
|
|
try {
|
|
var _usingCtx$1 = (0, import_usingCtx.default)();
|
|
const timeoutPromise = _usingCtx$1.u(timerResource(opts.timeoutMs));
|
|
const res = await Unpromise.race([opts.promise, timeoutPromise.start()]);
|
|
if (res === disposablePromiseTimerResult) return await opts.onTimeout();
|
|
return res;
|
|
} catch (_) {
|
|
_usingCtx$1.e = _;
|
|
} finally {
|
|
_usingCtx$1.d();
|
|
}
|
|
}
|
|
/**
|
|
* @see https://html.spec.whatwg.org/multipage/server-sent-events.html
|
|
*/
|
|
function sseStreamConsumer(opts) {
|
|
const { deserialize = (v) => v } = opts;
|
|
let clientOptions = require_codes.emptyObject();
|
|
const signal = opts.signal;
|
|
let _es = null;
|
|
const createStream = () => new ReadableStream({
|
|
async start(controller) {
|
|
const [url, init] = await Promise.all([opts.url(), opts.init()]);
|
|
const eventSource = _es = new opts.EventSource(url, init);
|
|
controller.enqueue({
|
|
type: "connecting",
|
|
eventSource: _es,
|
|
event: null
|
|
});
|
|
eventSource.addEventListener(CONNECTED_EVENT, (_msg) => {
|
|
const msg = _msg;
|
|
const options = JSON.parse(msg.data);
|
|
clientOptions = options;
|
|
controller.enqueue({
|
|
type: "connected",
|
|
options,
|
|
eventSource
|
|
});
|
|
});
|
|
eventSource.addEventListener(SERIALIZED_ERROR_EVENT, (_msg) => {
|
|
const msg = _msg;
|
|
controller.enqueue({
|
|
type: "serialized-error",
|
|
error: deserialize(JSON.parse(msg.data)),
|
|
eventSource
|
|
});
|
|
});
|
|
eventSource.addEventListener(PING_EVENT, () => {
|
|
controller.enqueue({
|
|
type: "ping",
|
|
eventSource
|
|
});
|
|
});
|
|
eventSource.addEventListener(RETURN_EVENT, () => {
|
|
eventSource.close();
|
|
controller.close();
|
|
_es = null;
|
|
});
|
|
eventSource.addEventListener("error", (event) => {
|
|
if (eventSource.readyState === eventSource.CLOSED) controller.error(event);
|
|
else controller.enqueue({
|
|
type: "connecting",
|
|
eventSource,
|
|
event
|
|
});
|
|
});
|
|
eventSource.addEventListener("message", (_msg) => {
|
|
const msg = _msg;
|
|
const chunk = deserialize(JSON.parse(msg.data));
|
|
const def = { data: chunk };
|
|
if (msg.lastEventId) def.id = msg.lastEventId;
|
|
controller.enqueue({
|
|
type: "data",
|
|
data: def,
|
|
eventSource
|
|
});
|
|
});
|
|
const onAbort = () => {
|
|
try {
|
|
eventSource.close();
|
|
controller.close();
|
|
} catch (_unused) {}
|
|
};
|
|
if (signal.aborted) onAbort();
|
|
else signal.addEventListener("abort", onAbort);
|
|
},
|
|
cancel() {
|
|
_es === null || _es === void 0 || _es.close();
|
|
}
|
|
});
|
|
const getStreamResource = () => {
|
|
let stream = createStream();
|
|
let reader = stream.getReader();
|
|
async function dispose() {
|
|
await reader.cancel();
|
|
_es = null;
|
|
}
|
|
return makeAsyncResource({
|
|
read() {
|
|
return reader.read();
|
|
},
|
|
async recreate() {
|
|
await dispose();
|
|
stream = createStream();
|
|
reader = stream.getReader();
|
|
}
|
|
}, dispose);
|
|
};
|
|
return require_codes.run((0, import_wrapAsyncGenerator$1.default)(function* () {
|
|
try {
|
|
var _usingCtx3 = (0, import_usingCtx.default)();
|
|
const stream = _usingCtx3.a(getStreamResource());
|
|
while (true) {
|
|
let promise = stream.read();
|
|
const timeoutMs = clientOptions.reconnectAfterInactivityMs;
|
|
if (timeoutMs) promise = withTimeout({
|
|
promise,
|
|
timeoutMs,
|
|
onTimeout: async () => {
|
|
const res = {
|
|
value: {
|
|
type: "timeout",
|
|
ms: timeoutMs,
|
|
eventSource: _es
|
|
},
|
|
done: false
|
|
};
|
|
await stream.recreate();
|
|
return res;
|
|
}
|
|
});
|
|
const result = yield (0, import_awaitAsyncGenerator.default)(promise);
|
|
if (result.done) return result.value;
|
|
yield result.value;
|
|
}
|
|
} catch (_) {
|
|
_usingCtx3.e = _;
|
|
} finally {
|
|
yield (0, import_awaitAsyncGenerator.default)(_usingCtx3.d());
|
|
}
|
|
}));
|
|
}
|
|
const sseHeaders = {
|
|
"Content-Type": "text/event-stream",
|
|
"Cache-Control": "no-cache, no-transform",
|
|
"X-Accel-Buffering": "no",
|
|
Connection: "keep-alive"
|
|
};
|
|
|
|
//#endregion
|
|
//#region src/unstable-core-do-not-import/http/resolveResponse.ts
|
|
var import_wrapAsyncGenerator = require_getErrorShape.__toESM(require_wrapAsyncGenerator(), 1);
|
|
var import_objectSpread2 = require_getErrorShape.__toESM(require_getErrorShape.require_objectSpread2(), 1);
|
|
function errorToAsyncIterable(err) {
|
|
return require_codes.run((0, import_wrapAsyncGenerator.default)(function* () {
|
|
throw err;
|
|
}));
|
|
}
|
|
function combinedAbortController(signal) {
|
|
const controller = new AbortController();
|
|
const combinedSignal = require_codes.abortSignalsAnyPonyfill([signal, controller.signal]);
|
|
return {
|
|
signal: combinedSignal,
|
|
controller
|
|
};
|
|
}
|
|
const TYPE_ACCEPTED_METHOD_MAP = {
|
|
mutation: ["POST"],
|
|
query: ["GET"],
|
|
subscription: ["GET"]
|
|
};
|
|
const TYPE_ACCEPTED_METHOD_MAP_WITH_METHOD_OVERRIDE = {
|
|
mutation: ["POST"],
|
|
query: ["GET", "POST"],
|
|
subscription: ["GET", "POST"]
|
|
};
|
|
function initResponse(initOpts) {
|
|
var _responseMeta, _info$calls$find$proc, _info$calls$find;
|
|
const { ctx, info, responseMeta, untransformedJSON, errors = [], headers } = initOpts;
|
|
let status = untransformedJSON ? require_getErrorShape.getHTTPStatusCode(untransformedJSON) : 200;
|
|
const eagerGeneration = !untransformedJSON;
|
|
const data = eagerGeneration ? [] : Array.isArray(untransformedJSON) ? untransformedJSON : [untransformedJSON];
|
|
const meta = (_responseMeta = responseMeta === null || responseMeta === void 0 ? void 0 : responseMeta({
|
|
ctx,
|
|
info,
|
|
paths: info === null || info === void 0 ? void 0 : info.calls.map((call) => call.path),
|
|
data,
|
|
errors,
|
|
eagerGeneration,
|
|
type: (_info$calls$find$proc = info === null || info === void 0 || (_info$calls$find = info.calls.find((call) => {
|
|
var _call$procedure;
|
|
return (_call$procedure = call.procedure) === null || _call$procedure === void 0 ? void 0 : _call$procedure._def.type;
|
|
})) === null || _info$calls$find === void 0 || (_info$calls$find = _info$calls$find.procedure) === null || _info$calls$find === void 0 ? void 0 : _info$calls$find._def.type) !== null && _info$calls$find$proc !== void 0 ? _info$calls$find$proc : "unknown"
|
|
})) !== null && _responseMeta !== void 0 ? _responseMeta : {};
|
|
if (meta.headers) {
|
|
if (meta.headers instanceof Headers) for (const [key, value] of meta.headers.entries()) headers.append(key, value);
|
|
else
|
|
/**
|
|
* @deprecated, delete in v12
|
|
*/
|
|
for (const [key, value] of Object.entries(meta.headers)) if (Array.isArray(value)) for (const v of value) headers.append(key, v);
|
|
else if (typeof value === "string") headers.set(key, value);
|
|
}
|
|
if (meta.status) status = meta.status;
|
|
return { status };
|
|
}
|
|
function caughtErrorToData(cause, errorOpts) {
|
|
const { router, req, onError } = errorOpts.opts;
|
|
const error = require_tracked.getTRPCErrorFromUnknown(cause);
|
|
onError === null || onError === void 0 || onError({
|
|
error,
|
|
path: errorOpts.path,
|
|
input: errorOpts.input,
|
|
ctx: errorOpts.ctx,
|
|
type: errorOpts.type,
|
|
req
|
|
});
|
|
const untransformedJSON = { error: require_getErrorShape.getErrorShape({
|
|
config: router._def._config,
|
|
error,
|
|
type: errorOpts.type,
|
|
path: errorOpts.path,
|
|
input: errorOpts.input,
|
|
ctx: errorOpts.ctx
|
|
}) };
|
|
const transformedJSON = require_tracked.transformTRPCResponse(router._def._config, untransformedJSON);
|
|
const body = JSON.stringify(transformedJSON);
|
|
return {
|
|
error,
|
|
untransformedJSON,
|
|
body
|
|
};
|
|
}
|
|
/**
|
|
* Check if a value is a stream-like object
|
|
* - if it's an async iterable
|
|
* - if it's an object with async iterables or promises
|
|
*/
|
|
function isDataStream(v) {
|
|
if (!require_codes.isObject(v)) return false;
|
|
if (require_codes.isAsyncIterable(v)) return true;
|
|
return Object.values(v).some(isPromise) || Object.values(v).some(require_codes.isAsyncIterable);
|
|
}
|
|
async function resolveResponse(opts) {
|
|
var _ref, _opts$allowBatching, _opts$batching, _opts$allowMethodOver, _config$sse$enabled, _config$sse;
|
|
const { router, req } = opts;
|
|
const headers = new Headers([["vary", "trpc-accept, accept"]]);
|
|
const config = router._def._config;
|
|
const url = new URL(req.url);
|
|
if (req.method === "HEAD") return new Response(null, { status: 204 });
|
|
const allowBatching = (_ref = (_opts$allowBatching = opts.allowBatching) !== null && _opts$allowBatching !== void 0 ? _opts$allowBatching : (_opts$batching = opts.batching) === null || _opts$batching === void 0 ? void 0 : _opts$batching.enabled) !== null && _ref !== void 0 ? _ref : true;
|
|
const allowMethodOverride = ((_opts$allowMethodOver = opts.allowMethodOverride) !== null && _opts$allowMethodOver !== void 0 ? _opts$allowMethodOver : false) && req.method === "POST";
|
|
const infoTuple = await require_codes.run(async () => {
|
|
try {
|
|
return [void 0, await getRequestInfo({
|
|
req,
|
|
path: decodeURIComponent(opts.path),
|
|
router,
|
|
searchParams: url.searchParams,
|
|
headers: opts.req.headers,
|
|
url,
|
|
maxBatchSize: opts.maxBatchSize
|
|
})];
|
|
} catch (cause) {
|
|
return [require_tracked.getTRPCErrorFromUnknown(cause), void 0];
|
|
}
|
|
});
|
|
const ctxManager = require_codes.run(() => {
|
|
let result = void 0;
|
|
return {
|
|
valueOrUndefined: () => {
|
|
if (!result) return void 0;
|
|
return result[1];
|
|
},
|
|
value: () => {
|
|
const [err, ctx] = result;
|
|
if (err) throw err;
|
|
return ctx;
|
|
},
|
|
create: async (info) => {
|
|
if (result) throw new Error("This should only be called once - report a bug in tRPC");
|
|
try {
|
|
const ctx = await opts.createContext({ info });
|
|
result = [void 0, ctx];
|
|
} catch (cause) {
|
|
result = [require_tracked.getTRPCErrorFromUnknown(cause), void 0];
|
|
}
|
|
}
|
|
};
|
|
});
|
|
const methodMapper = allowMethodOverride ? TYPE_ACCEPTED_METHOD_MAP_WITH_METHOD_OVERRIDE : TYPE_ACCEPTED_METHOD_MAP;
|
|
/**
|
|
* @deprecated
|
|
*/
|
|
const isStreamCall = getAcceptHeader(req.headers) === "application/jsonl";
|
|
const experimentalSSE = (_config$sse$enabled = (_config$sse = config.sse) === null || _config$sse === void 0 ? void 0 : _config$sse.enabled) !== null && _config$sse$enabled !== void 0 ? _config$sse$enabled : true;
|
|
try {
|
|
const [infoError, info] = infoTuple;
|
|
if (infoError) throw infoError;
|
|
if (info.isBatchCall && !allowBatching) throw new require_tracked.TRPCError({
|
|
code: "BAD_REQUEST",
|
|
message: `Batching is not enabled on the server`
|
|
});
|
|
/* istanbul ignore if -- @preserve */
|
|
if (isStreamCall && !info.isBatchCall) throw new require_tracked.TRPCError({
|
|
message: `Streaming requests must be batched (you can do a batch of 1)`,
|
|
code: "BAD_REQUEST"
|
|
});
|
|
await ctxManager.create(info);
|
|
const rpcCalls = info.calls.map(async (call) => {
|
|
const proc = call.procedure;
|
|
const combinedAbort = combinedAbortController(opts.req.signal);
|
|
try {
|
|
if (opts.error) throw opts.error;
|
|
if (!proc) throw new require_tracked.TRPCError({
|
|
code: "NOT_FOUND",
|
|
message: `No procedure found on path "${call.path}"`
|
|
});
|
|
if (!methodMapper[proc._def.type].includes(req.method)) throw new require_tracked.TRPCError({
|
|
code: "METHOD_NOT_SUPPORTED",
|
|
message: `Unsupported ${req.method}-request to ${proc._def.type} procedure at path "${call.path}"`
|
|
});
|
|
if (proc._def.type === "subscription") {
|
|
var _config$sse2;
|
|
/* istanbul ignore if -- @preserve */
|
|
if (info.isBatchCall) throw new require_tracked.TRPCError({
|
|
code: "BAD_REQUEST",
|
|
message: `Cannot batch subscription calls`
|
|
});
|
|
if ((_config$sse2 = config.sse) === null || _config$sse2 === void 0 ? void 0 : _config$sse2.maxDurationMs) {
|
|
function cleanup() {
|
|
clearTimeout(timer);
|
|
combinedAbort.signal.removeEventListener("abort", cleanup);
|
|
combinedAbort.controller.abort();
|
|
}
|
|
const timer = setTimeout(cleanup, config.sse.maxDurationMs);
|
|
combinedAbort.signal.addEventListener("abort", cleanup);
|
|
}
|
|
}
|
|
const data = await proc({
|
|
path: call.path,
|
|
getRawInput: call.getRawInput,
|
|
ctx: ctxManager.value(),
|
|
type: proc._def.type,
|
|
signal: combinedAbort.signal,
|
|
batchIndex: call.batchIndex
|
|
});
|
|
return [void 0, {
|
|
data,
|
|
signal: proc._def.type === "subscription" ? combinedAbort.signal : void 0
|
|
}];
|
|
} catch (cause) {
|
|
var _opts$onError, _call$procedure$_def$, _call$procedure2;
|
|
const error = require_tracked.getTRPCErrorFromUnknown(cause);
|
|
const input = call.result();
|
|
(_opts$onError = opts.onError) === null || _opts$onError === void 0 || _opts$onError.call(opts, {
|
|
error,
|
|
path: call.path,
|
|
input,
|
|
ctx: ctxManager.valueOrUndefined(),
|
|
type: (_call$procedure$_def$ = (_call$procedure2 = call.procedure) === null || _call$procedure2 === void 0 ? void 0 : _call$procedure2._def.type) !== null && _call$procedure$_def$ !== void 0 ? _call$procedure$_def$ : "unknown",
|
|
req: opts.req
|
|
});
|
|
return [error, void 0];
|
|
}
|
|
});
|
|
if (!info.isBatchCall) {
|
|
const [call] = info.calls;
|
|
const [error, result] = await rpcCalls[0];
|
|
switch (info.type) {
|
|
case "unknown":
|
|
case "mutation":
|
|
case "query": {
|
|
headers.set("content-type", "application/json");
|
|
if (isDataStream(result === null || result === void 0 ? void 0 : result.data)) throw new require_tracked.TRPCError({
|
|
code: "UNSUPPORTED_MEDIA_TYPE",
|
|
message: "Cannot use stream-like response in non-streaming request - use httpBatchStreamLink"
|
|
});
|
|
const res = error ? { error: require_getErrorShape.getErrorShape({
|
|
config,
|
|
ctx: ctxManager.valueOrUndefined(),
|
|
error,
|
|
input: call.result(),
|
|
path: call.path,
|
|
type: info.type
|
|
}) } : { result: { data: result.data } };
|
|
const headResponse$1 = initResponse({
|
|
ctx: ctxManager.valueOrUndefined(),
|
|
info,
|
|
responseMeta: opts.responseMeta,
|
|
errors: error ? [error] : [],
|
|
headers,
|
|
untransformedJSON: [res]
|
|
});
|
|
return new Response(JSON.stringify(require_tracked.transformTRPCResponse(config, res)), {
|
|
status: headResponse$1.status,
|
|
headers
|
|
});
|
|
}
|
|
case "subscription": {
|
|
const iterable = require_codes.run(() => {
|
|
if (error) return errorToAsyncIterable(error);
|
|
if (!experimentalSSE) return errorToAsyncIterable(new require_tracked.TRPCError({
|
|
code: "METHOD_NOT_SUPPORTED",
|
|
message: "Missing experimental flag \"sseSubscriptions\""
|
|
}));
|
|
if (!require_observable.isObservable(result.data) && !require_codes.isAsyncIterable(result.data)) return errorToAsyncIterable(new require_tracked.TRPCError({
|
|
message: `Subscription ${call.path} did not return an observable or a AsyncGenerator`,
|
|
code: "INTERNAL_SERVER_ERROR"
|
|
}));
|
|
const dataAsIterable = require_observable.isObservable(result.data) ? require_observable.observableToAsyncIterable(result.data, opts.req.signal) : result.data;
|
|
return dataAsIterable;
|
|
});
|
|
const stream = sseStreamProducer((0, import_objectSpread2.default)((0, import_objectSpread2.default)({}, config.sse), {}, {
|
|
data: iterable,
|
|
serialize: (v) => config.transformer.output.serialize(v),
|
|
formatError(errorOpts) {
|
|
var _call$procedure$_def$2, _call$procedure3, _opts$onError2;
|
|
const error$1 = require_tracked.getTRPCErrorFromUnknown(errorOpts.error);
|
|
const input = call === null || call === void 0 ? void 0 : call.result();
|
|
const path = call === null || call === void 0 ? void 0 : call.path;
|
|
const type = (_call$procedure$_def$2 = call === null || call === void 0 || (_call$procedure3 = call.procedure) === null || _call$procedure3 === void 0 ? void 0 : _call$procedure3._def.type) !== null && _call$procedure$_def$2 !== void 0 ? _call$procedure$_def$2 : "unknown";
|
|
(_opts$onError2 = opts.onError) === null || _opts$onError2 === void 0 || _opts$onError2.call(opts, {
|
|
error: error$1,
|
|
path,
|
|
input,
|
|
ctx: ctxManager.valueOrUndefined(),
|
|
req: opts.req,
|
|
type
|
|
});
|
|
const shape = require_getErrorShape.getErrorShape({
|
|
config,
|
|
ctx: ctxManager.valueOrUndefined(),
|
|
error: error$1,
|
|
input,
|
|
path,
|
|
type
|
|
});
|
|
return shape;
|
|
}
|
|
}));
|
|
for (const [key, value] of Object.entries(sseHeaders)) headers.set(key, value);
|
|
const headResponse$1 = initResponse({
|
|
ctx: ctxManager.valueOrUndefined(),
|
|
info,
|
|
responseMeta: opts.responseMeta,
|
|
errors: [],
|
|
headers,
|
|
untransformedJSON: null
|
|
});
|
|
const abortSignal = result === null || result === void 0 ? void 0 : result.signal;
|
|
let responseBody = stream;
|
|
if (abortSignal) {
|
|
const reader = stream.getReader();
|
|
const onAbort = () => void reader.cancel();
|
|
if (abortSignal.aborted) onAbort();
|
|
else abortSignal.addEventListener("abort", onAbort, { once: true });
|
|
responseBody = new ReadableStream({
|
|
async pull(controller) {
|
|
const chunk = await reader.read();
|
|
if (chunk.done) {
|
|
abortSignal.removeEventListener("abort", onAbort);
|
|
controller.close();
|
|
} else controller.enqueue(chunk.value);
|
|
},
|
|
cancel() {
|
|
abortSignal.removeEventListener("abort", onAbort);
|
|
return reader.cancel();
|
|
}
|
|
});
|
|
}
|
|
return new Response(responseBody, {
|
|
headers,
|
|
status: headResponse$1.status
|
|
});
|
|
}
|
|
}
|
|
}
|
|
if (info.accept === "application/jsonl") {
|
|
headers.set("content-type", "application/json");
|
|
headers.set("transfer-encoding", "chunked");
|
|
const headResponse$1 = initResponse({
|
|
ctx: ctxManager.valueOrUndefined(),
|
|
info,
|
|
responseMeta: opts.responseMeta,
|
|
errors: [],
|
|
headers,
|
|
untransformedJSON: null
|
|
});
|
|
const stream = jsonlStreamProducer((0, import_objectSpread2.default)((0, import_objectSpread2.default)({}, config.jsonl), {}, {
|
|
maxDepth: Infinity,
|
|
data: rpcCalls.map(async (res, index) => {
|
|
const [error, result] = await res;
|
|
const call = info.calls[index];
|
|
if (error) {
|
|
var _procedure$_def$type, _procedure;
|
|
return { error: require_getErrorShape.getErrorShape({
|
|
config,
|
|
ctx: ctxManager.valueOrUndefined(),
|
|
error,
|
|
input: call.result(),
|
|
path: call.path,
|
|
type: (_procedure$_def$type = (_procedure = call.procedure) === null || _procedure === void 0 ? void 0 : _procedure._def.type) !== null && _procedure$_def$type !== void 0 ? _procedure$_def$type : "unknown"
|
|
}) };
|
|
}
|
|
/**
|
|
* Not very pretty, but we need to wrap nested data in promises
|
|
* Our stream producer will only resolve top-level async values or async values that are directly nested in another async value
|
|
*/
|
|
const iterable = require_observable.isObservable(result.data) ? require_observable.observableToAsyncIterable(result.data, opts.req.signal) : Promise.resolve(result.data);
|
|
return { result: Promise.resolve({ data: iterable }) };
|
|
}),
|
|
serialize: (data) => config.transformer.output.serialize(data),
|
|
onError: (cause) => {
|
|
var _opts$onError3, _info$type;
|
|
(_opts$onError3 = opts.onError) === null || _opts$onError3 === void 0 || _opts$onError3.call(opts, {
|
|
error: require_tracked.getTRPCErrorFromUnknown(cause),
|
|
path: void 0,
|
|
input: void 0,
|
|
ctx: ctxManager.valueOrUndefined(),
|
|
req: opts.req,
|
|
type: (_info$type = info === null || info === void 0 ? void 0 : info.type) !== null && _info$type !== void 0 ? _info$type : "unknown"
|
|
});
|
|
},
|
|
formatError(errorOpts) {
|
|
var _call$procedure$_def$3, _call$procedure4;
|
|
const call = info === null || info === void 0 ? void 0 : info.calls[errorOpts.path[0]];
|
|
const error = require_tracked.getTRPCErrorFromUnknown(errorOpts.error);
|
|
const input = call === null || call === void 0 ? void 0 : call.result();
|
|
const path = call === null || call === void 0 ? void 0 : call.path;
|
|
const type = (_call$procedure$_def$3 = call === null || call === void 0 || (_call$procedure4 = call.procedure) === null || _call$procedure4 === void 0 ? void 0 : _call$procedure4._def.type) !== null && _call$procedure$_def$3 !== void 0 ? _call$procedure$_def$3 : "unknown";
|
|
const shape = require_getErrorShape.getErrorShape({
|
|
config,
|
|
ctx: ctxManager.valueOrUndefined(),
|
|
error,
|
|
input,
|
|
path,
|
|
type
|
|
});
|
|
return shape;
|
|
}
|
|
}));
|
|
return new Response(stream, {
|
|
headers,
|
|
status: headResponse$1.status
|
|
});
|
|
}
|
|
/**
|
|
* Non-streaming response:
|
|
* - await all responses in parallel, blocking on the slowest one
|
|
* - create headers with known response body
|
|
* - return a complete HTTPResponse
|
|
*/
|
|
headers.set("content-type", "application/json");
|
|
const results = (await Promise.all(rpcCalls)).map((res) => {
|
|
const [error, result] = res;
|
|
if (error) return res;
|
|
if (isDataStream(result.data)) return [new require_tracked.TRPCError({
|
|
code: "UNSUPPORTED_MEDIA_TYPE",
|
|
message: "Cannot use stream-like response in non-streaming request - use httpBatchStreamLink"
|
|
}), void 0];
|
|
return res;
|
|
});
|
|
const resultAsRPCResponse = results.map(([error, result], index) => {
|
|
const call = info.calls[index];
|
|
if (error) {
|
|
var _call$procedure$_def$4, _call$procedure5;
|
|
return { error: require_getErrorShape.getErrorShape({
|
|
config,
|
|
ctx: ctxManager.valueOrUndefined(),
|
|
error,
|
|
input: call.result(),
|
|
path: call.path,
|
|
type: (_call$procedure$_def$4 = (_call$procedure5 = call.procedure) === null || _call$procedure5 === void 0 ? void 0 : _call$procedure5._def.type) !== null && _call$procedure$_def$4 !== void 0 ? _call$procedure$_def$4 : "unknown"
|
|
}) };
|
|
}
|
|
return { result: { data: result.data } };
|
|
});
|
|
const errors = results.map(([error]) => error).filter(Boolean);
|
|
const headResponse = initResponse({
|
|
ctx: ctxManager.valueOrUndefined(),
|
|
info,
|
|
responseMeta: opts.responseMeta,
|
|
untransformedJSON: resultAsRPCResponse,
|
|
errors,
|
|
headers
|
|
});
|
|
return new Response(JSON.stringify(require_tracked.transformTRPCResponse(config, resultAsRPCResponse)), {
|
|
status: headResponse.status,
|
|
headers
|
|
});
|
|
} catch (cause) {
|
|
var _info$type2;
|
|
const [_infoError, info] = infoTuple;
|
|
const ctx = ctxManager.valueOrUndefined();
|
|
const { error, untransformedJSON, body } = caughtErrorToData(cause, {
|
|
opts,
|
|
ctx: ctxManager.valueOrUndefined(),
|
|
type: (_info$type2 = info === null || info === void 0 ? void 0 : info.type) !== null && _info$type2 !== void 0 ? _info$type2 : "unknown"
|
|
});
|
|
const headResponse = initResponse({
|
|
ctx,
|
|
info,
|
|
responseMeta: opts.responseMeta,
|
|
untransformedJSON,
|
|
errors: [error],
|
|
headers
|
|
});
|
|
return new Response(body, {
|
|
status: headResponse.status,
|
|
headers
|
|
});
|
|
}
|
|
}
|
|
|
|
//#endregion
|
|
Object.defineProperty(exports, 'Unpromise', {
|
|
enumerable: true,
|
|
get: function () {
|
|
return Unpromise;
|
|
}
|
|
});
|
|
Object.defineProperty(exports, 'createDeferred', {
|
|
enumerable: true,
|
|
get: function () {
|
|
return createDeferred;
|
|
}
|
|
});
|
|
Object.defineProperty(exports, 'getAcceptHeader', {
|
|
enumerable: true,
|
|
get: function () {
|
|
return getAcceptHeader;
|
|
}
|
|
});
|
|
Object.defineProperty(exports, 'getRequestInfo', {
|
|
enumerable: true,
|
|
get: function () {
|
|
return getRequestInfo;
|
|
}
|
|
});
|
|
Object.defineProperty(exports, 'isAbortError', {
|
|
enumerable: true,
|
|
get: function () {
|
|
return isAbortError;
|
|
}
|
|
});
|
|
Object.defineProperty(exports, 'isPromise', {
|
|
enumerable: true,
|
|
get: function () {
|
|
return isPromise;
|
|
}
|
|
});
|
|
Object.defineProperty(exports, 'iteratorResource', {
|
|
enumerable: true,
|
|
get: function () {
|
|
return iteratorResource;
|
|
}
|
|
});
|
|
Object.defineProperty(exports, 'jsonlStreamConsumer', {
|
|
enumerable: true,
|
|
get: function () {
|
|
return jsonlStreamConsumer;
|
|
}
|
|
});
|
|
Object.defineProperty(exports, 'jsonlStreamProducer', {
|
|
enumerable: true,
|
|
get: function () {
|
|
return jsonlStreamProducer;
|
|
}
|
|
});
|
|
Object.defineProperty(exports, 'makeAsyncResource', {
|
|
enumerable: true,
|
|
get: function () {
|
|
return makeAsyncResource;
|
|
}
|
|
});
|
|
Object.defineProperty(exports, 'makeResource', {
|
|
enumerable: true,
|
|
get: function () {
|
|
return makeResource;
|
|
}
|
|
});
|
|
Object.defineProperty(exports, 'parseConnectionParamsFromString', {
|
|
enumerable: true,
|
|
get: function () {
|
|
return parseConnectionParamsFromString;
|
|
}
|
|
});
|
|
Object.defineProperty(exports, 'parseConnectionParamsFromUnknown', {
|
|
enumerable: true,
|
|
get: function () {
|
|
return parseConnectionParamsFromUnknown;
|
|
}
|
|
});
|
|
Object.defineProperty(exports, 'require_usingCtx', {
|
|
enumerable: true,
|
|
get: function () {
|
|
return require_usingCtx;
|
|
}
|
|
});
|
|
Object.defineProperty(exports, 'resolveResponse', {
|
|
enumerable: true,
|
|
get: function () {
|
|
return resolveResponse;
|
|
}
|
|
});
|
|
Object.defineProperty(exports, 'sseHeaders', {
|
|
enumerable: true,
|
|
get: function () {
|
|
return sseHeaders;
|
|
}
|
|
});
|
|
Object.defineProperty(exports, 'sseStreamConsumer', {
|
|
enumerable: true,
|
|
get: function () {
|
|
return sseStreamConsumer;
|
|
}
|
|
});
|
|
Object.defineProperty(exports, 'sseStreamProducer', {
|
|
enumerable: true,
|
|
get: function () {
|
|
return sseStreamProducer;
|
|
}
|
|
});
|
|
Object.defineProperty(exports, 'takeWithGrace', {
|
|
enumerable: true,
|
|
get: function () {
|
|
return takeWithGrace;
|
|
}
|
|
});
|
|
Object.defineProperty(exports, 'throwAbortError', {
|
|
enumerable: true,
|
|
get: function () {
|
|
return throwAbortError;
|
|
}
|
|
}); |