@orpc/standard-server-peer 1.10.0 → 1.10.2

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/dist/index.d.mts CHANGED
@@ -1,11 +1,100 @@
1
1
  import { Promisable, AsyncIdQueueCloseOptions as AsyncIdQueueCloseOptions$1, SetSpanErrorOptions, AsyncIteratorClassCleanupFn, AsyncIteratorClass } from '@orpc/shared';
2
- import { StandardRequest, StandardResponse, EventMeta } from '@orpc/standard-server';
2
+ import { StandardRequest, EventMeta, StandardResponse, StandardBody, StandardHeaders } from '@orpc/standard-server';
3
3
 
4
4
  type EncodedMessage = string | ArrayBufferLike | Uint8Array;
5
5
  interface EncodedMessageSendFn {
6
6
  (message: EncodedMessage): Promisable<void>;
7
7
  }
8
8
 
9
+ declare enum MessageType {
10
+ REQUEST = 1,
11
+ RESPONSE = 2,
12
+ EVENT_ITERATOR = 3,
13
+ ABORT_SIGNAL = 4
14
+ }
15
+ type EventIteratorEvent = 'message' | 'error' | 'done';
16
+ interface EventIteratorPayload {
17
+ event: EventIteratorEvent;
18
+ data: unknown;
19
+ meta?: EventMeta;
20
+ }
21
+ interface RequestMessageMap {
22
+ [MessageType.REQUEST]: Omit<StandardRequest, 'signal'>;
23
+ [MessageType.EVENT_ITERATOR]: EventIteratorPayload;
24
+ [MessageType.ABORT_SIGNAL]: void;
25
+ }
26
+ interface ResponseMessageMap {
27
+ [MessageType.RESPONSE]: StandardResponse;
28
+ [MessageType.EVENT_ITERATOR]: EventIteratorPayload;
29
+ [MessageType.ABORT_SIGNAL]: void;
30
+ }
31
+ interface BaseMessageFormat<P = unknown> {
32
+ /**
33
+ * Client-guaranteed unique identifier
34
+ */
35
+ i: string;
36
+ /**
37
+ * @default REQUEST | RESPONSE
38
+ */
39
+ t?: MessageType;
40
+ p: P;
41
+ }
42
+ interface SerializedEventIteratorPayload {
43
+ e: EventIteratorEvent;
44
+ d: unknown;
45
+ m?: EventMeta;
46
+ }
47
+ interface SerializedRequestPayload {
48
+ /**
49
+ * The url of the request
50
+ *
51
+ * might be relative path if origin is `orpc://localhost`
52
+ */
53
+ u: string;
54
+ b: StandardBody;
55
+ /**
56
+ * @default {}
57
+ */
58
+ h?: StandardHeaders;
59
+ /**
60
+ * @default POST
61
+ */
62
+ m?: string;
63
+ }
64
+ interface SerializedResponsePayload {
65
+ /**
66
+ * @default 200
67
+ */
68
+ s?: number;
69
+ /**
70
+ * @default {}
71
+ */
72
+ h?: StandardHeaders;
73
+ b: StandardBody;
74
+ }
75
+ type DecodedMessageUnion<TMap extends RequestMessageMap | ResponseMessageMap> = {
76
+ [K in keyof TMap]: [id: string, type: K, payload: TMap[K]];
77
+ }[keyof TMap];
78
+ type DecodedRequestMessage = DecodedMessageUnion<RequestMessageMap>;
79
+ type DecodedResponseMessage = DecodedMessageUnion<ResponseMessageMap>;
80
+ /**
81
+ * New serialization functions without Blob handling
82
+ */
83
+ declare function serializeRequestMessage<T extends keyof RequestMessageMap>(id: string, type: T, payload: RequestMessageMap[T]): BaseMessageFormat;
84
+ declare function deserializeRequestMessage(message: BaseMessageFormat): DecodedRequestMessage;
85
+ declare function serializeResponseMessage<T extends keyof ResponseMessageMap>(id: string, type: T, payload: ResponseMessageMap[T]): BaseMessageFormat;
86
+ declare function deserializeResponseMessage(message: BaseMessageFormat): DecodedResponseMessage;
87
+ /**
88
+ * Original encode/decode functions now using the new serialize/deserialize functions
89
+ */
90
+ declare function encodeRequestMessage<T extends keyof RequestMessageMap>(id: string, type: T, payload: RequestMessageMap[T]): Promise<EncodedMessage>;
91
+ declare function decodeRequestMessage(raw: EncodedMessage): Promise<DecodedRequestMessage>;
92
+ declare function encodeResponseMessage<T extends keyof ResponseMessageMap>(id: string, type: T, payload: ResponseMessageMap[T]): Promise<EncodedMessage>;
93
+ declare function decodeResponseMessage(raw: EncodedMessage): Promise<DecodedResponseMessage>;
94
+
95
+ interface experimental_RequestMessageSendFn {
96
+ (message: DecodedRequestMessage): Promisable<void>;
97
+ }
9
98
  interface ClientPeerCloseOptions extends AsyncIdQueueCloseOptions$1 {
10
99
  /**
11
100
  * Should abort or not?
@@ -15,6 +104,15 @@ interface ClientPeerCloseOptions extends AsyncIdQueueCloseOptions$1 {
15
104
  abort?: boolean;
16
105
  }
17
106
  declare class ClientPeer {
107
+ private readonly peer;
108
+ constructor(send: EncodedMessageSendFn);
109
+ get length(): number;
110
+ open(id: string): AbortController;
111
+ request(request: StandardRequest): Promise<StandardResponse>;
112
+ message(raw: EncodedMessage): Promise<void>;
113
+ close(options?: AsyncIdQueueCloseOptions$1): void;
114
+ }
115
+ declare class experimental_ClientPeerWithoutCodec {
18
116
  private readonly idGenerator;
19
117
  /**
20
118
  * Queue of responses sent from server, awaiting consumption
@@ -33,46 +131,14 @@ declare class ClientPeer {
33
131
  */
34
132
  private readonly cleanupFns;
35
133
  private readonly send;
36
- constructor(send: EncodedMessageSendFn);
134
+ constructor(send: experimental_RequestMessageSendFn);
37
135
  get length(): number;
38
136
  open(id: string): AbortController;
39
137
  request(request: StandardRequest): Promise<StandardResponse>;
40
- message(raw: EncodedMessage): Promise<void>;
138
+ message([id, type, payload]: DecodedResponseMessage): Promise<void>;
41
139
  close(options?: AsyncIdQueueCloseOptions$1): void;
42
140
  }
