@orpc/standard-server-peer 0.0.0-next.ac518b6 → 0.0.0-next.add5acf

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 } from '@orpc/standard-server';
2
+ import { StandardRequest, StandardResponse, EventMeta, StandardHeaders } from '@orpc/standard-server';
3
3
 
4
- type EncodedMessage = string | ArrayBufferLike | Uint8Array;
4
+ type EncodedMessage = string | ArrayBufferLike;
5
5
  interface EncodedMessageSendFn {
6
6
  (message: EncodedMessage): Promisable<void>;
7
7
  }
@@ -59,6 +59,7 @@ 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;
62
63
 
63
64
  interface AsyncIdQueueCloseOptions {
64
65
  id?: string;
@@ -100,5 +101,5 @@ declare class ServerPeer {
100
101
  close({ abort, ...options }?: ServerPeerCloseOptions): void;
101
102
  }
102
103
 
103
- export { ClientPeer, MessageType, ServerPeer, decodeRequestMessage, decodeResponseMessage, encodeRequestMessage, encodeResponseMessage, resolveEventIterator, toEventIterator };
104
+ export { ClientPeer, MessageType, ServerPeer, decodeRequestMessage, decodeResponseMessage, encodeRequestMessage, encodeResponseMessage, isEventIteratorHeaders, resolveEventIterator, toEventIterator };
104
105
  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 } from '@orpc/standard-server';
2
+ import { StandardRequest, StandardResponse, EventMeta, StandardHeaders } from '@orpc/standard-server';
3
3
 
4
- type EncodedMessage = string | ArrayBufferLike | Uint8Array;
4
+ type EncodedMessage = string | ArrayBufferLike;
5
5
  interface EncodedMessageSendFn {
6
6
  (message: EncodedMessage): Promisable<void>;
7
7
  }
@@ -59,6 +59,7 @@ 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;
62
63
 
63
64
  interface AsyncIdQueueCloseOptions {
64
65
  id?: string;
@@ -100,5 +101,5 @@ declare class ServerPeer {
100
101
  close({ abort, ...options }?: ServerPeerCloseOptions): void;
101
102
  }
102
103
 
103
- export { ClientPeer, MessageType, ServerPeer, decodeRequestMessage, decodeResponseMessage, encodeRequestMessage, encodeResponseMessage, resolveEventIterator, toEventIterator };
104
+ export { ClientPeer, MessageType, ServerPeer, decodeRequestMessage, decodeResponseMessage, encodeRequestMessage, encodeResponseMessage, isEventIteratorHeaders, resolveEventIterator, toEventIterator };
104
105
  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, readAsBuffer, AsyncIteratorClass, isTypescriptObject, SequentialIdGenerator, AsyncIdQueue } from '@orpc/shared';
2
- import { generateContentDisposition, flattenHeader, getFilenameFromContentDisposition, withEventMeta, ErrorEvent, getEventMeta, isEventIteratorHeaders, experimental_HibernationEventIterator } from '@orpc/standard-server';
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';
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 serializeBodyAndHeaders(
25
+ const { body: processedBody, headers: processedHeaders } = await prepareBodyAndHeadersForSerialization(
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, buffer } = await decodeRawMessage(raw);
45
+ const { json: message, blobData } = await decodeRawMessage(raw);
46
46
  const id = message.i;
47
47
  const type = message.t;
48
48
  if (type === 3 /* EVENT_ITERATOR */) {
@@ -54,7 +54,20 @@ async function decodeRequestMessage(raw) {
54
54
  }
55
55
  const payload = message.p;
56
56
  const headers = payload.h ?? {};
57
- const body = await deserializeBody(headers, payload.b, buffer);
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
+ }
58
71
  return [id, 1 /* REQUEST */, { url: new URL(payload.u, "orpc:/"), headers, method: payload.m ?? "POST", body }];
59
72
  }
