@orpc/standard-server-peer 0.0.0-next.e565b64 → 0.0.0-next.e5e2613

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
@@ -30,7 +30,7 @@
30
30
  - **🔗 End-to-End Type Safety**: Ensure type-safe inputs, outputs, and errors from client to server.
31
31
  - **📘 First-Class OpenAPI**: Built-in support that fully adheres to the OpenAPI standard.
32
32
  - **📝 Contract-First Development**: Optionally define your API contract before implementation.
33
- - **⚙️ Framework Integrations**: Seamlessly integrate with TanStack Query (React, Vue, Solid, Svelte), Pinia Colada, and more.
33
+ - **⚙️ Framework Integrations**: Seamlessly integrate with TanStack Query (React, Vue, Solid, Svelte, Angular), Pinia Colada, and more.
34
34
  - **🚀 Server Actions**: Fully compatible with React Server Actions on Next.js, TanStack Start, and other platforms.
35
35
  - **🔠 Standard Schema Support**: Works out of the box with Zod, Valibot, ArkType, and other schema validators.
36
36
  - **🗃️ Native Types**: Supports native types like Date, File, Blob, BigInt, URL, and more.
@@ -49,14 +49,12 @@ You can find the full documentation [here](https://orpc.unnoq.com).
49
49
  - [@orpc/contract](https://www.npmjs.com/package/@orpc/contract): Build your API contract.
50
50
  - [@orpc/server](https://www.npmjs.com/package/@orpc/server): Build your API or implement API contract.
51
51
  - [@orpc/client](https://www.npmjs.com/package/@orpc/client): Consume your API on the client with type-safety.
52
- - [@orpc/nest](https://www.npmjs.com/package/@orpc/nest): Deeply integrate oRPC with NestJS.
52
+ - [@orpc/openapi](https://www.npmjs.com/package/@orpc/openapi): Generate OpenAPI specs and handle OpenAPI requests.
53
+ - [@orpc/nest](https://www.npmjs.com/package/@orpc/nest): Deeply integrate oRPC with [NestJS](https://nestjs.com/).
53
54
  - [@orpc/react](https://www.npmjs.com/package/@orpc/react): Utilities for integrating oRPC with React and React Server Actions.
54
- - [@orpc/react-query](https://www.npmjs.com/package/@orpc/react-query): Integration with [React Query](https://tanstack.com/query/latest/docs/framework/react/overview).
55
- - [@orpc/vue-query](https://www.npmjs.com/package/@orpc/vue-query): Integration with [Vue Query](https://tanstack.com/query/latest/docs/framework/vue/overview).
56
- - [@orpc/solid-query](https://www.npmjs.com/package/@orpc/solid-query): Integration with [Solid Query](https://tanstack.com/query/latest/docs/framework/solid/overview).
57
- - [@orpc/svelte-query](https://www.npmjs.com/package/@orpc/svelte-query): Integration with [Svelte Query](https://tanstack.com/query/latest/docs/framework/svelte/overview).
55
+ - [@orpc/tanstack-query](https://www.npmjs.com/package/@orpc/tanstack-query): [TanStack Query](https://tanstack.com/query/latest) integration.
58
56
  - [@orpc/vue-colada](https://www.npmjs.com/package/@orpc/vue-colada): Integration with [Pinia Colada](https://pinia-colada.esm.dev/).
59
- - [@orpc/openapi](https://www.npmjs.com/package/@orpc/openapi): Generate OpenAPI specs and handle OpenAPI requests.
57
+ - [@orpc/hey-api](https://www.npmjs.com/package/@orpc/hey-api): [Hey API](https://heyapi.dev/) integration.
60
58
  - [@orpc/zod](https://www.npmjs.com/package/@orpc/zod): More schemas that [Zod](https://zod.dev/) doesn't support yet.
61
59
  - [@orpc/valibot](https://www.npmjs.com/package/@orpc/valibot): OpenAPI spec generation from [Valibot](https://valibot.dev/).
62
60
  - [@orpc/arktype](https://www.npmjs.com/package/@orpc/arktype): OpenAPI spec generation from [ArkType](https://arktype.io/).
package/dist/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
- import { Promisable, AsyncIdQueueCloseOptions as AsyncIdQueueCloseOptions$1, CreateAsyncIteratorObjectCleanupFn } from '@orpc/shared';
2
- import { StandardRequest, StandardResponse, EventMeta, StandardHeaders } from '@orpc/standard-server';
1
+ import { Promisable, AsyncIdQueueCloseOptions as AsyncIdQueueCloseOptions$1, AsyncIteratorClassCleanupFn, AsyncIteratorClass } from '@orpc/shared';
2
+ import { StandardRequest, StandardResponse, EventMeta } from '@orpc/standard-server';
3
3
 
4
- type EncodedMessage = string | ArrayBufferLike | Blob;
4
+ type EncodedMessage = string | ArrayBufferLike | Uint8Array;
5
5
  interface EncodedMessageSendFn {
6
6
  (message: EncodedMessage): Promisable<void>;
7
7
  }
@@ -22,7 +22,7 @@ declare class ClientPeer {
22
22
  private readonly send;
23
23
  constructor(send: EncodedMessageSendFn);
24
24
  get length(): number;
25
- open(id: number): AbortController;
25
+ open(id: string): AbortController;
26
26
  request(request: StandardRequest): Promise<StandardResponse>;
27
27
  message(raw: EncodedMessage): Promise<void>;
28
28
  close(options?: AsyncIdQueueCloseOptions$1): void;
@@ -51,34 +51,33 @@ interface ResponseMessageMap {
51
51
  [MessageType.ABORT_SIGNAL]: void;
52
52
  }
53
53
  type DecodedMessageUnion<TMap extends RequestMessageMap | ResponseMessageMap> = {
54
- [K in keyof TMap]: [id: number, type: K, payload: TMap[K]];
54
+ [K in keyof TMap]: [id: string, type: K, payload: TMap[K]];
55
55
  }[keyof TMap];
56
56
  type DecodedRequestMessage = DecodedMessageUnion<RequestMessageMap>;
57
57
  type DecodedResponseMessage = DecodedMessageUnion<ResponseMessageMap>;
58
- declare function encodeRequestMessage<T extends keyof RequestMessageMap>(id: number, type: T, payload: RequestMessageMap[T]): Promise<EncodedMessage>;
58
+ declare function encodeRequestMessage<T extends keyof RequestMessageMap>(id: string, type: T, payload: RequestMessageMap[T]): Promise<EncodedMessage>;
59
59
  declare function decodeRequestMessage(raw: EncodedMessage): Promise<DecodedRequestMessage>;
60
- declare function encodeResponseMessage<T extends keyof ResponseMessageMap>(id: number, type: T, payload: ResponseMessageMap[T]): Promise<EncodedMessage>;
60
+ declare function encodeResponseMessage<T extends keyof ResponseMessageMap>(id: string, type: T, payload: ResponseMessageMap[T]): Promise<EncodedMessage>;
61
61
  declare function decodeResponseMessage(raw: EncodedMessage): Promise<DecodedResponseMessage>;
62
- declare function isEventIteratorHeaders(headers: StandardHeaders): boolean;
63
62
 
64
63
  interface AsyncIdQueueCloseOptions {
65
- id?: number;
66
- reason?: Error;
64
+ id?: string;
65
+ reason?: unknown;
67
66
  }
68
67
  declare class AsyncIdQueue<T> {
69
68
  private readonly openIds;
70
69
  private readonly items;
71
70
  private readonly pendingPulls;
72
71
  get length(): number;
73
- open(id: number): void;
74
- isOpen(id: number): boolean;
75
- push(id: number, item: T): void;
76
- pull(id: number): Promise<T>;
72
+ open(id: string): void;
73
+ isOpen(id: string): boolean;
74
+ push(id: string, item: T): void;
75
+ pull(id: string): Promise<T>;
77
76
  close({ id, reason }?: AsyncIdQueueCloseOptions): void;
78
- assertOpen(id: number): void;
77
+ assertOpen(id: string): void;
79
78
  }
80
79
 
81
- declare function toEventIterator(queue: AsyncIdQueue<EventIteratorPayload>, id: number, cleanup: CreateAsyncIteratorObjectCleanupFn): AsyncGenerator;
80
+ declare function toEventIterator(queue: AsyncIdQueue<EventIteratorPayload>, id: string, cleanup: AsyncIteratorClassCleanupFn): AsyncIteratorClass<unknown>;
82
81
  declare function resolveEventIterator(iterator: AsyncIterator<any>, callback: (payload: EventIteratorPayload) => Promise<'next' | 'abort'>): Promise<void>;
83
82
 
84
83
  interface ServerPeerCloseOptions extends AsyncIdQueueCloseOptions$1 {
@@ -95,11 +94,11 @@ declare class ServerPeer {
95
94
  private readonly send;
96
95
  constructor(send: EncodedMessageSendFn);
97
96
  get length(): number;
98
- open(id: number): AbortController;
99
- message(raw: EncodedMessage): Promise<[id: number, StandardRequest | undefined]>;
100
- response(id: number, response: StandardResponse): Promise<void>;
97
+ open(id: string): AbortController;
98
+ message(raw: EncodedMessage): Promise<[id: string, StandardRequest | undefined]>;
99
+ response(id: string, response: StandardResponse): Promise<void>;
101
100
  close({ abort, ...options }?: ServerPeerCloseOptions): void;
102
101
  }
103
102
 
104
- export { ClientPeer, MessageType, ServerPeer, decodeRequestMessage, decodeResponseMessage, encodeRequestMessage, encodeResponseMessage, isEventIteratorHeaders, resolveEventIterator, toEventIterator };
103
+ export { ClientPeer, MessageType, ServerPeer, decodeRequestMessage, decodeResponseMessage, encodeRequestMessage, encodeResponseMessage, resolveEventIterator, toEventIterator };
105
104
  export type { ClientPeerCloseOptions, DecodedRequestMessage, DecodedResponseMessage, EncodedMessage, EncodedMessageSendFn, EventIteratorEvent, EventIteratorPayload, RequestMessageMap, ResponseMessageMap, ServerPeerCloseOptions };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { Promisable, AsyncIdQueueCloseOptions as AsyncIdQueueCloseOptions$1, CreateAsyncIteratorObjectCleanupFn } from '@orpc/shared';
2
- import { StandardRequest, StandardResponse, EventMeta, StandardHeaders } from '@orpc/standard-server';
1
+ import { Promisable, AsyncIdQueueCloseOptions as AsyncIdQueueCloseOptions$1, AsyncIteratorClassCleanupFn, AsyncIteratorClass } from '@orpc/shared';
2
+ import { StandardRequest, StandardResponse, EventMeta } from '@orpc/standard-server';
3
3
 
4
- type EncodedMessage = string | ArrayBufferLike | Blob;
4
+ type EncodedMessage = string | ArrayBufferLike | Uint8Array;
5
5
  interface EncodedMessageSendFn {
6
6
  (message: EncodedMessage): Promisable<void>;
7
7
  }
@@ -22,7 +22,7 @@ declare class ClientPeer {
22
22
  private readonly send;
23
23
  constructor(send: EncodedMessageSendFn);
24
24
  get length(): number;
25
- open(id: number): AbortController;
25
+ open(id: string): AbortController;
26
26
  request(request: StandardRequest): Promise<StandardResponse>;
27
27
  message(raw: EncodedMessage): Promise<void>;
28
28
  close(options?: AsyncIdQueueCloseOptions$1): void;
@@ -51,34 +51,33 @@ interface ResponseMessageMap {
51
51
  [MessageType.ABORT_SIGNAL]: void;
52
52
  }
53
53
  type DecodedMessageUnion<TMap extends RequestMessageMap | ResponseMessageMap> = {
54
- [K in keyof TMap]: [id: number, type: K, payload: TMap[K]];
54
+ [K in keyof TMap]: [id: string, type: K, payload: TMap[K]];
55
55
  }[keyof TMap];
56
56
  type DecodedRequestMessage = DecodedMessageUnion<RequestMessageMap>;
57
57
  type DecodedResponseMessage = DecodedMessageUnion<ResponseMessageMap>;
58
- declare function encodeRequestMessage<T extends keyof RequestMessageMap>(id: number, type: T, payload: RequestMessageMap[T]): Promise<EncodedMessage>;
58
+ declare function encodeRequestMessage<T extends keyof RequestMessageMap>(id: string, type: T, payload: RequestMessageMap[T]): Promise<EncodedMessage>;
59
59
  declare function decodeRequestMessage(raw: EncodedMessage): Promise<DecodedRequestMessage>;
60
- declare function encodeResponseMessage<T extends keyof ResponseMessageMap>(id: number, type: T, payload: ResponseMessageMap[T]): Promise<EncodedMessage>;
60
+ declare function encodeResponseMessage<T extends keyof ResponseMessageMap>(id: string, type: T, payload: ResponseMessageMap[T]): Promise<EncodedMessage>;
61
61
  declare function decodeResponseMessage(raw: EncodedMessage): Promise<DecodedResponseMessage>;
62
- declare function isEventIteratorHeaders(headers: StandardHeaders): boolean;
63
62
 
64
63
  interface AsyncIdQueueCloseOptions {
65
- id?: number;
66
- reason?: Error;
64
+ id?: string;
65
+ reason?: unknown;
67
66
  }
68
67
  declare class AsyncIdQueue<T> {
69
68
  private readonly openIds;
70
69
  private readonly items;
71
70
  private readonly pendingPulls;
72
71
  get length(): number;
73
- open(id: number): void;
74
- isOpen(id: number): boolean;
75
- push(id: number, item: T): void;
76
- pull(id: number): Promise<T>;
72
+ open(id: string): void;
73
+ isOpen(id: string): boolean;
74
+ push(id: string, item: T): void;
75
+ pull(id: string): Promise<T>;
77
76
  close({ id, reason }?: AsyncIdQueueCloseOptions): void;
78
- assertOpen(id: number): void;
77
+ assertOpen(id: string): void;
79
78
  }
80
79
 
81
- declare function toEventIterator(queue: AsyncIdQueue<EventIteratorPayload>, id: number, cleanup: CreateAsyncIteratorObjectCleanupFn): AsyncGenerator;
80
+ declare function toEventIterator(queue: AsyncIdQueue<EventIteratorPayload>, id: string, cleanup: AsyncIteratorClassCleanupFn): AsyncIteratorClass<unknown>;
82
81
  declare function resolveEventIterator(iterator: AsyncIterator<any>, callback: (payload: EventIteratorPayload) => Promise<'next' | 'abort'>): Promise<void>;
83
82
 
84
83
  interface ServerPeerCloseOptions extends AsyncIdQueueCloseOptions$1 {
@@ -95,11 +94,11 @@ declare class ServerPeer {
95
94
  private readonly send;
96
95
  constructor(send: EncodedMessageSendFn);
97
96
  get length(): number;
98
- open(id: number): AbortController;
99
- message(raw: EncodedMessage): Promise<[id: number, StandardRequest | undefined]>;
100
- response(id: number, response: StandardResponse): Promise<void>;
97
+ open(id: string): AbortController;
98
+ message(raw: EncodedMessage): Promise<[id: string, StandardRequest | undefined]>;
99
+ response(id: string, response: StandardResponse): Promise<void>;
101
100
  close({ abort, ...options }?: ServerPeerCloseOptions): void;
102
101
  }
103
102
 
104
- export { ClientPeer, MessageType, ServerPeer, decodeRequestMessage, decodeResponseMessage, encodeRequestMessage, encodeResponseMessage, isEventIteratorHeaders, resolveEventIterator, toEventIterator };
103
+ export { ClientPeer, MessageType, ServerPeer, decodeRequestMessage, decodeResponseMessage, encodeRequestMessage, encodeResponseMessage, resolveEventIterator, toEventIterator };
105
104
  export type { ClientPeerCloseOptions, DecodedRequestMessage, DecodedResponseMessage, EncodedMessage, EncodedMessageSendFn, EventIteratorEvent, EventIteratorPayload, RequestMessageMap, ResponseMessageMap, ServerPeerCloseOptions };
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { isAsyncIteratorObject, stringifyJSON, createAsyncIteratorObject, isTypescriptObject, SequentialIdGenerator, AsyncIdQueue } from '@orpc/shared';
2
- import { flattenHeader, getFilenameFromContentDisposition, generateContentDisposition, withEventMeta, ErrorEvent, getEventMeta } from '@orpc/standard-server';
1
+ import { isAsyncIteratorObject, stringifyJSON, readAsBuffer, AsyncIteratorClass, isTypescriptObject, SequentialIdGenerator, AsyncIdQueue } from '@orpc/shared';
2
+ import { generateContentDisposition, flattenHeader, getFilenameFromContentDisposition, withEventMeta, ErrorEvent, getEventMeta, isEventIteratorHeaders, experimental_HibernationEventIterator } from '@orpc/standard-server';
3
3
 
4
4
  var MessageType = /* @__PURE__ */ ((MessageType2) => {
5
5
  MessageType2[MessageType2["REQUEST"] = 1] = "REQUEST";
@@ -22,7 +22,7 @@ async function encodeRequestMessage(id, type, payload) {
22
22
  return encodeRawMessage({ i: id, t: type, p: payload });
23
23
  }
24
24
  const request = payload;
25
- const { body: processedBody, headers: processedHeaders } = await prepareBodyAndHeadersForSerialization(
25
+ const { body: processedBody, headers: processedHeaders } = await serializeBodyAndHeaders(
26
26
  request.body,
27
27
  request.headers
28
28
  );
@@ -42,7 +42,7 @@ async function encodeRequestMessage(id, type, payload) {
42
42
  return encodeRawMessage(baseMessage);
43
43
  }
44
44
  async function decodeRequestMessage(raw) {
45
- const { json: message, blobData } = await decodeRawMessage(raw);
45
+ const { json: message, buffer } = await decodeRawMessage(raw);
46
46
  const id = message.i;
47
47
  const type = message.t;
48
48
  if (type === 3 /* EVENT_ITERATOR */) {
@@ -54,20 +54,7 @@ async function decodeRequestMessage(raw) {
54
54
  }
55
55
  const payload = message.p;
56
56
  const headers = payload.h ?? {};
57
- let body = payload.b;
58
- const contentType = flattenHeader(headers["content-type"]);
59
- if (blobData) {
60
- const contentDisposition = flattenHeader(headers["content-disposition"]);
61
- if (contentDisposition === void 0 && contentType?.startsWith("multipart/form-data")) {
62
- const tempRes = new Response(blobData, { headers: { "content-type": contentType } });
63
- body = await tempRes.formData();
64
- } else {
65
- const filename = getFilenameFromContentDisposition(contentDisposition) ?? "blob";
66
- body = new File([blobData], filename, { type: contentType });
67
- }
68
- } else if (contentType?.startsWith("application/x-www-form-urlencoded") && typeof body === "string") {
69
- body = new URLSearchParams(body);
70
- }
57
+ const body = await deserializeBody(headers, payload.b, buffer);
71
58
  return [id, 1 /* REQUEST */, { url: new URL(payload.u, "orpc:/"), headers, method: payload.m ?? "POST", body }];
72
59
  }
73
60
  async function encodeResponseMessage(id, type, payload) {
@@ -84,7 +71,7 @@ async function encodeResponseMessage(id, type, payload) {
84
71
  return encodeRawMessage({ i: id, t: type, p: void 0 });
85
72
  }
86
73
  const response = payload;
87
- const { body: processedBody, headers: processedHeaders } = await prepareBodyAndHeadersForSerialization(
74
+ const { body: processedBody, headers: processedHeaders } = await serializeBodyAndHeaders(
88
75
  response.body,
89
76
  response.headers
90
77
  );
@@ -103,7 +90,7 @@ async function encodeResponseMessage(id, type, payload) {
103
90
  return encodeRawMessage(baseMessage);
104
91
  }
105
92
  async function decodeResponseMessage(raw) {
106
- const { json: message, blobData } = await decodeRawMessage(raw);
93
+ const { json: message, buffer } = await decodeRawMessage(raw);
107
94
  const id = message.i;
108
95
  const type = message.t;
109
96
  if (type === 3 /* EVENT_ITERATOR */) {
@@ -115,23 +102,10 @@ async function decodeResponseMessage(raw) {
115
102
  }
116
103
  const payload = message.p;
117
104
  const headers = payload.h ?? {};
118
- let body = payload.b;
119
- const contentType = flattenHeader(headers["content-type"]);
120
- if (blobData) {
121
- const contentDisposition = flattenHeader(headers["content-disposition"]);
122
- if (contentDisposition === void 0 && contentType?.startsWith("multipart/form-data")) {
123
- const tempRes = new Response(blobData, { headers: { "content-type": contentType } });
124
- body = await tempRes.formData();
125
- } else {
126
- const filename = getFilenameFromContentDisposition(contentDisposition) ?? "blob";
127
- body = new File([blobData], filename, { type: contentType });
128
- }
129
- } else if (contentType?.startsWith("application/x-www-form-urlencoded") && typeof body === "string") {
130
- body = new URLSearchParams(body);
131
- }
105
+ const body = await deserializeBody(headers, payload.b, buffer);
132
106
  return [id, 2 /* RESPONSE */, { status: payload.s ?? 200, headers, body }];
133
107
  }
134
- async function prepareBodyAndHeadersForSerialization(body, originalHeaders) {
108
+ async function serializeBodyAndHeaders(body, originalHeaders) {
135
109
  const headers = { ...originalHeaders };
136
110
  const originalContentDisposition = headers["content-disposition"];
137
111
  delete headers["content-type"];
@@ -159,41 +133,54 @@ async function prepareBodyAndHeadersForSerialization(body, originalHeaders) {
159
133
  }
160
134
  return { body, headers };
161
135
  }
162
- function isEventIteratorHeaders(headers) {
163
- return Boolean(flattenHeader(headers["content-type"])?.startsWith("text/event-stream") && headers["content-disposition"] === void 0);
136
+ async function deserializeBody(headers, body, buffer) {
137
+ const contentType = flattenHeader(headers["content-type"]);
138
+ const contentDisposition = flattenHeader(headers["content-disposition"]);
139
+ if (typeof contentDisposition === "string") {
140
+ const filename = getFilenameFromContentDisposition(contentDisposition) ?? "blob";
141
+ return new File(buffer === void 0 ? [] : [buffer], filename, { type: contentType });
142
+ }
143
+ if (contentType?.startsWith("multipart/form-data")) {
144
+ const tempRes = new Response(buffer, { headers: { "content-type": contentType } });
145
+ return tempRes.formData();
146
+ }
147
+ if (contentType?.startsWith("application/x-www-form-urlencoded") && typeof body === "string") {
148
+ return new URLSearchParams(body);
149
+ }
150
+ return body;
164
151
  }
165
152
  const JSON_AND_BINARY_DELIMITER = 255;
166
- async function encodeRawMessage(data, blobData) {
153
+ async function encodeRawMessage(data, blob) {
167
154
  const json = stringifyJSON(data);
168
- if (blobData === void 0) {
155
+ if (blob === void 0 || blob.size === 0) {
169
156
  return json;
170
157
  }
171
- return new Blob([
158
+ return readAsBuffer(new Blob([
172
159
  new TextEncoder().encode(json),
173
160
  new Uint8Array([JSON_AND_BINARY_DELIMITER]),
174
- blobData
175
- ]);
161
+ blob
162
+ ]));
176
163
  }
177
164
  async function decodeRawMessage(raw) {
178
165
  if (typeof raw === "string") {
179
166
  return { json: JSON.parse(raw) };
180
167
  }
181
- const buffer = new Uint8Array(raw instanceof Blob ? await raw.arrayBuffer() : raw);
168
+ const buffer = raw instanceof Uint8Array ? raw : new Uint8Array(raw);
182
169
  const delimiterIndex = buffer.indexOf(JSON_AND_BINARY_DELIMITER);
183
170
  if (delimiterIndex === -1) {
184
171
  const jsonPart2 = new TextDecoder().decode(buffer);
185
172
  return { json: JSON.parse(jsonPart2) };
186
173
  }
187
- const jsonPart = new TextDecoder().decode(buffer.slice(0, delimiterIndex));
188
- const blobData = buffer.slice(delimiterIndex + 1);
174
+ const jsonPart = new TextDecoder().decode(buffer.subarray(0, delimiterIndex));
175
+ const bufferPart = buffer.subarray(delimiterIndex + 1);
189
176
  return {
190
177
  json: JSON.parse(jsonPart),
191
- blobData: blobData.buffer
178
+ buffer: bufferPart
192
179
  };
193
180
  }
194
181
 
195
182
  function toEventIterator(queue, id, cleanup) {
196
- return createAsyncIteratorObject(async () => {
183
+ return new AsyncIteratorClass(async () => {
197
184
  const item = await queue.pull(id);
198
185
  switch (item.event) {
199
186
  case "message": {
@@ -415,13 +402,17 @@ class ServerPeer {
415
402
  }
416
403
  await this.send(id, MessageType.RESPONSE, response).then(async () => {
417
404
  if (!signal.aborted && isAsyncIteratorObject(response.body)) {
418
- await resolveEventIterator(response.body, async (payload) => {
419
- if (signal.aborted) {
420
- return "abort";
421
- }
422
- await this.send(id, MessageType.EVENT_ITERATOR, payload);
423
- return "next";
424
- });
405
+ if (response.body instanceof experimental_HibernationEventIterator) {
406
+ response.body.hibernationCallback?.(id);
407
+ } else {
408
+ await resolveEventIterator(response.body, async (payload) => {
409
+ if (signal.aborted) {
410
+ return "abort";
411
+ }
412
+ await this.send(id, MessageType.EVENT_ITERATOR, payload);
413
+ return "next";
414
+ });
415
+ }
425
416
  }
426
417
  this.close({ id, abort: false });
427
418
  }).catch((reason) => {
@@ -445,4 +436,4 @@ class ServerPeer {
445
436
  }
446
437
  }
447
438
 
448
- export { ClientPeer, MessageType, ServerPeer, decodeRequestMessage, decodeResponseMessage, encodeRequestMessage, encodeResponseMessage, isEventIteratorHeaders, resolveEventIterator, toEventIterator };
439
+ export { ClientPeer, MessageType, ServerPeer, decodeRequestMessage, decodeResponseMessage, encodeRequestMessage, encodeResponseMessage, resolveEventIterator, toEventIterator };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@orpc/standard-server-peer",
3
3
  "type": "module",
4
- "version": "0.0.0-next.e565b64",
4
+ "version": "0.0.0-next.e5e2613",
5
5
  "license": "MIT",
6
6
  "homepage": "https://unnoq.com",
7
7
  "repository": {
@@ -23,8 +23,8 @@
23
23
  "dist"
24
24
  ],
25
25
  "dependencies": {
26
- "@orpc/shared": "0.0.0-next.e565b64",
27
- "@orpc/standard-server": "0.0.0-next.e565b64"
26
+ "@orpc/shared": "0.0.0-next.e5e2613",
27
+ "@orpc/standard-server": "0.0.0-next.e5e2613"
28
28
  },
29
29
  "scripts": {
30
30
  "build": "unbuild",