@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 +4 -3
- package/dist/index.d.ts +4 -3
- package/dist/index.mjs +47 -34
- package/package.json +3 -3
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
|
|
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
|
|
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,
|
|
2
|
-
import {
|
|
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
|
|
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,
|
|
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
|
-
|
|
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
|
|
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,
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
137
|
-
|
|
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,
|
|
166
|
+
async function encodeRawMessage(data, blobData) {
|
|
154
167
|
const json = stringifyJSON(data);
|
|
155
|
-
if (
|
|
168
|
+
if (blobData === void 0) {
|
|
156
169
|
return json;
|
|
157
170
|
}
|
|
158
|
-
return
|
|
171
|
+
return new Blob([
|
|
159
172
|
new TextEncoder().encode(json),
|
|
160
173
|
new Uint8Array([JSON_AND_BINARY_DELIMITER]),
|
|
161
|
-
|
|
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
|
|
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.
|
|
175
|
-
const
|
|
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
|
-
|
|
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.
|
|
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.
|
|
27
|
-
"@orpc/standard-server": "0.0.0-next.
|
|
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",
|