@orpc/standard-server-peer 0.0.0-next.e710b76 → 0.0.0-next.e788265

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,7 +1,7 @@
1
1
  import { Promisable, AsyncIdQueueCloseOptions as AsyncIdQueueCloseOptions$1, AsyncIteratorClassCleanupFn, AsyncIteratorClass } from '@orpc/shared';
2
- import { StandardRequest, StandardResponse, EventMeta, StandardHeaders } from '@orpc/standard-server';
2
+ import { StandardRequest, StandardResponse, EventMeta } from '@orpc/standard-server';
3
3
 
4
- type EncodedMessage = string | ArrayBufferLike;
4
+ type EncodedMessage = string | ArrayBufferLike | Uint8Array;
5
5
  interface EncodedMessageSendFn {
6
6
  (message: EncodedMessage): Promisable<void>;
7
7
  }
@@ -59,7 +59,6 @@ declare function encodeRequestMessage<T extends keyof RequestMessageMap>(id: str
59
59
  declare function decodeRequestMessage(raw: EncodedMessage): Promise<DecodedRequestMessage>;
60
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
64
  id?: string;
@@ -101,5 +100,5 @@ declare class ServerPeer {
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
1
  import { Promisable, AsyncIdQueueCloseOptions as AsyncIdQueueCloseOptions$1, AsyncIteratorClassCleanupFn, AsyncIteratorClass } from '@orpc/shared';
2
- import { StandardRequest, StandardResponse, EventMeta, StandardHeaders } from '@orpc/standard-server';
2
+ import { StandardRequest, StandardResponse, EventMeta } from '@orpc/standard-server';
3
3
 
4
- type EncodedMessage = string | ArrayBufferLike;
4
+ type EncodedMessage = string | ArrayBufferLike | Uint8Array;
5
5
  interface EncodedMessageSendFn {
6
6
  (message: EncodedMessage): Promisable<void>;
7
7
  }
@@ -59,7 +59,6 @@ declare function encodeRequestMessage<T extends keyof RequestMessageMap>(id: str
59
59
  declare function decodeRequestMessage(raw: EncodedMessage): Promise<DecodedRequestMessage>;
60
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
64
  id?: string;
@@ -101,5 +100,5 @@ declare class ServerPeer {
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, AsyncIteratorClass, isTypescriptObject, SequentialIdGenerator, AsyncIdQueue } from '@orpc/shared';
2
- import { flattenHeader, getFilenameFromContentDisposition, generateContentDisposition, withEventMeta, ErrorEvent, getEventMeta, experimental_HibernationEventIterator } 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,36 +133,49 @@ 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
- ]).arrayBuffer();
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
 
@@ -449,4 +436,4 @@ class ServerPeer {
449
436
  }
450
437
  }
451
438
 
452
- 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.e710b76",
4
+ "version": "0.0.0-next.e788265",
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/standard-server": "0.0.0-next.e710b76",
27
- "@orpc/shared": "0.0.0-next.e710b76"
26
+ "@orpc/shared": "0.0.0-next.e788265",
27
+ "@orpc/standard-server": "0.0.0-next.e788265"
28
28
  },
29
29
  "scripts": {
30
30
  "build": "unbuild",