60
73
  async function encodeResponseMessage(id, type, payload) {
@@ -71,7 +84,7 @@ async function encodeResponseMessage(id, type, payload) {
71
84
  return encodeRawMessage({ i: id, t: type, p: void 0 });
72
85
  }
73
86
  const response = payload;
74
- const { body: processedBody, headers: processedHeaders } = await serializeBodyAndHeaders(
87
+ const { body: processedBody, headers: processedHeaders } = await prepareBodyAndHeadersForSerialization(
75
88
  response.body,
76
89
  response.headers
77
90
  );
@@ -90,7 +103,7 @@ async function encodeResponseMessage(id, type, payload) {
90
103
  return encodeRawMessage(baseMessage);
91
104
  }
92
105
  async function decodeResponseMessage(raw) {
93
- const { json: message, buffer } = await decodeRawMessage(raw);
106
+ const { json: message, blobData } = await decodeRawMessage(raw);
94
107
  const id = message.i;
95
108
  const type = message.t;
96
109
  if (type === 3 /* EVENT_ITERATOR */) {
@@ -102,10 +115,23 @@ async function decodeResponseMessage(raw) {
102
115
  }
103
116
  const payload = message.p;
104
117
  const headers = payload.h ?? {};
105
- const body = await deserializeBody(headers, payload.b, buffer);
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
+ }
106
132
  return [id, 2 /* RESPONSE */, { status: payload.s ?? 200, headers, body }];
107
133
  }
108
- async function serializeBodyAndHeaders(body, originalHeaders) {
134
+ async function prepareBodyAndHeadersForSerialization(body, originalHeaders) {
109
135
  const headers = { ...originalHeaders };
110
136
  const originalContentDisposition = headers["content-disposition"];
111
137
  delete headers["content-type"];
@@ -133,49 +159,36 @@ async function serializeBodyAndHeaders(body, originalHeaders) {
133
159
  }
134
160
  return { body, headers };
135
161
  }
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;
162
+ function isEventIteratorHeaders(headers) {
163
+ return Boolean(flattenHeader(headers["content-type"])?.startsWith("text/event-stream") && headers["content-disposition"] === void 0);
151
164
  }
152
165
  const JSON_AND_BINARY_DELIMITER = 255;
153
- async function encodeRawMessage(data, blob) {
166
+ async function encodeRawMessage(data, blobData) {
154
167
  const json = stringifyJSON(data);
155
- if (blob === void 0 || blob.size === 0) {
168
+ if (blobData === void 0) {
156
169
  return json;
157
170
  }
158
- return readAsBuffer(new Blob([
171
+ return new Blob([
159
172
  new TextEncoder().encode(json),
160
173
  new Uint8Array([JSON_AND_BINARY_DELIMITER]),
161
- blob
162
- ]));
174
+ blobData
175
+ ]).arrayBuffer();
163
176
  }
164
177
  async function decodeRawMessage(raw) {
165
178
  if (typeof raw === "string") {
166
179
  return { json: JSON.parse(raw) };
167
180
  }
168
- const buffer = raw instanceof Uint8Array ? raw : new Uint8Array(raw);
181
+ const buffer = new Uint8Array(raw instanceof Blob ? await raw.arrayBuffer() : raw);
169
182
  const delimiterIndex = buffer.indexOf(JSON_AND_BINARY_DELIMITER);
170
183
  if (delimiterIndex === -1) {
171
184
  const jsonPart2 = new TextDecoder().decode(buffer);
172
185
  return { json: JSON.parse(jsonPart2) };
173
186
  }
174
- const jsonPart = new TextDecoder().decode(buffer.subarray(0, delimiterIndex));
175
- const bufferPart = buffer.subarray(delimiterIndex + 1);
187
+ const jsonPart = new TextDecoder().decode(buffer.slice(0, delimiterIndex));
188
+ const blobData = buffer.slice(delimiterIndex + 1);
176
189
  return {
177
190
  json: JSON.parse(jsonPart),
178
- buffer: bufferPart
191
+ blobData: blobData.buffer
179
192
  };
180
193
  }
181
194
 
@@ -436,4 +449,4 @@ class ServerPeer {
436
449
  }
437
450
  }
438
451
 
439
- export { ClientPeer, MessageType, ServerPeer, decodeRequestMessage, decodeResponseMessage, encodeRequestMessage, encodeResponseMessage, resolveEventIterator, toEventIterator };
452
+ export { ClientPeer, MessageType, ServerPeer, decodeRequestMessage, decodeResponseMessage, encodeRequestMessage, encodeResponseMessage, isEventIteratorHeaders, 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.ac518b6",
4
+ "version": "0.0.0-next.add5acf",
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.ac518b6",
27
- "@orpc/standard-server": "0.0.0-next.ac518b6"
26
+ "@orpc/shared": "0.0.0-next.add5acf",
27
+ "@orpc/standard-server": "0.0.0-next.add5acf"
28
28
  },
29
29
  "scripts": {
30
30
  "build": "unbuild",