@orpc/shared 0.0.0-next.39c8cfb → 0.0.0-next.3a0949d
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/dist/index.d.mts +50 -10
- package/dist/index.d.ts +50 -10
- package/dist/index.mjs +123 -70
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<div align="center">
|
|
2
|
-
<image align="center" src="https://orpc.
|
|
2
|
+
<image align="center" src="https://orpc.dev/logo.webp" width=280 alt="oRPC logo" />
|
|
3
3
|
</div>
|
|
4
4
|
|
|
5
5
|
<h1></h1>
|
|
@@ -17,6 +17,9 @@
|
|
|
17
17
|
<a href="https://discord.gg/TXEbwRBvQn">
|
|
18
18
|
<img alt="Discord" src="https://img.shields.io/discord/1308966753044398161?color=7389D8&label&logo=discord&logoColor=ffffff" />
|
|
19
19
|
</a>
|
|
20
|
+
<a href="https://deepwiki.com/unnoq/orpc">
|
|
21
|
+
<img src="https://deepwiki.com/badge.svg" alt="Ask DeepWiki">
|
|
22
|
+
</a>
|
|
20
23
|
</div>
|
|
21
24
|
|
|
22
25
|
<h3 align="center">Typesafe APIs Made Simple 🪄</h3>
|
|
@@ -42,7 +45,7 @@
|
|
|
42
45
|
|
|
43
46
|
## Documentation
|
|
44
47
|
|
|
45
|
-
You can find the full documentation [here](https://orpc.
|
|
48
|
+
You can find the full documentation [here](https://orpc.dev).
|
|
46
49
|
|
|
47
50
|
## Packages
|
|
48
51
|
|
package/dist/index.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Promisable } from 'type-fest';
|
|
2
2
|
export { IsEqual, IsNever, JsonValue, PartialDeep, Promisable } from 'type-fest';
|
|
3
3
|
import { Tracer, TraceAPI, ContextAPI, PropagationAPI, SpanOptions, Context, Span, AttributeValue, Exception } from '@opentelemetry/api';
|
|
4
|
-
export { group, guard, mapEntries, mapValues, omit } from 'radash';
|
|
4
|
+
export { group, guard, mapEntries, mapValues, omit, retry, sleep } from 'radash';
|
|
5
5
|
|
|
6
6
|
type MaybeOptionalOptions<TOptions> = Record<never, never> extends TOptions ? [options?: TOptions] : [options: TOptions];
|
|
7
7
|
declare function resolveMaybeOptionalOptions<T>(rest: MaybeOptionalOptions<T>): T;
|
|
@@ -30,7 +30,7 @@ type OmitChainMethodDeep<T extends object, K extends keyof any> = {
|
|
|
30
30
|
|
|
31
31
|
declare const ORPC_NAME = "orpc";
|
|
32
32
|
declare const ORPC_SHARED_PACKAGE_NAME = "@orpc/shared";
|
|
33
|
-
declare const ORPC_SHARED_PACKAGE_VERSION = "0.0.0-next.
|
|
33
|
+
declare const ORPC_SHARED_PACKAGE_VERSION = "0.0.0-next.3a0949d";
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
36
|
* Error thrown when an operation is aborted.
|
|
@@ -60,7 +60,7 @@ interface EventPublisherSubscribeIteratorOptions extends EventPublisherOptions {
|
|
|
60
60
|
/**
|
|
61
61
|
* Aborts the async iterator. Throws if aborted before or during pulling.
|
|
62
62
|
*/
|
|
63
|
-
signal?: AbortSignal;
|
|
63
|
+
signal?: AbortSignal | undefined;
|
|
64
64
|
}
|
|
65
65
|
declare class EventPublisher<T extends Record<PropertyKey, any>> {
|
|
66
66
|
#private;
|
|
@@ -103,6 +103,14 @@ declare class SequentialIdGenerator {
|
|
|
103
103
|
private index;
|
|
104
104
|
generate(): string;
|
|
105
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* Compares two sequential IDs.
|
|
108
|
+
* Returns:
|
|
109
|
+
* - negative if `a` < `b`
|
|
110
|
+
* - positive if `a` > `b`
|
|
111
|
+
* - 0 if equal
|
|
112
|
+
*/
|
|
113
|
+
declare function compareSequentialIds(a: string, b: string): number;
|
|
106
114
|
|
|
107
115
|
type SetOptional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
|
|
108
116
|
type IntersectPick<T, U> = Pick<T, keyof T & keyof U>;
|
|
@@ -263,6 +271,11 @@ declare function findDeepMatches(check: (value: unknown) => boolean, payload: un
|
|
|
263
271
|
maps: Segment[][];
|
|
264
272
|
values: unknown[];
|
|
265
273
|
};
|
|
274
|
+
/**
|
|
275
|
+
* Get constructor of the value
|
|
276
|
+
*
|
|
277
|
+
*/
|
|
278
|
+
declare function getConstructor(value: unknown): Function | null | undefined;
|
|
266
279
|
/**
|
|
267
280
|
* Check if the value is an object even it created by `Object.create(null)` or more tricky way.
|
|
268
281
|
*/
|
|
@@ -272,18 +285,35 @@ declare function isObject(value: unknown): value is Record<PropertyKey, unknown>
|
|
|
272
285
|
*/
|
|
273
286
|
declare function isTypescriptObject(value: unknown): value is object & Record<PropertyKey, unknown>;
|
|
274
287
|
declare function clone<T>(value: T): T;
|
|
275
|
-
declare function get(object: unknown, path: readonly
|
|
288
|
+
declare function get(object: unknown, path: readonly PropertyKey[]): unknown;
|
|
276
289
|
declare function isPropertyKey(value: unknown): value is PropertyKey;
|
|
277
290
|
declare const NullProtoObj: ({
|
|
278
291
|
new <T extends Record<PropertyKey, unknown>>(): T;
|
|
279
292
|
});
|
|
280
293
|
|
|
294
|
+
type Value<T, TArgs extends any[] = []> = T | ((...args: TArgs) => T);
|
|
295
|
+
declare function value<T, TArgs extends any[]>(value: Value<T, TArgs>, ...args: NoInfer<TArgs>): T extends Value<infer U, any> ? U : never;
|
|
296
|
+
/**
|
|
297
|
+
* Returns the value if it is defined, otherwise returns the fallback
|
|
298
|
+
*/
|
|
299
|
+
declare function fallback<T>(value: T | undefined, fallback: T): T;
|
|
300
|
+
|
|
281
301
|
/**
|
|
282
302
|
* Prevents objects from being awaitable by intercepting the `then` method
|
|
283
303
|
* when called by the native await mechanism. This is useful for preventing
|
|
284
304
|
* accidental awaiting of objects that aren't meant to be promises.
|
|
285
305
|
*/
|
|
286
306
|
declare function preventNativeAwait<T extends object>(target: T): T;
|
|
307
|
+
/**
|
|
308
|
+
* Create a proxy that overlays one object (`overlay`) on top of another (`target`).
|
|
309
|
+
*
|
|
310
|
+
* - Properties from `overlay` take precedence.
|
|
311
|
+
* - Properties not in `overlay` fall back to `target`.
|
|
312
|
+
* - Methods from either object are bound to `overlay` so `this` is consistent.
|
|
313
|
+
*
|
|
314
|
+
* Useful when you want to override or extend behavior without fully copying/merging objects.
|
|
315
|
+
*/
|
|
316
|
+
declare function overlayProxy<T extends object, U extends object>(target: Value<T>, partial: U): U & Omit<T, keyof U>;
|
|
287
317
|
|
|
288
318
|
interface AsyncIdQueueCloseOptions {
|
|
289
319
|
id?: string;
|
|
@@ -291,9 +321,11 @@ interface AsyncIdQueueCloseOptions {
|
|
|
291
321
|
}
|
|
292
322
|
declare class AsyncIdQueue<T> {
|
|
293
323
|
private readonly openIds;
|
|
294
|
-
private readonly
|
|
295
|
-
private readonly
|
|
324
|
+
private readonly queues;
|
|
325
|
+
private readonly waiters;
|
|
296
326
|
get length(): number;
|
|
327
|
+
get waiterIds(): string[];
|
|
328
|
+
hasBufferedItems(id: string): boolean;
|
|
297
329
|
open(id: string): void;
|
|
298
330
|
isOpen(id: string): boolean;
|
|
299
331
|
push(id: string, item: T): void;
|
|
@@ -302,13 +334,21 @@ declare class AsyncIdQueue<T> {
|
|
|
302
334
|
assertOpen(id: string): void;
|
|
303
335
|
}
|
|
304
336
|
|
|
337
|
+
/**
|
|
338
|
+
* Converts a `ReadableStream` into an `AsyncIteratorClass`.
|
|
339
|
+
*/
|
|
305
340
|
declare function streamToAsyncIteratorClass<T>(stream: ReadableStream<T>): AsyncIteratorClass<T>;
|
|
341
|
+
/**
|
|
342
|
+
* Converts an `AsyncIterator` into a `ReadableStream`.
|
|
343
|
+
*/
|
|
306
344
|
declare function asyncIteratorToStream<T>(iterator: AsyncIterator<T>): ReadableStream<T>;
|
|
345
|
+
/**
|
|
346
|
+
* Converts an `AsyncIterator` into a `ReadableStream`, ensuring that
|
|
347
|
+
* all emitted object values are *unproxied* before enqueuing.
|
|
348
|
+
*/
|
|
349
|
+
declare function asyncIteratorToUnproxiedDataStream<T>(iterator: AsyncIterator<T>): ReadableStream<T>;
|
|
307
350
|
|
|
308
351
|
declare function tryDecodeURIComponent(value: string): string;
|
|
309
352
|
|
|
310
|
-
|
|
311
|
-
declare function value<T, TArgs extends any[]>(value: Value<T, TArgs>, ...args: NoInfer<TArgs>): T extends Value<infer U, any> ? U : never;
|
|
312
|
-
|
|
313
|
-
export { AbortError, AsyncIdQueue, AsyncIteratorClass, EventPublisher, NullProtoObj, ORPC_NAME, ORPC_SHARED_PACKAGE_NAME, ORPC_SHARED_PACKAGE_VERSION, SequentialIdGenerator, asyncIteratorToStream, asyncIteratorWithSpan, clone, defer, findDeepMatches, get, getGlobalOtelConfig, intercept, isAsyncIteratorObject, isObject, isPropertyKey, isTypescriptObject, onError, onFinish, onStart, onSuccess, once, parseEmptyableJSON, preventNativeAwait, readAsBuffer, replicateAsyncIterator, resolveMaybeOptionalOptions, runInSpanContext, runWithSpan, sequential, setGlobalOtelConfig, setSpanAttribute, setSpanError, splitInHalf, startSpan, streamToAsyncIteratorClass, stringifyJSON, toArray, toOtelException, toSpanAttributeValue, tryDecodeURIComponent, value };
|
|
353
|
+
export { AbortError, AsyncIdQueue, AsyncIteratorClass, EventPublisher, NullProtoObj, ORPC_NAME, ORPC_SHARED_PACKAGE_NAME, ORPC_SHARED_PACKAGE_VERSION, SequentialIdGenerator, asyncIteratorToStream, asyncIteratorToUnproxiedDataStream, asyncIteratorWithSpan, clone, compareSequentialIds, defer, fallback, findDeepMatches, get, getConstructor, getGlobalOtelConfig, intercept, isAsyncIteratorObject, isObject, isPropertyKey, isTypescriptObject, onError, onFinish, onStart, onSuccess, once, overlayProxy, parseEmptyableJSON, preventNativeAwait, readAsBuffer, replicateAsyncIterator, resolveMaybeOptionalOptions, runInSpanContext, runWithSpan, sequential, setGlobalOtelConfig, setSpanAttribute, setSpanError, splitInHalf, startSpan, streamToAsyncIteratorClass, stringifyJSON, toArray, toOtelException, toSpanAttributeValue, tryDecodeURIComponent, value };
|
|
314
354
|
export type { AnyFunction, AsyncIdQueueCloseOptions, AsyncIteratorClassCleanupFn, AsyncIteratorClassNextFn, AsyncIteratorWithSpanOptions, EventPublisherOptions, EventPublisherSubscribeIteratorOptions, InferAsyncIterableYield, InterceptableOptions, Interceptor, InterceptorOptions, IntersectPick, MaybeOptionalOptions, OmitChainMethodDeep, OnFinishState, OtelConfig, PromiseWithError, Registry, RunWithSpanOptions, Segment, SetOptional, SetSpanErrorOptions, ThrowableError, Value };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Promisable } from 'type-fest';
|
|
2
2
|
export { IsEqual, IsNever, JsonValue, PartialDeep, Promisable } from 'type-fest';
|
|
3
3
|
import { Tracer, TraceAPI, ContextAPI, PropagationAPI, SpanOptions, Context, Span, AttributeValue, Exception } from '@opentelemetry/api';
|
|
4
|
-
export { group, guard, mapEntries, mapValues, omit } from 'radash';
|
|
4
|
+
export { group, guard, mapEntries, mapValues, omit, retry, sleep } from 'radash';
|
|
5
5
|
|
|
6
6
|
type MaybeOptionalOptions<TOptions> = Record<never, never> extends TOptions ? [options?: TOptions] : [options: TOptions];
|
|
7
7
|
declare function resolveMaybeOptionalOptions<T>(rest: MaybeOptionalOptions<T>): T;
|
|
@@ -30,7 +30,7 @@ type OmitChainMethodDeep<T extends object, K extends keyof any> = {
|
|
|
30
30
|
|
|
31
31
|
declare const ORPC_NAME = "orpc";
|
|
32
32
|
declare const ORPC_SHARED_PACKAGE_NAME = "@orpc/shared";
|
|
33
|
-
declare const ORPC_SHARED_PACKAGE_VERSION = "0.0.0-next.
|
|
33
|
+
declare const ORPC_SHARED_PACKAGE_VERSION = "0.0.0-next.3a0949d";
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
36
|
* Error thrown when an operation is aborted.
|
|
@@ -60,7 +60,7 @@ interface EventPublisherSubscribeIteratorOptions extends EventPublisherOptions {
|
|
|
60
60
|
/**
|
|
61
61
|
* Aborts the async iterator. Throws if aborted before or during pulling.
|
|
62
62
|
*/
|
|
63
|
-
signal?: AbortSignal;
|
|
63
|
+
signal?: AbortSignal | undefined;
|
|
64
64
|
}
|
|
65
65
|
declare class EventPublisher<T extends Record<PropertyKey, any>> {
|
|
66
66
|
#private;
|
|
@@ -103,6 +103,14 @@ declare class SequentialIdGenerator {
|
|
|
103
103
|
private index;
|
|
104
104
|
generate(): string;
|
|
105
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* Compares two sequential IDs.
|
|
108
|
+
* Returns:
|
|
109
|
+
* - negative if `a` < `b`
|
|
110
|
+
* - positive if `a` > `b`
|
|
111
|
+
* - 0 if equal
|
|
112
|
+
*/
|
|
113
|
+
declare function compareSequentialIds(a: string, b: string): number;
|
|
106
114
|
|
|
107
115
|
type SetOptional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
|
|
108
116
|
type IntersectPick<T, U> = Pick<T, keyof T & keyof U>;
|
|
@@ -263,6 +271,11 @@ declare function findDeepMatches(check: (value: unknown) => boolean, payload: un
|
|
|
263
271
|
maps: Segment[][];
|
|
264
272
|
values: unknown[];
|
|
265
273
|
};
|
|
274
|
+
/**
|
|
275
|
+
* Get constructor of the value
|
|
276
|
+
*
|
|
277
|
+
*/
|
|
278
|
+
declare function getConstructor(value: unknown): Function | null | undefined;
|
|
266
279
|
/**
|
|
267
280
|
* Check if the value is an object even it created by `Object.create(null)` or more tricky way.
|
|
268
281
|
*/
|
|
@@ -272,18 +285,35 @@ declare function isObject(value: unknown): value is Record<PropertyKey, unknown>
|
|
|
272
285
|
*/
|
|
273
286
|
declare function isTypescriptObject(value: unknown): value is object & Record<PropertyKey, unknown>;
|
|
274
287
|
declare function clone<T>(value: T): T;
|
|
275
|
-
declare function get(object: unknown, path: readonly
|
|
288
|
+
declare function get(object: unknown, path: readonly PropertyKey[]): unknown;
|
|
276
289
|
declare function isPropertyKey(value: unknown): value is PropertyKey;
|
|
277
290
|
declare const NullProtoObj: ({
|
|
278
291
|
new <T extends Record<PropertyKey, unknown>>(): T;
|
|
279
292
|
});
|
|
280
293
|
|
|
294
|
+
type Value<T, TArgs extends any[] = []> = T | ((...args: TArgs) => T);
|
|
295
|
+
declare function value<T, TArgs extends any[]>(value: Value<T, TArgs>, ...args: NoInfer<TArgs>): T extends Value<infer U, any> ? U : never;
|
|
296
|
+
/**
|
|
297
|
+
* Returns the value if it is defined, otherwise returns the fallback
|
|
298
|
+
*/
|
|
299
|
+
declare function fallback<T>(value: T | undefined, fallback: T): T;
|
|
300
|
+
|
|
281
301
|
/**
|
|
282
302
|
* Prevents objects from being awaitable by intercepting the `then` method
|
|
283
303
|
* when called by the native await mechanism. This is useful for preventing
|
|
284
304
|
* accidental awaiting of objects that aren't meant to be promises.
|
|
285
305
|
*/
|
|
286
306
|
declare function preventNativeAwait<T extends object>(target: T): T;
|
|
307
|
+
/**
|
|
308
|
+
* Create a proxy that overlays one object (`overlay`) on top of another (`target`).
|
|
309
|
+
*
|
|
310
|
+
* - Properties from `overlay` take precedence.
|
|
311
|
+
* - Properties not in `overlay` fall back to `target`.
|
|
312
|
+
* - Methods from either object are bound to `overlay` so `this` is consistent.
|
|
313
|
+
*
|
|
314
|
+
* Useful when you want to override or extend behavior without fully copying/merging objects.
|
|
315
|
+
*/
|
|
316
|
+
declare function overlayProxy<T extends object, U extends object>(target: Value<T>, partial: U): U & Omit<T, keyof U>;
|
|
287
317
|
|
|
288
318
|
interface AsyncIdQueueCloseOptions {
|
|
289
319
|
id?: string;
|
|
@@ -291,9 +321,11 @@ interface AsyncIdQueueCloseOptions {
|
|
|
291
321
|
}
|
|
292
322
|
declare class AsyncIdQueue<T> {
|
|
293
323
|
private readonly openIds;
|
|
294
|
-
private readonly
|
|
295
|
-
private readonly
|
|
324
|
+
private readonly queues;
|
|
325
|
+
private readonly waiters;
|
|
296
326
|
get length(): number;
|
|
327
|
+
get waiterIds(): string[];
|
|
328
|
+
hasBufferedItems(id: string): boolean;
|
|
297
329
|
open(id: string): void;
|
|
298
330
|
isOpen(id: string): boolean;
|
|
299
331
|
push(id: string, item: T): void;
|
|
@@ -302,13 +334,21 @@ declare class AsyncIdQueue<T> {
|
|
|
302
334
|
assertOpen(id: string): void;
|
|
303
335
|
}
|
|
304
336
|
|
|
337
|
+
/**
|
|
338
|
+
* Converts a `ReadableStream` into an `AsyncIteratorClass`.
|
|
339
|
+
*/
|
|
305
340
|
declare function streamToAsyncIteratorClass<T>(stream: ReadableStream<T>): AsyncIteratorClass<T>;
|
|
341
|
+
/**
|
|
342
|
+
* Converts an `AsyncIterator` into a `ReadableStream`.
|
|
343
|
+
*/
|
|
306
344
|
declare function asyncIteratorToStream<T>(iterator: AsyncIterator<T>): ReadableStream<T>;
|
|
345
|
+
/**
|
|
346
|
+
* Converts an `AsyncIterator` into a `ReadableStream`, ensuring that
|
|
347
|
+
* all emitted object values are *unproxied* before enqueuing.
|
|
348
|
+
*/
|
|
349
|
+
declare function asyncIteratorToUnproxiedDataStream<T>(iterator: AsyncIterator<T>): ReadableStream<T>;
|
|
307
350
|
|
|
308
351
|
declare function tryDecodeURIComponent(value: string): string;
|
|
309
352
|
|
|
310
|
-
|
|
311
|
-
declare function value<T, TArgs extends any[]>(value: Value<T, TArgs>, ...args: NoInfer<TArgs>): T extends Value<infer U, any> ? U : never;
|
|
312
|
-
|
|
313
|
-
export { AbortError, AsyncIdQueue, AsyncIteratorClass, EventPublisher, NullProtoObj, ORPC_NAME, ORPC_SHARED_PACKAGE_NAME, ORPC_SHARED_PACKAGE_VERSION, SequentialIdGenerator, asyncIteratorToStream, asyncIteratorWithSpan, clone, defer, findDeepMatches, get, getGlobalOtelConfig, intercept, isAsyncIteratorObject, isObject, isPropertyKey, isTypescriptObject, onError, onFinish, onStart, onSuccess, once, parseEmptyableJSON, preventNativeAwait, readAsBuffer, replicateAsyncIterator, resolveMaybeOptionalOptions, runInSpanContext, runWithSpan, sequential, setGlobalOtelConfig, setSpanAttribute, setSpanError, splitInHalf, startSpan, streamToAsyncIteratorClass, stringifyJSON, toArray, toOtelException, toSpanAttributeValue, tryDecodeURIComponent, value };
|
|
353
|
+
export { AbortError, AsyncIdQueue, AsyncIteratorClass, EventPublisher, NullProtoObj, ORPC_NAME, ORPC_SHARED_PACKAGE_NAME, ORPC_SHARED_PACKAGE_VERSION, SequentialIdGenerator, asyncIteratorToStream, asyncIteratorToUnproxiedDataStream, asyncIteratorWithSpan, clone, compareSequentialIds, defer, fallback, findDeepMatches, get, getConstructor, getGlobalOtelConfig, intercept, isAsyncIteratorObject, isObject, isPropertyKey, isTypescriptObject, onError, onFinish, onStart, onSuccess, once, overlayProxy, parseEmptyableJSON, preventNativeAwait, readAsBuffer, replicateAsyncIterator, resolveMaybeOptionalOptions, runInSpanContext, runWithSpan, sequential, setGlobalOtelConfig, setSpanAttribute, setSpanError, splitInHalf, startSpan, streamToAsyncIteratorClass, stringifyJSON, toArray, toOtelException, toSpanAttributeValue, tryDecodeURIComponent, value };
|
|
314
354
|
export type { AnyFunction, AsyncIdQueueCloseOptions, AsyncIteratorClassCleanupFn, AsyncIteratorClassNextFn, AsyncIteratorWithSpanOptions, EventPublisherOptions, EventPublisherSubscribeIteratorOptions, InferAsyncIterableYield, InterceptableOptions, Interceptor, InterceptorOptions, IntersectPick, MaybeOptionalOptions, OmitChainMethodDeep, OnFinishState, OtelConfig, PromiseWithError, Registry, RunWithSpanOptions, Segment, SetOptional, SetSpanErrorOptions, ThrowableError, Value };
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { group, guard, mapEntries, mapValues, omit } from 'radash';
|
|
1
|
+
export { group, guard, mapEntries, mapValues, omit, retry, sleep } from 'radash';
|
|
2
2
|
|
|
3
3
|
function resolveMaybeOptionalOptions(rest) {
|
|
4
4
|
return rest[0] ?? {};
|
|
@@ -21,7 +21,7 @@ function readAsBuffer(source) {
|
|
|
21
21
|
|
|
22
22
|
const ORPC_NAME = "orpc";
|
|
23
23
|
const ORPC_SHARED_PACKAGE_NAME = "@orpc/shared";
|
|
24
|
-
const ORPC_SHARED_PACKAGE_VERSION = "0.0.0-next.
|
|
24
|
+
const ORPC_SHARED_PACKAGE_VERSION = "0.0.0-next.3a0949d";
|
|
25
25
|
|
|
26
26
|
class AbortError extends Error {
|
|
27
27
|
constructor(...rest) {
|
|
@@ -153,11 +153,17 @@ async function runInSpanContext(span, fn) {
|
|
|
153
153
|
|
|
154
154
|
class AsyncIdQueue {
|
|
155
155
|
openIds = /* @__PURE__ */ new Set();
|
|
156
|
-
|
|
157
|
-
|
|
156
|
+
queues = /* @__PURE__ */ new Map();
|
|
157
|
+
waiters = /* @__PURE__ */ new Map();
|
|
158
158
|
get length() {
|
|
159
159
|
return this.openIds.size;
|
|
160
160
|
}
|
|
161
|
+
get waiterIds() {
|
|
162
|
+
return Array.from(this.waiters.keys());
|
|
163
|
+
}
|
|
164
|
+
hasBufferedItems(id) {
|
|
165
|
+
return Boolean(this.queues.get(id)?.length);
|
|
166
|
+
}
|
|
161
167
|
open(id) {
|
|
162
168
|
this.openIds.add(id);
|
|
163
169
|
}
|
|
@@ -166,59 +172,57 @@ class AsyncIdQueue {
|
|
|
166
172
|
}
|
|
167
173
|
push(id, item) {
|
|
168
174
|
this.assertOpen(id);
|
|
169
|
-
const pending = this.
|
|
175
|
+
const pending = this.waiters.get(id);
|
|
170
176
|
if (pending?.length) {
|
|
171
177
|
pending.shift()[0](item);
|
|
172
178
|
if (pending.length === 0) {
|
|
173
|
-
this.
|
|
179
|
+
this.waiters.delete(id);
|
|
174
180
|
}
|
|
175
181
|
} else {
|
|
176
|
-
const items = this.
|
|
182
|
+
const items = this.queues.get(id);
|
|
177
183
|
if (items) {
|
|
178
184
|
items.push(item);
|
|
179
185
|
} else {
|
|
180
|
-
this.
|
|
186
|
+
this.queues.set(id, [item]);
|
|
181
187
|
}
|
|
182
188
|
}
|
|
183
189
|
}
|
|
184
190
|
async pull(id) {
|
|
185
191
|
this.assertOpen(id);
|
|
186
|
-
const items = this.
|
|
192
|
+
const items = this.queues.get(id);
|
|
187
193
|
if (items?.length) {
|
|
188
194
|
const item = items.shift();
|
|
189
195
|
if (items.length === 0) {
|
|
190
|
-
this.
|
|
196
|
+
this.queues.delete(id);
|
|
191
197
|
}
|
|
192
198
|
return item;
|
|
193
199
|
}
|
|
194
200
|
return new Promise((resolve, reject) => {
|
|
195
|
-
const waitingPulls = this.
|
|
201
|
+
const waitingPulls = this.waiters.get(id);
|
|
196
202
|
const pending = [resolve, reject];
|
|
197
203
|
if (waitingPulls) {
|
|
198
204
|
waitingPulls.push(pending);
|
|
199
205
|
} else {
|
|
200
|
-
this.
|
|
206
|
+
this.waiters.set(id, [pending]);
|
|
201
207
|
}
|
|
202
208
|
});
|
|
203
209
|
}
|
|
204
210
|
close({ id, reason } = {}) {
|
|
205
211
|
if (id === void 0) {
|
|
206
|
-
this.
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
});
|
|
212
|
+
this.waiters.forEach((pendingPulls, id2) => {
|
|
213
|
+
const error2 = reason ?? new AbortError(`[AsyncIdQueue] Queue[${id2}] was closed or aborted while waiting for pulling.`);
|
|
214
|
+
pendingPulls.forEach(([, reject]) => reject(error2));
|
|
210
215
|
});
|
|
211
|
-
this.
|
|
216
|
+
this.waiters.clear();
|
|
212
217
|
this.openIds.clear();
|
|
213
|
-
this.
|
|
218
|
+
this.queues.clear();
|
|
214
219
|
return;
|
|
215
220
|
}
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
this.pendingPulls.delete(id);
|
|
221
|
+
const error = reason ?? new AbortError(`[AsyncIdQueue] Queue[${id}] was closed or aborted while waiting for pulling.`);
|
|
222
|
+
this.waiters.get(id)?.forEach(([, reject]) => reject(error));
|
|
223
|
+
this.waiters.delete(id);
|
|
220
224
|
this.openIds.delete(id);
|
|
221
|
-
this.
|
|
225
|
+
this.queues.delete(id);
|
|
222
226
|
}
|
|
223
227
|
assertOpen(id) {
|
|
224
228
|
if (!this.isOpen(id)) {
|
|
@@ -298,49 +302,51 @@ class AsyncIteratorClass {
|
|
|
298
302
|
}
|
|
299
303
|
function replicateAsyncIterator(source, count) {
|
|
300
304
|
const queue = new AsyncIdQueue();
|
|
301
|
-
const
|
|
302
|
-
let
|
|
305
|
+
const ids = Array.from({ length: count }, (_, i) => i.toString());
|
|
306
|
+
let isSourceFinished = false;
|
|
303
307
|
const start = once(async () => {
|
|
304
308
|
try {
|
|
305
309
|
while (true) {
|
|
306
310
|
const item = await source.next();
|
|
307
|
-
|
|
308
|
-
if (queue.isOpen(id
|
|
309
|
-
queue.push(id
|
|
311
|
+
ids.forEach((id) => {
|
|
312
|
+
if (queue.isOpen(id)) {
|
|
313
|
+
queue.push(id, { next: item });
|
|
310
314
|
}
|
|
311
|
-
}
|
|
315
|
+
});
|
|
312
316
|
if (item.done) {
|
|
313
317
|
break;
|
|
314
318
|
}
|
|
315
319
|
}
|
|
316
|
-
} catch (
|
|
317
|
-
|
|
320
|
+
} catch (error) {
|
|
321
|
+
ids.forEach((id) => {
|
|
322
|
+
if (queue.isOpen(id)) {
|
|
323
|
+
queue.push(id, { error });
|
|
324
|
+
}
|
|
325
|
+
});
|
|
326
|
+
} finally {
|
|
327
|
+
isSourceFinished = true;
|
|
318
328
|
}
|
|
319
329
|
});
|
|
320
|
-
|
|
321
|
-
queue.open(id
|
|
322
|
-
|
|
323
|
-
() => {
|
|
330
|
+
const replicated = ids.map((id) => {
|
|
331
|
+
queue.open(id);
|
|
332
|
+
return new AsyncIteratorClass(
|
|
333
|
+
async () => {
|
|
324
334
|
start();
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
}
|
|
331
|
-
});
|
|
332
|
-
});
|
|
335
|
+
const item = await queue.pull(id);
|
|
336
|
+
if (item.next) {
|
|
337
|
+
return item.next;
|
|
338
|
+
}
|
|
339
|
+
throw item.error;
|
|
333
340
|
},
|
|
334
341
|
async (reason) => {
|
|
335
|
-
queue.close({ id
|
|
336
|
-
if (reason !== "next") {
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
}
|
|
342
|
+
queue.close({ id });
|
|
343
|
+
if (reason !== "next" && !queue.length && !isSourceFinished) {
|
|
344
|
+
isSourceFinished = true;
|
|
345
|
+
await source?.return?.();
|
|
340
346
|
}
|
|
341
347
|
}
|
|
342
|
-
)
|
|
343
|
-
}
|
|
348
|
+
);
|
|
349
|
+
});
|
|
344
350
|
return replicated;
|
|
345
351
|
}
|
|
346
352
|
function asyncIteratorWithSpan({ name, ...options }, iterator) {
|
|
@@ -397,15 +403,15 @@ class EventPublisher {
|
|
|
397
403
|
if (typeof listenerOrOptions === "function") {
|
|
398
404
|
let listeners = this.#listenersMap.get(event);
|
|
399
405
|
if (!listeners) {
|
|
400
|
-
this.#listenersMap.set(event, listeners =
|
|
406
|
+
this.#listenersMap.set(event, listeners = []);
|
|
401
407
|
}
|
|
402
|
-
listeners.
|
|
403
|
-
return () => {
|
|
404
|
-
listeners.
|
|
405
|
-
if (listeners.
|
|
408
|
+
listeners.push(listenerOrOptions);
|
|
409
|
+
return once(() => {
|
|
410
|
+
listeners.splice(listeners.indexOf(listenerOrOptions), 1);
|
|
411
|
+
if (listeners.length === 0) {
|
|
406
412
|
this.#listenersMap.delete(event);
|
|
407
413
|
}
|
|
408
|
-
};
|
|
414
|
+
});
|
|
409
415
|
}
|
|
410
416
|
const signal = listenerOrOptions?.signal;
|
|
411
417
|
const maxBufferedEvents = listenerOrOptions?.maxBufferedEvents ?? this.#maxBufferedEvents;
|
|
@@ -451,13 +457,19 @@ class EventPublisher {
|
|
|
451
457
|
}
|
|
452
458
|
|
|
453
459
|
class SequentialIdGenerator {
|
|
454
|
-
index = BigInt(
|
|
460
|
+
index = BigInt(1);
|
|
455
461
|
generate() {
|
|
456
|
-
const id = this.index.toString(
|
|
462
|
+
const id = this.index.toString(36);
|
|
457
463
|
this.index++;
|
|
458
464
|
return id;
|
|
459
465
|
}
|
|
460
466
|
}
|
|
467
|
+
function compareSequentialIds(a, b) {
|
|
468
|
+
if (a.length !== b.length) {
|
|
469
|
+
return a.length - b.length;
|
|
470
|
+
}
|
|
471
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
472
|
+
}
|
|
461
473
|
|
|
462
474
|
function onStart(callback) {
|
|
463
475
|
return async (options, ...rest) => {
|
|
@@ -536,6 +548,12 @@ function findDeepMatches(check, payload, segments = [], maps = [], values = [])
|
|
|
536
548
|
}
|
|
537
549
|
return { maps, values };
|
|
538
550
|
}
|
|
551
|
+
function getConstructor(value) {
|
|
552
|
+
if (!isTypescriptObject(value)) {
|
|
553
|
+
return null;
|
|
554
|
+
}
|
|
555
|
+
return Object.getPrototypeOf(value)?.constructor;
|
|
556
|
+
}
|
|
539
557
|
function isObject(value) {
|
|
540
558
|
if (!value || typeof value !== "object") {
|
|
541
559
|
return false;
|
|
@@ -555,6 +573,9 @@ function clone(value) {
|
|
|
555
573
|
for (const key in value) {
|
|
556
574
|
result[key] = clone(value[key]);
|
|
557
575
|
}
|
|
576
|
+
for (const sym of Object.getOwnPropertySymbols(value)) {
|
|
577
|
+
result[sym] = clone(value[sym]);
|
|
578
|
+
}
|
|
558
579
|
return result;
|
|
559
580
|
}
|
|
560
581
|
return value;
|
|
@@ -581,14 +602,24 @@ const NullProtoObj = /* @__PURE__ */ (() => {
|
|
|
581
602
|
return e;
|
|
582
603
|
})();
|
|
583
604
|
|
|
605
|
+
function value(value2, ...args) {
|
|
606
|
+
if (typeof value2 === "function") {
|
|
607
|
+
return value2(...args);
|
|
608
|
+
}
|
|
609
|
+
return value2;
|
|
610
|
+
}
|
|
611
|
+
function fallback(value2, fallback2) {
|
|
612
|
+
return value2 === void 0 ? fallback2 : value2;
|
|
613
|
+
}
|
|
614
|
+
|
|
584
615
|
function preventNativeAwait(target) {
|
|
585
616
|
return new Proxy(target, {
|
|
586
617
|
get(target2, prop, receiver) {
|
|
587
|
-
const
|
|
588
|
-
if (prop !== "then" || typeof
|
|
589
|
-
return
|
|
618
|
+
const value2 = Reflect.get(target2, prop, receiver);
|
|
619
|
+
if (prop !== "then" || typeof value2 !== "function") {
|
|
620
|
+
return value2;
|
|
590
621
|
}
|
|
591
|
-
return new Proxy(
|
|
622
|
+
return new Proxy(value2, {
|
|
592
623
|
apply(targetFn, thisArg, args) {
|
|
593
624
|
if (args.length !== 2 || args.some((arg) => !isNativeFunction(arg))) {
|
|
594
625
|
return Reflect.apply(targetFn, thisArg, args);
|
|
@@ -612,6 +643,19 @@ const NATIVE_FUNCTION_REGEX = /^\s*function\s*\(\)\s*\{\s*\[native code\]\s*\}\s
|
|
|
612
643
|
function isNativeFunction(fn) {
|
|
613
644
|
return typeof fn === "function" && NATIVE_FUNCTION_REGEX.test(fn.toString());
|
|
614
645
|
}
|
|
646
|
+
function overlayProxy(target, partial) {
|
|
647
|
+
const proxy = new Proxy(typeof target === "function" ? partial : target, {
|
|
648
|
+
get(_, prop) {
|
|
649
|
+
const targetValue = prop in partial ? partial : value(target);
|
|
650
|
+
const v = Reflect.get(targetValue, prop);
|
|
651
|
+
return typeof v === "function" ? v.bind(targetValue) : v;
|
|
652
|
+
},
|
|
653
|
+
has(_, prop) {
|
|
654
|
+
return Reflect.has(partial, prop) || Reflect.has(value(target), prop);
|
|
655
|
+
}
|
|
656
|
+
});
|
|
657
|
+
return proxy;
|
|
658
|
+
}
|
|
615
659
|
|
|
616
660
|
function streamToAsyncIteratorClass(stream) {
|
|
617
661
|
const reader = stream.getReader();
|
|
@@ -639,6 +683,22 @@ function asyncIteratorToStream(iterator) {
|
|
|
639
683
|
}
|
|
640
684
|
});
|
|
641
685
|
}
|
|
686
|
+
function asyncIteratorToUnproxiedDataStream(iterator) {
|
|
687
|
+
return new ReadableStream({
|
|
688
|
+
async pull(controller) {
|
|
689
|
+
const { done, value } = await iterator.next();
|
|
690
|
+
if (done) {
|
|
691
|
+
controller.close();
|
|
692
|
+
} else {
|
|
693
|
+
const unproxied = isObject(value) ? { ...value } : Array.isArray(value) ? value.map((i) => i) : value;
|
|
694
|
+
controller.enqueue(unproxied);
|
|
695
|
+
}
|
|
696
|
+
},
|
|
697
|
+
async cancel() {
|
|
698
|
+
await iterator.return?.();
|
|
699
|
+
}
|
|
700
|
+
});
|
|
701
|
+
}
|
|
642
702
|
|
|
643
703
|
function tryDecodeURIComponent(value) {
|
|
644
704
|
try {
|
|
@@ -648,11 +708,4 @@ function tryDecodeURIComponent(value) {
|
|
|
648
708
|
}
|
|
649
709
|
}
|
|
650
710
|
|
|
651
|
-
|
|
652
|
-
if (typeof value2 === "function") {
|
|
653
|
-
return value2(...args);
|
|
654
|
-
}
|
|
655
|
-
return value2;
|
|
656
|
-
}
|
|
657
|
-
|
|
658
|
-
export { AbortError, AsyncIdQueue, AsyncIteratorClass, EventPublisher, NullProtoObj, ORPC_NAME, ORPC_SHARED_PACKAGE_NAME, ORPC_SHARED_PACKAGE_VERSION, SequentialIdGenerator, asyncIteratorToStream, asyncIteratorWithSpan, clone, defer, findDeepMatches, get, getGlobalOtelConfig, intercept, isAsyncIteratorObject, isObject, isPropertyKey, isTypescriptObject, onError, onFinish, onStart, onSuccess, once, parseEmptyableJSON, preventNativeAwait, readAsBuffer, replicateAsyncIterator, resolveMaybeOptionalOptions, runInSpanContext, runWithSpan, sequential, setGlobalOtelConfig, setSpanAttribute, setSpanError, splitInHalf, startSpan, streamToAsyncIteratorClass, stringifyJSON, toArray, toOtelException, toSpanAttributeValue, tryDecodeURIComponent, value };
|
|
711
|
+
export { AbortError, AsyncIdQueue, AsyncIteratorClass, EventPublisher, NullProtoObj, ORPC_NAME, ORPC_SHARED_PACKAGE_NAME, ORPC_SHARED_PACKAGE_VERSION, SequentialIdGenerator, asyncIteratorToStream, asyncIteratorToUnproxiedDataStream, asyncIteratorWithSpan, clone, compareSequentialIds, defer, fallback, findDeepMatches, get, getConstructor, getGlobalOtelConfig, intercept, isAsyncIteratorObject, isObject, isPropertyKey, isTypescriptObject, onError, onFinish, onStart, onSuccess, once, overlayProxy, parseEmptyableJSON, preventNativeAwait, readAsBuffer, replicateAsyncIterator, resolveMaybeOptionalOptions, runInSpanContext, runWithSpan, sequential, setGlobalOtelConfig, setSpanAttribute, setSpanError, splitInHalf, startSpan, streamToAsyncIteratorClass, stringifyJSON, toArray, toOtelException, toSpanAttributeValue, tryDecodeURIComponent, value };
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orpc/shared",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.0-next.
|
|
4
|
+
"version": "0.0.0-next.3a0949d",
|
|
5
5
|
"license": "MIT",
|
|
6
|
-
"homepage": "https://orpc.
|
|
6
|
+
"homepage": "https://orpc.dev",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
9
9
|
"url": "git+https://github.com/unnoq/orpc.git",
|
|
@@ -33,13 +33,13 @@
|
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"radash": "^12.1.1",
|
|
36
|
-
"type-fest": "^
|
|
36
|
+
"type-fest": "^5.2.0"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"@opentelemetry/api": "^1.9.0",
|
|
40
|
-
"arktype": "2.1.
|
|
41
|
-
"valibot": "^1.
|
|
42
|
-
"zod": "^4.
|
|
40
|
+
"arktype": "2.1.27",
|
|
41
|
+
"valibot": "^1.2.0",
|
|
42
|
+
"zod": "^4.1.12"
|
|
43
43
|
},
|
|
44
44
|
"scripts": {
|
|
45
45
|
"build": "unbuild",
|