@orpc/shared 0.0.0-next.057d007 → 0.0.0-next.05d8e79

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 CHANGED
@@ -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>
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.057d007";
33
+ declare const ORPC_SHARED_PACKAGE_VERSION = "0.0.0-next.05d8e79";
34
34
 
35
35
  /**
36
36
  * Error thrown when an operation is aborted.
@@ -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>;
@@ -283,12 +291,29 @@ declare const NullProtoObj: ({
283
291
  new <T extends Record<PropertyKey, unknown>>(): T;
284
292
  });
285
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
+
286
301
  /**
287
302
  * Prevents objects from being awaitable by intercepting the `then` method
288
303
  * when called by the native await mechanism. This is useful for preventing
289
304
  * accidental awaiting of objects that aren't meant to be promises.
290
305
  */
291
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>;
292
317
 
293
318
  interface AsyncIdQueueCloseOptions {
294
319
  id?: string;
@@ -309,13 +334,21 @@ declare class AsyncIdQueue<T> {
309
334
  assertOpen(id: string): void;
310
335
  }
311
336
 
337
+ /**
338
+ * Converts a `ReadableStream` into an `AsyncIteratorClass`.
339
+ */
312
340
  declare function streamToAsyncIteratorClass<T>(stream: ReadableStream<T>): AsyncIteratorClass<T>;
341
+ /**
342
+ * Converts an `AsyncIterator` into a `ReadableStream`.
343
+ */
313
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>;
314
350
 
315
351
  declare function tryDecodeURIComponent(value: string): string;
316
352
 
317
- type Value<T, TArgs extends any[] = []> = T | ((...args: TArgs) => T);
318
- declare function value<T, TArgs extends any[]>(value: Value<T, TArgs>, ...args: NoInfer<TArgs>): T extends Value<infer U, any> ? U : never;
319
-
320
- export { AbortError, AsyncIdQueue, AsyncIteratorClass, EventPublisher, NullProtoObj, ORPC_NAME, ORPC_SHARED_PACKAGE_NAME, ORPC_SHARED_PACKAGE_VERSION, SequentialIdGenerator, asyncIteratorToStream, asyncIteratorWithSpan, clone, defer, findDeepMatches, get, getConstructor, 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 };
321
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.057d007";
33
+ declare const ORPC_SHARED_PACKAGE_VERSION = "0.0.0-next.05d8e79";
34
34
 
35
35
  /**
36
36
  * Error thrown when an operation is aborted.
@@ -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>;
@@ -283,12 +291,29 @@ declare const NullProtoObj: ({
283
291
  new <T extends Record<PropertyKey, unknown>>(): T;
284
292
  });
285
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
+
286
301
  /**
287
302
  * Prevents objects from being awaitable by intercepting the `then` method
288
303
  * when called by the native await mechanism. This is useful for preventing
289
304
  * accidental awaiting of objects that aren't meant to be promises.
290
305
  */
291
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>;
292
317
 
293
318
  interface AsyncIdQueueCloseOptions {
294
319
  id?: string;
@@ -309,13 +334,21 @@ declare class AsyncIdQueue<T> {
309
334
  assertOpen(id: string): void;
310
335
  }
311
336
 
337
+ /**
338
+ * Converts a `ReadableStream` into an `AsyncIteratorClass`.
339
+ */
312
340
  declare function streamToAsyncIteratorClass<T>(stream: ReadableStream<T>): AsyncIteratorClass<T>;
341
+ /**
342
+ * Converts an `AsyncIterator` into a `ReadableStream`.
343
+ */
313
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>;
314
350
 
315
351
  declare function tryDecodeURIComponent(value: string): string;
316
352
 
317
- type Value<T, TArgs extends any[] = []> = T | ((...args: TArgs) => T);
318
- declare function value<T, TArgs extends any[]>(value: Value<T, TArgs>, ...args: NoInfer<TArgs>): T extends Value<infer U, any> ? U : never;
319
-
320
- export { AbortError, AsyncIdQueue, AsyncIteratorClass, EventPublisher, NullProtoObj, ORPC_NAME, ORPC_SHARED_PACKAGE_NAME, ORPC_SHARED_PACKAGE_VERSION, SequentialIdGenerator, asyncIteratorToStream, asyncIteratorWithSpan, clone, defer, findDeepMatches, get, getConstructor, 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 };
321
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.057d007";
24
+ const ORPC_SHARED_PACKAGE_VERSION = "0.0.0-next.05d8e79";
25
25
 
26
26
  class AbortError extends Error {
27
27
  constructor(...rest) {
@@ -403,15 +403,15 @@ class EventPublisher {
403
403
  if (typeof listenerOrOptions === "function") {
404
404
  let listeners = this.#listenersMap.get(event);
405
405
  if (!listeners) {
406
- this.#listenersMap.set(event, listeners = /* @__PURE__ */ new Set());
406
+ this.#listenersMap.set(event, listeners = []);
407
407
  }
408
- listeners.add(listenerOrOptions);
409
- return () => {
410
- listeners.delete(listenerOrOptions);
411
- if (listeners.size === 0) {
408
+ listeners.push(listenerOrOptions);
409
+ return once(() => {
410
+ listeners.splice(listeners.indexOf(listenerOrOptions), 1);
411
+ if (listeners.length === 0) {
412
412
  this.#listenersMap.delete(event);
413
413
  }
414
- };
414
+ });
415
415
  }
416
416
  const signal = listenerOrOptions?.signal;
417
417
  const maxBufferedEvents = listenerOrOptions?.maxBufferedEvents ?? this.#maxBufferedEvents;
@@ -457,13 +457,19 @@ class EventPublisher {
457
457
  }
458
458
 
459
459
  class SequentialIdGenerator {
460
- index = BigInt(0);
460
+ index = BigInt(1);
461
461
  generate() {
462
- const id = this.index.toString(32);
462
+ const id = this.index.toString(36);
463
463
  this.index++;
464
464
  return id;
465
465
  }
466
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
+ }
467
473
 
468
474
  function onStart(callback) {
469
475
  return async (options, ...rest) => {
@@ -593,14 +599,24 @@ const NullProtoObj = /* @__PURE__ */ (() => {
593
599
  return e;
594
600
  })();
595
601
 
602
+ function value(value2, ...args) {
603
+ if (typeof value2 === "function") {
604
+ return value2(...args);
605
+ }
606
+ return value2;
607
+ }
608
+ function fallback(value2, fallback2) {
609
+ return value2 === void 0 ? fallback2 : value2;
610
+ }
611
+
596
612
  function preventNativeAwait(target) {
597
613
  return new Proxy(target, {
598
614
  get(target2, prop, receiver) {
599
- const value = Reflect.get(target2, prop, receiver);
600
- if (prop !== "then" || typeof value !== "function") {
601
- return value;
615
+ const value2 = Reflect.get(target2, prop, receiver);
616
+ if (prop !== "then" || typeof value2 !== "function") {
617
+ return value2;
602
618
  }
603
- return new Proxy(value, {
619
+ return new Proxy(value2, {
604
620
  apply(targetFn, thisArg, args) {
605
621
  if (args.length !== 2 || args.some((arg) => !isNativeFunction(arg))) {
606
622
  return Reflect.apply(targetFn, thisArg, args);
@@ -624,6 +640,19 @@ const NATIVE_FUNCTION_REGEX = /^\s*function\s*\(\)\s*\{\s*\[native code\]\s*\}\s
624
640
  function isNativeFunction(fn) {
625
641
  return typeof fn === "function" && NATIVE_FUNCTION_REGEX.test(fn.toString());
626
642
  }
643
+ function overlayProxy(target, partial) {
644
+ const proxy = new Proxy(typeof target === "function" ? partial : target, {
645
+ get(_, prop) {
646
+ const targetValue = prop in partial ? partial : value(target);
647
+ const v = Reflect.get(targetValue, prop);
648
+ return typeof v === "function" ? v.bind(targetValue) : v;
649
+ },
650
+ has(_, prop) {
651
+ return Reflect.has(partial, prop) || Reflect.has(value(target), prop);
652
+ }
653
+ });
654
+ return proxy;
655
+ }
627
656
 
628
657
  function streamToAsyncIteratorClass(stream) {
629
658
  const reader = stream.getReader();
@@ -651,6 +680,22 @@ function asyncIteratorToStream(iterator) {
651
680
  }
652
681
  });
653
682
  }
683
+ function asyncIteratorToUnproxiedDataStream(iterator) {
684
+ return new ReadableStream({
685
+ async pull(controller) {
686
+ const { done, value } = await iterator.next();
687
+ if (done) {
688
+ controller.close();
689
+ } else {
690
+ const unproxied = isObject(value) ? { ...value } : Array.isArray(value) ? value.map((i) => i) : value;
691
+ controller.enqueue(unproxied);
692
+ }
693
+ },
694
+ async cancel() {
695
+ await iterator.return?.();
696
+ }
697
+ });
698
+ }
654
699
 
655
700
  function tryDecodeURIComponent(value) {
656
701
  try {
@@ -660,11 +705,4 @@ function tryDecodeURIComponent(value) {
660
705
  }
661
706
  }
662
707
 
663
- function value(value2, ...args) {
664
- if (typeof value2 === "function") {
665
- return value2(...args);
666
- }
667
- return value2;
668
- }
669
-
670
- export { AbortError, AsyncIdQueue, AsyncIteratorClass, EventPublisher, NullProtoObj, ORPC_NAME, ORPC_SHARED_PACKAGE_NAME, ORPC_SHARED_PACKAGE_VERSION, SequentialIdGenerator, asyncIteratorToStream, asyncIteratorWithSpan, clone, defer, findDeepMatches, get, getConstructor, 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 };
708
+ 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,7 +1,7 @@
1
1
  {
2
2
  "name": "@orpc/shared",
3
3
  "type": "module",
4
- "version": "0.0.0-next.057d007",
4
+ "version": "0.0.0-next.05d8e79",
5
5
  "license": "MIT",
6
6
  "homepage": "https://orpc.unnoq.com",
7
7
  "repository": {
@@ -33,13 +33,13 @@
33
33
  },
34
34
  "dependencies": {
35
35
  "radash": "^12.1.1",
36
- "type-fest": "^5.0.1"
36
+ "type-fest": "^5.2.0"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@opentelemetry/api": "^1.9.0",
40
- "arktype": "2.1.21",
40
+ "arktype": "2.1.25",
41
41
  "valibot": "^1.1.0",
42
- "zod": "^4.1.5"
42
+ "zod": "^4.1.12"
43
43
  },
44
44
  "scripts": {
45
45
  "build": "unbuild",