43
141
 
44
- declare enum MessageType {
45
- REQUEST = 1,
46
- RESPONSE = 2,
47
- EVENT_ITERATOR = 3,
48
- ABORT_SIGNAL = 4
49
- }
50
- type EventIteratorEvent = 'message' | 'error' | 'done';
51
- interface EventIteratorPayload {
52
- event: EventIteratorEvent;
53
- data: unknown;
54
- meta?: EventMeta;
55
- }
56
- interface RequestMessageMap {
57
- [MessageType.REQUEST]: Omit<StandardRequest, 'signal'>;
58
- [MessageType.EVENT_ITERATOR]: EventIteratorPayload;
59
- [MessageType.ABORT_SIGNAL]: void;
60
- }
61
- interface ResponseMessageMap {
62
- [MessageType.RESPONSE]: StandardResponse;
63
- [MessageType.EVENT_ITERATOR]: EventIteratorPayload;
64
- [MessageType.ABORT_SIGNAL]: void;
65
- }
66
- type DecodedMessageUnion<TMap extends RequestMessageMap | ResponseMessageMap> = {
67
- [K in keyof TMap]: [id: string, type: K, payload: TMap[K]];
68
- }[keyof TMap];
69
- type DecodedRequestMessage = DecodedMessageUnion<RequestMessageMap>;
70
- type DecodedResponseMessage = DecodedMessageUnion<ResponseMessageMap>;
71
- declare function encodeRequestMessage<T extends keyof RequestMessageMap>(id: string, type: T, payload: RequestMessageMap[T]): Promise<EncodedMessage>;
72
- declare function decodeRequestMessage(raw: EncodedMessage): Promise<DecodedRequestMessage>;
73
- declare function encodeResponseMessage<T extends keyof ResponseMessageMap>(id: string, type: T, payload: ResponseMessageMap[T]): Promise<EncodedMessage>;
74
- declare function decodeResponseMessage(raw: EncodedMessage): Promise<DecodedResponseMessage>;
75
-
76
142
  interface AsyncIdQueueCloseOptions {
77
143
  id?: string;
78
144
  reason?: unknown;
@@ -97,6 +163,9 @@ interface ToEventIteratorOptions extends SetSpanErrorOptions {
97
163
  declare function toEventIterator(queue: AsyncIdQueue<EventIteratorPayload>, id: string, cleanup: AsyncIteratorClassCleanupFn, options?: ToEventIteratorOptions): AsyncIteratorClass<unknown>;
98
164
  declare function resolveEventIterator(iterator: AsyncIterator<any>, callback: (payload: EventIteratorPayload) => Promise<'next' | 'abort'>): Promise<void>;
99
165
 
166
+ interface experimental_ResponseMessageSendFn {
167
+ (message: DecodedResponseMessage): Promisable<void>;
168
+ }
100
169
  interface ServerPeerHandleRequestFn {
101
170
  (request: StandardRequest): Promise<StandardResponse>;
102
171
  }
@@ -109,6 +178,21 @@ interface ServerPeerCloseOptions extends AsyncIdQueueCloseOptions$1 {
109
178
  abort?: boolean;
110
179
  }
111
180
  declare class ServerPeer {
181
+ private readonly peer;
182
+ constructor(send: EncodedMessageSendFn);
183
+ get length(): number;
184
+ open(id: string): AbortController;
185
+ /**
186
+ * @todo This method will return Promise<void> in the next major version.
187
+ */
188
+ message(raw: EncodedMessage, handleRequest?: ServerPeerHandleRequestFn): Promise<[id: string, StandardRequest | undefined]>;
189
+ /**
190
+ * @deprecated Please pass the `handleRequest` (second arg) function to the `message` method instead.
191
+ */
192
+ response(id: string, response: StandardResponse): Promise<void>;
193
+ close({ abort, ...options }?: ServerPeerCloseOptions): void;
194
+ }
195
+ declare class experimental_ServerPeerWithoutCodec {
112
196
  /**
113
197
  * Queue of event iterator messages sent from client, awaiting consumption
114
198
  */
@@ -118,13 +202,13 @@ declare class ServerPeer {
118
202
  */
119
203
  private readonly clientControllers;
120
204
  private readonly send;
121
- constructor(send: EncodedMessageSendFn);
205
+ constructor(send: experimental_ResponseMessageSendFn);
122
206
  get length(): number;
123
207
  open(id: string): AbortController;
124
208
  /**
125
209
  * @todo This method will return Promise<void> in the next major version.
126
210
  */
127
- message(raw: EncodedMessage, handleRequest?: ServerPeerHandleRequestFn): Promise<[id: string, StandardRequest | undefined]>;
211
+ message([id, type, payload]: DecodedRequestMessage, handleRequest?: ServerPeerHandleRequestFn): Promise<[id: string, StandardRequest | undefined]>;
128
212
  /**
129
213
  * @deprecated Please pass the `handleRequest` (second arg) function to the `message` method instead.
130
214
  */
@@ -132,5 +216,5 @@ declare class ServerPeer {
132
216
  close({ abort, ...options }?: ServerPeerCloseOptions): void;
133
217
  }
134
218
 
135
- export { ClientPeer, MessageType, ServerPeer, decodeRequestMessage, decodeResponseMessage, encodeRequestMessage, encodeResponseMessage, resolveEventIterator, toEventIterator };
136
- export type { ClientPeerCloseOptions, DecodedRequestMessage, DecodedResponseMessage, EncodedMessage, EncodedMessageSendFn, EventIteratorEvent, EventIteratorPayload, RequestMessageMap, ResponseMessageMap, ServerPeerCloseOptions, ServerPeerHandleRequestFn, ToEventIteratorOptions };
219
+ export { ClientPeer, MessageType, ServerPeer, decodeRequestMessage, decodeResponseMessage, deserializeRequestMessage, deserializeResponseMessage, encodeRequestMessage, encodeResponseMessage, experimental_ClientPeerWithoutCodec, experimental_ServerPeerWithoutCodec, resolveEventIterator, serializeRequestMessage, serializeResponseMessage, toEventIterator };
220
+ export type { BaseMessageFormat, ClientPeerCloseOptions, DecodedMessageUnion, DecodedRequestMessage, DecodedResponseMessage, EncodedMessage, EncodedMessageSendFn, EventIteratorEvent, EventIteratorPayload, RequestMessageMap, ResponseMessageMap, SerializedEventIteratorPayload, SerializedRequestPayload, SerializedResponsePayload, ServerPeerCloseOptions, ServerPeerHandleRequestFn, ToEventIteratorOptions, experimental_RequestMessageSendFn, experimental_ResponseMessageSendFn };
package/dist/index.d.ts CHANGED
@@ -1,11 +1,100 @@
1
1
  import { Promisable, AsyncIdQueueCloseOptions as AsyncIdQueueCloseOptions$1, SetSpanErrorOptions, AsyncIteratorClassCleanupFn, AsyncIteratorClass } from '@orpc/shared';
2
- import { StandardRequest, StandardResponse, EventMeta } from '@orpc/standard-server';
2
+ import { StandardRequest, EventMeta, StandardResponse, StandardBody, StandardHeaders } from '@orpc/standard-server';
3
3
 
4
4
  type EncodedMessage = string | ArrayBufferLike | Uint8Array;
5
5
  interface EncodedMessageSendFn {
6
6
  (message: EncodedMessage): Promisable<void>;
7
7
  }
8
8
 
9
+ declare enum MessageType {
10
+ REQUEST = 1,
11
+ RESPONSE = 2,
12
+ EVENT_ITERATOR = 3,
13
+ ABORT_SIGNAL = 4
14
+ }
15
+ type EventIteratorEvent = 'message' | 'error' | 'done';
16
+ interface EventIteratorPayload {
17
+ event: EventIteratorEvent;
18
+ data: unknown;
19
+ meta?: EventMeta;
20
+ }
21
+ interface RequestMessageMap {
22
+ [MessageType.REQUEST]: Omit<StandardRequest, 'signal'>;
23
+ [MessageType.EVENT_ITERATOR]: EventIteratorPayload;
24
+ [MessageType.ABORT_SIGNAL]: void;
25
+ }
26
+ interface ResponseMessageMap {
27
+ [MessageType.RESPONSE]: StandardResponse;
28
+ [MessageType.EVENT_ITERATOR]: EventIteratorPayload;
29
+ [MessageType.ABORT_SIGNAL]: void;
30
+ }
31
+ interface BaseMessageFormat<P = unknown> {
32
+ /**
33
+ * Client-guaranteed unique identifier
34
+ */
35
+ i: string;
36
+ /**
37
+ * @default REQUEST | RESPONSE
38
+ */
39
+ t?: MessageType;
40
+ p: P;
41
+ }
42
+ interface SerializedEventIteratorPayload {
43
+ e: EventIteratorEvent;
44
+ d: unknown;
45
+ m?: EventMeta;
46
+ }
47
+ interface SerializedRequestPayload {
48
+ /**
49
+ * The url of the request
50
+ *
51
+ * might be relative path if origin is `orpc://localhost`
52
+ */
53
+ u: string;
54
+ b: StandardBody;
55
+ /**
56
+ * @default {}
57
+ */
58
+ h?: StandardHeaders;
59
+ /**
60
+ * @default POST
61
+ */
62
+ m?: string;
63
+ }
64
+ interface SerializedResponsePayload {
65
+ /**
66
+ * @default 200
67
+ */
68
+ s?: number;
69
+ /**
70
+ * @default {}
71
+ */
72
+ h?: StandardHeaders;
73
+ b: StandardBody;
74
+ }
75
+ type DecodedMessageUnion<TMap extends RequestMessageMap | ResponseMessageMap> = {
76
+ [K in keyof TMap]: [id: string, type: K, payload: TMap[K]];
77
+ }[keyof TMap];
78
+ type DecodedRequestMessage = DecodedMessageUnion<RequestMessageMap>;
79
+ type DecodedResponseMessage = DecodedMessageUnion<ResponseMessageMap>;
80
+ /**
81
+ * New serialization functions without Blob handling
82
+ */
83
+ declare function serializeRequestMessage<T extends keyof RequestMessageMap>(id: string, type: T, payload: RequestMessageMap[T]): BaseMessageFormat;
84
+ declare function deserializeRequestMessage(message: BaseMessageFormat): DecodedRequestMessage;
85
+ declare function serializeResponseMessage<T extends keyof ResponseMessageMap>(id: string, type: T, payload: ResponseMessageMap[T]): BaseMessageFormat;
86
+ declare function deserializeResponseMessage(message: BaseMessageFormat): DecodedResponseMessage;
87
+ /**
88
+ * Original encode/decode functions now using the new serialize/deserialize functions
89
+ */
90
+ declare function encodeRequestMessage<T extends keyof RequestMessageMap>(id: string, type: T, payload: RequestMessageMap[T]): Promise<EncodedMessage>;
91
+ declare function decodeRequestMessage(raw: EncodedMessage): Promise<DecodedRequestMessage>;
92
+ declare function encodeResponseMessage<T extends keyof ResponseMessageMap>(id: string, type: T, payload: ResponseMessageMap[T]): Promise<EncodedMessage>;
93
+ declare function decodeResponseMessage(raw: EncodedMessage): Promise<DecodedResponseMessage>;
94
+
95
+ interface experimental_RequestMessageSendFn {
96
+ (message: DecodedRequestMessage): Promisable<void>;
97
+ }
9
98
  interface ClientPeerCloseOptions extends AsyncIdQueueCloseOptions$1 {
10
99
  /**
11
100
  * Should abort or not?
@@ -15,6 +104,15 @@ interface ClientPeerCloseOptions extends AsyncIdQueueCloseOptions$1 {
15
104
  abort?: boolean;
16
105
  }
17
106
  declare class ClientPeer {
107
+ private readonly peer;
108
+ constructor(send: EncodedMessageSendFn);
109
+ get length(): number;
110
+ open(id: string): AbortController;
111
+ request(request: StandardRequest): Promise<StandardResponse>;
112
+ message(raw: EncodedMessage): Promise<void>;
113
+ close(options?: AsyncIdQueueCloseOptions$1): void;
114
+ }
115
+ declare class experimental_ClientPeerWithoutCodec {
18
116
  private readonly idGenerator;
19
117
  /**
20
118
  * Queue of responses sent from server, awaiting consumption
@@ -33,46 +131,14 @@ declare class ClientPeer {
33
131
  */
34
132
  private readonly cleanupFns;
35
133
  private readonly send;
36
- constructor(send: EncodedMessageSendFn);
134
+ constructor(send: experimental_RequestMessageSendFn);
37
135
  get length(): number;
38
136
  open(id: string): AbortController;
39
137
  request(request: StandardRequest): Promise<StandardResponse>;
40
- message(raw: EncodedMessage): Promise<void>;
138
+ message([id, type, payload]: DecodedResponseMessage): Promise<void>;
41
139
  close(options?: AsyncIdQueueCloseOptions$1): void;
42
140
  }
43
141
 
44
- declare enum MessageType {
45
- REQUEST = 1,
46
- RESPONSE = 2,
47
- EVENT_ITERATOR = 3,
48
- ABORT_SIGNAL = 4
49
- }
50
- type EventIteratorEvent = 'message' | 'error' | 'done';
51
- interface EventIteratorPayload {
52
- event: EventIteratorEvent;
53
- data: unknown;
54
- meta?: EventMeta;
55
- }
56
- interface RequestMessageMap {
57
- [MessageType.REQUEST]: Omit<StandardRequest, 'signal'>;
58
- [MessageType.EVENT_ITERATOR]: EventIteratorPayload;
59
- [MessageType.ABORT_SIGNAL]: void;
60
- }
61
- interface ResponseMessageMap {
62
- [MessageType.RESPONSE]: StandardResponse;
63
- [MessageType.EVENT_ITERATOR]: EventIteratorPayload;
64
- [MessageType.ABORT_SIGNAL]: void;
65
- }
66
- type DecodedMessageUnion<TMap extends RequestMessageMap | ResponseMessageMap> = {
67
- [K in keyof TMap]: [id: string, type: K, payload: TMap[K]];
68
- }[keyof TMap];
69
- type DecodedRequestMessage = DecodedMessageUnion<RequestMessageMap>;
70
- type DecodedResponseMessage = DecodedMessageUnion<ResponseMessageMap>;
71
- declare function encodeRequestMessage<T extends keyof RequestMessageMap>(id: string, type: T, payload: RequestMessageMap[T]): Promise<EncodedMessage>;
72
- declare function decodeRequestMessage(raw: EncodedMessage): Promise<DecodedRequestMessage>;
73
- declare function encodeResponseMessage<T extends keyof ResponseMessageMap>(id: string, type: T, payload: ResponseMessageMap[T]): Promise<EncodedMessage>;
74
- declare function decodeResponseMessage(raw: EncodedMessage): Promise<DecodedResponseMessage>;
75
-
76
142
  interface AsyncIdQueueCloseOptions {
77
143
  id?: string;
78
144
  reason?: unknown;
@@ -97,6 +163,9 @@ interface ToEventIteratorOptions extends SetSpanErrorOptions {
97
163
  declare function toEventIterator(queue: AsyncIdQueue<EventIteratorPayload>, id: string, cleanup: AsyncIteratorClassCleanupFn, options?: ToEventIteratorOptions): AsyncIteratorClass<unknown>;
98
164
  declare function resolveEventIterator(iterator: AsyncIterator<any>, callback: (payload: EventIteratorPayload) => Promise<'next' | 'abort'>): Promise<void>;
99
165
 
166
+ interface experimental_ResponseMessageSendFn {
167
+ (message: DecodedResponseMessage): Promisable<void>;
168
+ }
100
169
  interface ServerPeerHandleRequestFn {
101
170
  (request: StandardRequest): Promise<StandardResponse>;
102
171
  }
@@ -109,6 +178,21 @@ interface ServerPeerCloseOptions extends AsyncIdQueueCloseOptions$1 {
109
178
  abort?: boolean;
110
179
  }
111
180
  declare class ServerPeer {
181
+ private readonly peer;
182
+ constructor(send: EncodedMessageSendFn);
183
+ get length(): number;
184
+ open(id: string): AbortController;
185
+ /**
186
+ * @todo This method will return Promise<void> in the next major version.
187
+ */
188
+ message(raw: EncodedMessage, handleRequest?: ServerPeerHandleRequestFn): Promise<[id: string, StandardRequest | undefined]>;
189
+ /**
190
+ * @deprecated Please pass the `handleRequest` (second arg) function to the `message` method instead.
191
+ */
192
+ response(id: string, response: StandardResponse): Promise<void>;
193
+ close({ abort, ...options }?: ServerPeerCloseOptions): void;
194
+ }
195
+ declare class experimental_ServerPeerWithoutCodec {
112
196
  /**
113
197
  * Queue of event iterator messages sent from client, awaiting consumption
114
198
  */
@@ -118,13 +202,13 @@ declare class ServerPeer {
118
202
  */
119
203
  private readonly clientControllers;
120
204
  private readonly send;
121
- constructor(send: EncodedMessageSendFn);
205
+ constructor(send: experimental_ResponseMessageSendFn);
122
206
  get length(): number;
123
207
  open(id: string): AbortController;
124
208
  /**
125
209
  * @todo This method will return Promise<void> in the next major version.
126
210
  */
127
- message(raw: EncodedMessage, handleRequest?: ServerPeerHandleRequestFn): Promise<[id: string, StandardRequest | undefined]>;
211
+ message([id, type, payload]: DecodedRequestMessage, handleRequest?: ServerPeerHandleRequestFn): Promise<[id: string, StandardRequest | undefined]>;
128
212
  /**
129
213
  * @deprecated Please pass the `handleRequest` (second arg) function to the `message` method instead.
130
214
  */
@@ -132,5 +216,5 @@ declare class ServerPeer {
132
216
  close({ abort, ...options }?: ServerPeerCloseOptions): void;
133
217
  }
134
218
 
135
- export { ClientPeer, MessageType, ServerPeer, decodeRequestMessage, decodeResponseMessage, encodeRequestMessage, encodeResponseMessage, resolveEventIterator, toEventIterator };
136
- export type { ClientPeerCloseOptions, DecodedRequestMessage, DecodedResponseMessage, EncodedMessage, EncodedMessageSendFn, EventIteratorEvent, EventIteratorPayload, RequestMessageMap, ResponseMessageMap, ServerPeerCloseOptions, ServerPeerHandleRequestFn, ToEventIteratorOptions };
219
+ export { ClientPeer, MessageType, ServerPeer, decodeRequestMessage, decodeResponseMessage, deserializeRequestMessage, deserializeResponseMessage, encodeRequestMessage, encodeResponseMessage, experimental_ClientPeerWithoutCodec, experimental_ServerPeerWithoutCodec, resolveEventIterator, serializeRequestMessage, serializeResponseMessage, toEventIterator };
220
+ export type { BaseMessageFormat, ClientPeerCloseOptions, DecodedMessageUnion, DecodedRequestMessage, DecodedResponseMessage, EncodedMessage, EncodedMessageSendFn, EventIteratorEvent, EventIteratorPayload, RequestMessageMap, ResponseMessageMap, SerializedEventIteratorPayload, SerializedRequestPayload, SerializedResponsePayload, ServerPeerCloseOptions, ServerPeerHandleRequestFn, ToEventIteratorOptions, experimental_RequestMessageSendFn, experimental_ResponseMessageSendFn };
package/dist/index.mjs CHANGED
@@ -10,7 +10,7 @@ var MessageType = /* @__PURE__ */ ((MessageType2) => {
10
10
  MessageType2[MessageType2["ABORT_SIGNAL"] = 4] = "ABORT_SIGNAL";
11
11
  return MessageType2;
12
12
  })(MessageType || {});
13
- async function encodeRequestMessage(id, type, payload) {
13
+ function serializeRequestMessage(id, type, payload) {
14
14
  if (type === 3 /* EVENT_ITERATOR */) {
15
15
  const eventPayload = payload;
16
16
  const serializedPayload2 = {
@@ -18,35 +18,26 @@ async function encodeRequestMessage(id, type, payload) {
18
18
  d: eventPayload.data,
19
19
  m: eventPayload.meta
20
20
  };
21
- return encodeRawMessage({ i: id, t: type, p: serializedPayload2 });
21
+ return { i: id, t: type, p: serializedPayload2 };
22
22
  }
23
23
  if (type === 4 /* ABORT_SIGNAL */) {
24
- return encodeRawMessage({ i: id, t: type, p: payload });
24
+ return { i: id, t: type, p: payload };
25
25
  }
26
26
  const request = payload;
27
- const { body: processedBody, headers: processedHeaders } = await serializeBodyAndHeaders(
28
- request.body,
29
- request.headers
30
- );
31
27
  const serializedPayload = {
32
28
  u: request.url.toString().replace(SHORTABLE_ORIGIN_MATCHER, "/"),
33
- b: processedBody instanceof Blob ? void 0 : processedBody,
34
- h: Object.keys(processedHeaders).length > 0 ? processedHeaders : void 0,
29
+ b: request.body,
30
+ h: Object.keys(request.headers).length > 0 ? request.headers : void 0,
35
31
  m: request.method === "POST" ? void 0 : request.method
36
32
  };
37
- const baseMessage = {
33
+ return {
38
34
  i: id,
39
35
  p: serializedPayload
40
36
  };
41
- if (processedBody instanceof Blob) {
42
- return encodeRawMessage(baseMessage, processedBody);
43
- }
44
- return encodeRawMessage(baseMessage);
45
37
  }
46
- async function decodeRequestMessage(raw) {
47
- const { json: message, buffer } = await decodeRawMessage(raw);
38
+ function deserializeRequestMessage(message) {
48
39
  const id = message.i;
49
- const type = message.t;
40
+ const type = message.t ?? 1 /* REQUEST */;
50
41
  if (type === 3 /* EVENT_ITERATOR */) {
51
42
  const payload2 = message.p;
52
43
  return [id, type, { event: payload2.e, data: payload2.d, meta: payload2.m }];
@@ -55,16 +46,14 @@ async function decodeRequestMessage(raw) {
55
46
  return [id, type, message.p];
56
47
  }
57
48
  const payload = message.p;
58
- const headers = payload.h ?? {};
59
- const body = await deserializeBody(headers, payload.b, buffer);
60
49
  return [id, 1 /* REQUEST */, {
61
50
  url: payload.u.startsWith("/") ? new URL(`${SHORTABLE_ORIGIN}${payload.u}`) : new URL(payload.u),
62
- headers,
51
+ headers: payload.h ?? {},
63
52
  method: payload.m ?? "POST",
64
- body
53
+ body: payload.b
65
54
  }];
66
55
  }
67
- async function encodeResponseMessage(id, type, payload) {
56
+ function serializeResponseMessage(id, type, payload) {
68
57
  if (type === 3 /* EVENT_ITERATOR */) {
69
58
  const eventPayload = payload;
70
59
  const serializedPayload2 = {
@@ -72,32 +61,23 @@ async function encodeResponseMessage(id, type, payload) {
72
61
  d: eventPayload.data,
73
62
  m: eventPayload.meta
74
63
  };
75
- return encodeRawMessage({ i: id, t: type, p: serializedPayload2 });
64
+ return { i: id, t: type, p: serializedPayload2 };
76
65
  }
77
66
  if (type === 4 /* ABORT_SIGNAL */) {
78
- return encodeRawMessage({ i: id, t: type, p: void 0 });
67
+ return { i: id, t: type, p: void 0 };
79
68
  }
80
69
  const response = payload;
81
- const { body: processedBody, headers: processedHeaders } = await serializeBodyAndHeaders(
82
- response.body,
83
- response.headers
84
- );
85
70
  const serializedPayload = {
86
71
  s: response.status === 200 ? void 0 : response.status,
87
- h: Object.keys(processedHeaders).length > 0 ? processedHeaders : void 0,
88
- b: processedBody instanceof Blob ? void 0 : processedBody
72
+ h: Object.keys(response.headers).length > 0 ? response.headers : void 0,
73
+ b: response.body
89
74
  };
90
- const baseMessage = {
75
+ return {
91
76
  i: id,
92
77
  p: serializedPayload
93
78
  };
94
- if (processedBody instanceof Blob) {
95
- return encodeRawMessage(baseMessage, processedBody);
96
- }
97
- return encodeRawMessage(baseMessage);
98
79
  }
99
- async function decodeResponseMessage(raw) {
100
- const { json: message, buffer } = await decodeRawMessage(raw);
80
+ function deserializeResponseMessage(message) {
101
81
  const id = message.i;
102
82
  const type = message.t;
103
83
  if (type === 3 /* EVENT_ITERATOR */) {
@@ -108,9 +88,71 @@ async function decodeResponseMessage(raw) {
108
88
  return [id, type, message.p];
109
89
  }
110
90
  const payload = message.p;
111
- const headers = payload.h ?? {};
112
- const body = await deserializeBody(headers, payload.b, buffer);
113
- return [id, 2 /* RESPONSE */, { status: payload.s ?? 200, headers, body }];
91
+ return [id, 2 /* RESPONSE */, {
92
+ status: payload.s ?? 200,
93
+ headers: payload.h ?? {},
94
+ body: payload.b
95
+ }];
96
+ }
97
+ async function encodeRequestMessage(id, type, payload) {
98
+ if (type === 3 /* EVENT_ITERATOR */ || type === 4 /* ABORT_SIGNAL */) {
99
+ return encodeRawMessage(serializeRequestMessage(id, type, payload));
100
+ }
101
+ const request = payload;
102
+ const { body: processedBody, headers: processedHeaders } = await serializeBodyAndHeaders(
103
+ request.body,
104
+ request.headers
105
+ );
106
+ const modifiedRequest = {
107
+ ...request,
108
+ body: processedBody instanceof Blob ? void 0 : processedBody,
109
+ headers: processedHeaders
110
+ };
111
+ const baseMessage = serializeRequestMessage(id, 1 /* REQUEST */, modifiedRequest);
112
+ if (processedBody instanceof Blob) {
113
+ return encodeRawMessage(baseMessage, processedBody);
114
+ }
115
+ return encodeRawMessage(baseMessage);
116
+ }
117
+ async function decodeRequestMessage(raw) {
118
+ const { json: message, buffer } = await decodeRawMessage(raw);
119
+ const [id, type, payload] = deserializeRequestMessage(message);
120
+ if (type === 3 /* EVENT_ITERATOR */ || type === 4 /* ABORT_SIGNAL */) {
121
+ return [id, type, payload];
122
+ }
123
+ const request = payload;
124
+ const body = await deserializeBody(request.headers, request.body, buffer);
125
+ return [id, type, { ...request, body }];
126
+ }
127
+ async function encodeResponseMessage(id, type, payload) {
128
+ if (type === 3 /* EVENT_ITERATOR */ || type === 4 /* ABORT_SIGNAL */) {
129
+ return encodeRawMessage(serializeResponseMessage(id, type, payload));
130
+ }
131
+ const response = payload;
132
+ const { body: processedBody, headers: processedHeaders } = await serializeBodyAndHeaders(
133
+ response.body,
134
+ response.headers
135
+ );
136
+ const modifiedResponse = {
137
+ ...response,
138
+ body: processedBody instanceof Blob ? void 0 : processedBody,
139
+ headers: processedHeaders
140
+ };
141
+ const baseMessage = serializeResponseMessage(id, 2 /* RESPONSE */, modifiedResponse);
142
+ if (processedBody instanceof Blob) {
143
+ return encodeRawMessage(baseMessage, processedBody);
144
+ }
145
+ return encodeRawMessage(baseMessage);
146
+ }
147
+ async function decodeResponseMessage(raw) {
148
+ const { json: message, buffer } = await decodeRawMessage(raw);
149
+ const [id, type, payload] = deserializeResponseMessage(message);
150
+ if (type === 3 /* EVENT_ITERATOR */ || type === 4 /* ABORT_SIGNAL */) {
151
+ return [id, type, payload];
152
+ }
153
+ const response = payload;
154
+ const body = await deserializeBody(response.headers, response.body, buffer);
155
+ return [id, type, { ...response, body }];
114
156
  }
115
157
  async function serializeBodyAndHeaders(body, originalHeaders) {
116
158
  const headers = { ...originalHeaders };
@@ -301,6 +343,29 @@ function resolveEventIterator(iterator, callback) {
301
343
  }
302
344
 
303
345
  class ClientPeer {
346
+ peer;
347
+ constructor(send) {
348
+ this.peer = new experimental_ClientPeerWithoutCodec(async ([id, type, payload]) => {
349
+ await send(await encodeRequestMessage(id, type, payload));
350
+ });
351
+ }
352
+ get length() {
353
+ return this.peer.length;
354
+ }
355
+ open(id) {
356
+ return this.peer.open(id);
357
+ }
358
+ async request(request) {
359
+ return this.peer.request(request);
360
+ }
361
+ async message(raw) {
362
+ return this.peer.message(await decodeResponseMessage(raw));
363
+ }
364
+ close(options = {}) {
365
+ return this.peer.close(options);
366
+ }
367
+ }
368
+ class experimental_ClientPeerWithoutCodec {
304
369
  idGenerator = new SequentialIdGenerator();
305
370
  /**
306
371
  * Queue of responses sent from server, awaiting consumption
@@ -320,11 +385,12 @@ class ClientPeer {
320
385
  cleanupFns = /* @__PURE__ */ new Map();
321
386
  send;
322
387
  constructor(send) {
323
- this.send = async (id, ...rest) => encodeRequestMessage(id, ...rest).then(async (raw) => {
388
+ this.send = async (message) => {
389
+ const id = message[0];
324
390
  if (this.serverControllers.has(id)) {
325
- await send(raw);
391
+ await send(message);
326
392
  }
327
- });
393
+ };
328
394
  }
329
395
  get length() {
330
396
  return (+this.responseQueue.length + this.serverEventIteratorQueue.length + this.serverControllers.size + this.cleanupFns.size) / 4;
@@ -354,14 +420,14 @@ class ClientPeer {
354
420
  otelConfig.propagation.inject(otelConfig.context.active(), headers);
355
421
  request = { ...request, headers };
356
422
  }
357
- await this.send(id, MessageType.REQUEST, request);
423
+ await this.send([id, MessageType.REQUEST, request]);
358
424
  if (signal?.aborted) {
359
- await this.send(id, MessageType.ABORT_SIGNAL, void 0);
425
+ await this.send([id, MessageType.ABORT_SIGNAL, void 0]);
360
426
  throw signal.reason;
361
427
  }
362
428
  let abortListener;
363
429
  signal?.addEventListener("abort", abortListener = async () => {
364
- await this.send(id, MessageType.ABORT_SIGNAL, void 0);
430
+ await this.send([id, MessageType.ABORT_SIGNAL, void 0]);
365
431
  this.close({ id, reason: signal.reason });
366
432
  }, { once: true });
367
433
  this.cleanupFns.get(id)?.push(() => {
@@ -373,7 +439,7 @@ class ClientPeer {
373
439
  if (serverController.signal.aborted) {
374
440
  return "abort";
375
441
  }
376
- await this.send(id, MessageType.EVENT_ITERATOR, payload);
442
+ await this.send([id, MessageType.EVENT_ITERATOR, payload]);
377
443
  return "next";
378
444
  });
379
445
  }
@@ -385,7 +451,7 @@ class ClientPeer {
385
451
  async (reason) => {
386
452
  try {
387
453
  if (reason !== "next") {
388
- await this.send(id, MessageType.ABORT_SIGNAL, void 0);
454
+ await this.send([id, MessageType.ABORT_SIGNAL, void 0]);
389
455
  }
390
456
  } finally {
391
457
  this.close({ id });
@@ -407,8 +473,7 @@ class ClientPeer {
407
473
  }
408
474
  );
409
475
  }
410
- async message(raw) {
411
- const [id, type, payload] = await decodeResponseMessage(raw);
476
+ async message([id, type, payload]) {
412
477
  if (type === MessageType.ABORT_SIGNAL) {
413
478
  this.serverControllers.get(id)?.abort();
414
479
  return;
@@ -442,6 +507,35 @@ class ClientPeer {
442
507
  }
443
508
 
444
509
  class ServerPeer {
510
+ peer;
511
+ constructor(send) {
512
+ this.peer = new experimental_ServerPeerWithoutCodec(async ([id, type, payload]) => {
513
+ await send(await encodeResponseMessage(id, type, payload));
514
+ });
515
+ }
516
+ get length() {
517
+ return this.peer.length;
518
+ }
519
+ open(id) {
520
+ return this.peer.open(id);
521
+ }
522
+ /**
523
+ * @todo This method will return Promise<void> in the next major version.
524
+ */
525
+ async message(raw, handleRequest) {
526
+ return this.peer.message(await decodeRequestMessage(raw), handleRequest);
527
+ }
528
+ /**
529
+ * @deprecated Please pass the `handleRequest` (second arg) function to the `message` method instead.
530
+ */
531
+ async response(id, response) {
532
+ return this.peer.response(id, response);
533
+ }
534
+ close({ abort = true, ...options } = {}) {
535
+ return this.peer.close({ ...options, abort });
536
+ }
537
+ }
538
+ class experimental_ServerPeerWithoutCodec {
445
539
  /**
446
540
  * Queue of event iterator messages sent from client, awaiting consumption
447
541
  */
@@ -452,11 +546,12 @@ class ServerPeer {
452
546
  clientControllers = /* @__PURE__ */ new Map();
453
547
  send;
454
548
  constructor(send) {
455
- this.send = (id, ...rest) => encodeResponseMessage(id, ...rest).then(async (raw) => {
549
+ this.send = async (message) => {
550
+ const id = message[0];
456
551
  if (this.clientControllers.has(id)) {
457
- await send(raw);
552
+ await send(message);
458
553
  }
459
- });
554
+ };
460
555
  }
461
556
  get length() {
462
557
  return (this.clientEventIteratorQueue.length + this.clientControllers.size) / 2;
@@ -470,8 +565,7 @@ class ServerPeer {
470
565
  /**
471
566
  * @todo This method will return Promise<void> in the next major version.
472
567
  */
473
- async message(raw, handleRequest) {
474
- const [id, type, payload] = await decodeRequestMessage(raw);
568
+ async message([id, type, payload], handleRequest) {
475
569
  if (type === MessageType.ABORT_SIGNAL) {
476
570
  this.close({ id, reason: new AbortError("Client aborted the request") });
477
571
  return [id, void 0];
@@ -492,7 +586,7 @@ class ServerPeer {
492
586
  id,
493
587
  async (reason) => {
494
588
  if (reason !== "next") {
495
- await this.send(id, MessageType.ABORT_SIGNAL, void 0);
589
+ await this.send([id, MessageType.ABORT_SIGNAL, void 0]);
496
590
  }
497
591
  },
498
592
  { signal }
@@ -536,7 +630,7 @@ class ServerPeer {
536
630
  return;
537
631
  }
538
632
  try {
539
- await this.send(id, MessageType.RESPONSE, response);
633
+ await this.send([id, MessageType.RESPONSE, response]);
540
634
  if (!signal.aborted && isAsyncIteratorObject(response.body)) {
541
635
  if (response.body instanceof HibernationEventIterator) {
542
636
  response.body.hibernationCallback?.(id);
@@ -546,7 +640,7 @@ class ServerPeer {
546
640
  if (signal.aborted) {
547
641
  return "abort";
548
642
  }
549
- await this.send(id, MessageType.EVENT_ITERATOR, payload);
643
+ await this.send([id, MessageType.EVENT_ITERATOR, payload]);
550
644
  return "next";
551
645
  });
552
646
  }
@@ -573,4 +667,4 @@ class ServerPeer {
573
667
  }
574
668
  }
575
669
 
576
- export { ClientPeer, MessageType, ServerPeer, decodeRequestMessage, decodeResponseMessage, encodeRequestMessage, encodeResponseMessage, resolveEventIterator, toEventIterator };
670
+ export { ClientPeer, MessageType, ServerPeer, decodeRequestMessage, decodeResponseMessage, deserializeRequestMessage, deserializeResponseMessage, encodeRequestMessage, encodeResponseMessage, experimental_ClientPeerWithoutCodec, experimental_ServerPeerWithoutCodec, resolveEventIterator, serializeRequestMessage, serializeResponseMessage, toEventIterator };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@orpc/standard-server-peer",
3
3
  "type": "module",
4
- "version": "1.10.0",
4
+ "version": "1.10.2",
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": "1.10.0",
27
- "@orpc/standard-server": "1.10.0"
26
+ "@orpc/shared": "1.10.2",
27
+ "@orpc/standard-server": "1.10.2"
28
28
  },
29
29
  "scripts": {
30
30
  "build": "unbuild",