@orpc/client 2.0.0-beta.4 → 2.0.0-beta.40

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.
Files changed (30) hide show
  1. package/README.md +97 -94
  2. package/dist/adapters/fetch/index.d.mts +16 -33
  3. package/dist/adapters/fetch/index.d.ts +16 -33
  4. package/dist/adapters/fetch/index.mjs +32 -30
  5. package/dist/adapters/message-port/index.d.mts +13 -8
  6. package/dist/adapters/message-port/index.d.ts +13 -8
  7. package/dist/adapters/message-port/index.mjs +22 -17
  8. package/dist/adapters/standard/index.d.mts +9 -10
  9. package/dist/adapters/standard/index.d.ts +9 -10
  10. package/dist/adapters/standard/index.mjs +5 -5
  11. package/dist/adapters/websocket/index.d.mts +21 -16
  12. package/dist/adapters/websocket/index.d.ts +21 -16
  13. package/dist/adapters/websocket/index.mjs +14 -14
  14. package/dist/index.d.mts +62 -61
  15. package/dist/index.d.ts +62 -61
  16. package/dist/index.mjs +47 -54
  17. package/dist/plugins/index.d.mts +134 -13
  18. package/dist/plugins/index.d.ts +134 -13
  19. package/dist/plugins/index.mjs +298 -27
  20. package/dist/shared/{client.Cby_-GGh.d.mts → client.BWkR2vPU.d.mts} +2 -2
  21. package/dist/shared/client.BYHnU_Z3.mjs +469 -0
  22. package/dist/shared/{client.CPF3hX6O.d.ts → client.BnpRXnLi.d.ts} +2 -2
  23. package/dist/shared/{client.8ug8I-zu.d.mts → client.BoXZCzuS.d.mts} +56 -16
  24. package/dist/shared/{client.8ug8I-zu.d.ts → client.BoXZCzuS.d.ts} +56 -16
  25. package/dist/shared/{client.Dnfj8jnT.mjs → client.Dtv1JPkU.mjs} +19 -15
  26. package/dist/shared/{client.DXhchJ84.mjs → client.VXsLhJtT.mjs} +25 -30
  27. package/dist/shared/{client.BdItY5DT.d.mts → client.n8K9dFhY.d.mts} +25 -4
  28. package/dist/shared/{client.BdItY5DT.d.ts → client.n8K9dFhY.d.ts} +25 -4
  29. package/package.json +20 -8
  30. package/dist/shared/client.DMXKFDyV.mjs +0 -343
@@ -1,343 +0,0 @@
1
- import { isPlainObject, wrapAsyncIterator, isTypescriptObject, isAsyncIteratorObject, stringifyJSON } from '@orpc/shared';
2
- import { getEventMeta, withEventMeta, ErrorEvent } from '@standardserver/core';
3
- import { O as ORPCError } from './client.Dnfj8jnT.mjs';
4
-
5
- function isInferableError(error) {
6
- return error instanceof ORPCError && error.inferable;
7
- }
8
- function toORPCError(error) {
9
- return error instanceof ORPCError ? error : new ORPCError("INTERNAL_SERVER_ERROR", { cause: error });
10
- }
11
- function isORPCErrorJson(json) {
12
- if (!isPlainObject(json)) {
13
- return false;
14
- }
15
- const validKeys = ["defined", "inferable", "code", "message", "data"];
16
- if (Object.keys(json).some((k) => !validKeys.includes(k))) {
17
- return false;
18
- }
19
- return "defined" in json && typeof json.defined === "boolean" && "inferable" in json && typeof json.inferable === "boolean" && "code" in json && typeof json.code === "string" && "message" in json && typeof json.message === "string";
20
- }
21
- function createORPCErrorFromJson(json, options = {}) {
22
- const error = new ORPCError(json.code, {
23
- ...json,
24
- ...options
25
- });
26
- error.defined = json.defined;
27
- error.inferable = json.inferable;
28
- return error;
29
- }
30
- function cloneORPCError(error) {
31
- const cloned = new ORPCError(error.code, {
32
- ...error,
33
- message: error.message,
34
- data: error.data,
35
- cause: error.cause
36
- });
37
- cloned.stack = error.stack;
38
- cloned.defined = error.defined;
39
- cloned.inferable = error.inferable;
40
- return cloned;
41
- }
42
-
43
- function wrapEventIteratorPreservingMeta(iterator, { mapResult, mapError, ...rest }) {
44
- return wrapAsyncIterator(iterator, {
45
- ...rest,
46
- mapResult: mapResult && (async (result) => {
47
- const mapped = await mapResult(result);
48
- if (mapped.value !== result.value) {
49
- const meta = getEventMeta(result.value);
50
- if (meta && isTypescriptObject(mapped.value)) {
51
- return { done: mapped.done, value: withEventMeta(mapped.value, meta) };
52
- }
53
- }
54
- return mapped;
55
- }),
56
- mapError: mapError && (async (error) => {
57
- const mapped = await mapError(error);
58
- if (mapped !== error) {
59
- const meta = getEventMeta(error);
60
- if (meta && isTypescriptObject(mapped)) {
61
- return withEventMeta(mapped, meta);
62
- }
63
- }
64
- return mapped;
65
- })
66
- });
67
- }
68
-
69
- const REGEX_STRING_PATTERN = /^\/(.*)\/([a-z]*)$/;
70
- const DEFAULT_RPC_JSON_SERIALIZER_HANDLERS = {
71
- undefined: {
72
- condition(data) {
73
- return data === void 0;
74
- },
75
- serialize() {
76
- return null;
77
- },
78
- deserialize() {
79
- return void 0;
80
- },
81
- isTerminal: true
82
- },
83
- bigint: {
84
- condition(data) {
85
- return typeof data === "bigint";
86
- },
87
- serialize(data) {
88
- return data.toString();
89
- },
90
- deserialize(serialized) {
91
- return BigInt(serialized);
92
- },
93
- isTerminal: true
94
- },
95
- date: {
96
- condition(data) {
97
- return data instanceof Date;
98
- },
99
- serialize(data) {
100
- if (Number.isNaN(data.getTime())) {
101
- return null;
102
- }
103
- return data.toISOString();
104
- },
105
- deserialize(serialized) {
106
- return new Date(serialized ?? "Invalid Date");
107
- },
108
- isTerminal: true
109
- },
110
- nan: {
111
- condition(data) {
112
- return typeof data === "number" && Number.isNaN(data);
113
- },
114
- serialize() {
115
- return null;
116
- },
117
- deserialize() {
118
- return Number.NaN;
119
- },
120
- isTerminal: true
121
- },
122
- url: {
123
- condition(data) {
124
- return data instanceof URL;
125
- },
126
- serialize(data) {
127
- return data.toString();
128
- },
129
- deserialize(serialized) {
130
- return new URL(serialized);
131
- },
132
- isTerminal: true
133
- },
134
- regexp: {
135
- condition(data) {
136
- return data instanceof RegExp;
137
- },
138
- serialize(data) {
139
- return data.toString();
140
- },
141
- deserialize(serialized) {
142
- const [, pattern, flags] = serialized.match(REGEX_STRING_PATTERN);
143
- return new RegExp(pattern, flags);
144
- },
145
- isTerminal: true
146
- },
147
- set: {
148
- condition(data) {
149
- return data instanceof Set;
150
- },
151
- serialize(data) {
152
- return Array.from(data);
153
- },
154
- deserialize(serialized) {
155
- return new Set(serialized);
156
- }
157
- },
158
- map: {
159
- condition(data) {
160
- return data instanceof Map;
161
- },
162
- serialize(data) {
163
- return Array.from(data.entries());
164
- },
165
- deserialize(serialized) {
166
- return new Map(serialized);
167
- }
168
- }
169
- };
170
- class RPCJsonSerializer {
171
- handlers;
172
- omitUndefinedProperties;
173
- constructor(options = {}) {
174
- this.handlers = {
175
- ...DEFAULT_RPC_JSON_SERIALIZER_HANDLERS,
176
- ...options.handlers
177
- };
178
- this.omitUndefinedProperties = options.omitUndefinedProperties !== false;
179
- }
180
- serialize(data) {
181
- const [json, meta_, maps, blobs] = this.serializeValue(data, [], [], [], []);
182
- const meta = meta_.length === 0 ? void 0 : meta_;
183
- if (maps.length === 0) {
184
- return { json, meta };
185
- }
186
- return { json, meta, maps, blobs };
187
- }
188
- serializeValue(data, segments, meta, maps, blobs) {
189
- for (const key in this.handlers) {
190
- const handler = this.handlers[key];
191
- if (handler && handler.condition(data)) {
192
- const serialized = handler.serialize(data);
193
- if (handler.isTerminal) {
194
- meta.push([key, ...segments]);
195
- return [serialized, meta, maps, blobs];
196
- }
197
- const result = this.serializeValue(serialized, segments, meta, maps, blobs);
198
- meta.push([key, ...segments]);
199
- return result;
200
- }
201
- }
202
- if (data instanceof Blob) {
203
- maps.push(segments);
204
- blobs.push(data);
205
- return [data, meta, maps, blobs];
206
- }
207
- if (Array.isArray(data)) {
208
- const json = data.map((v, i) => {
209
- return this.serializeValue(v, [...segments, i], meta, maps, blobs)[0];
210
- });
211
- return [json, meta, maps, blobs];
212
- }
213
- if (isPlainObject(data)) {
214
- const json = {};
215
- for (const k in data) {
216
- const v = data[k];
217
- if (k === "toJSON" && typeof v === "function") {
218
- continue;
219
- }
220
- if (v === void 0 && this.omitUndefinedProperties) {
221
- continue;
222
- }
223
- json[k] = this.serializeValue(v, [...segments, k], meta, maps, blobs)[0];
224
- }
225
- return [json, meta, maps, blobs];
226
- }
227
- return [data, meta, maps, blobs];
228
- }
229
- deserialize(serialized) {
230
- const ref = { data: serialized.json };
231
- if (serialized.blobs?.length) {
232
- serialized.maps.forEach((segments, i) => {
233
- let currentRef = ref;
234
- let preSegment = "data";
235
- segments.forEach((segment) => {
236
- currentRef = currentRef[preSegment];
237
- preSegment = segment;
238
- if (!Object.hasOwn(currentRef, preSegment)) {
239
- throw new Error(`Security error: Invalid serialized data. Segment "${preSegment}" does not exist.`);
240
- }
241
- });
242
- currentRef[preSegment] = serialized.blobs[i];
243
- });
244
- }
245
- serialized.meta?.forEach((item) => {
246
- const type = item[0];
247
- let currentRef = ref;
248
- let preSegment = "data";
249
- for (let i = 1; i < item.length; i++) {
250
- currentRef = currentRef[preSegment];
251
- preSegment = item[i];
252
- if (!Object.hasOwn(currentRef, preSegment)) {
253
- throw new Error(`Security error: Invalid serialized data. Segment "${preSegment}" does not exist.`);
254
- }
255
- }
256
- currentRef[preSegment] = this.handlers[type].deserialize(currentRef[preSegment]);
257
- });
258
- return ref.data;
259
- }
260
- }
261
-
262
- class RPCSerializer {
263
- jsonSerializer;
264
- defaultSerializeOptions;
265
- constructor(options = {}) {
266
- this.jsonSerializer = new RPCJsonSerializer(options);
267
- this.defaultSerializeOptions = options.serialize;
268
- }
269
- serialize(data, options = {}) {
270
- if (data === void 0 || data instanceof ReadableStream || data instanceof Blob) {
271
- return data;
272
- }
273
- if (isAsyncIteratorObject(data)) {
274
- return wrapEventIteratorPreservingMeta(data, {
275
- mapResult: (result) => {
276
- if (result.value === void 0) {
277
- return result;
278
- }
279
- return { done: result.done, value: this.serializeValue(result.value, options) };
280
- },
281
- mapError: (e) => new ErrorEvent(
282
- this.serializeValue(toORPCError(e).toJSON(), { ...options, useFormDataForBlobFields: false }),
283
- { cause: e }
284
- )
285
- });
286
- }
287
- return this.serializeValue(data, options);
288
- }
289
- serializeValue(data, options) {
290
- const useFormDataForBlobs = options.useFormDataForBlobFields ?? this.defaultSerializeOptions?.useFormDataForBlobFields ?? true;
291
- const { json, meta, maps, blobs } = this.jsonSerializer.serialize(data);
292
- if (!useFormDataForBlobs || !blobs?.length) {
293
- return { json, meta };
294
- }
295
- const form = new FormData();
296
- form.set("data", stringifyJSON({ json, meta, maps }));
297
- blobs.forEach((blob, i) => {
298
- form.set(i.toString(), blob);
299
- });
300
- return form;
301
- }
302
- deserialize(data) {
303
- if (data === void 0 || data instanceof ReadableStream || data instanceof Blob) {
304
- return data;
305
- }
306
- if (isAsyncIteratorObject(data)) {
307
- return wrapEventIteratorPreservingMeta(data, {
308
- mapResult: (result) => {
309
- if (result.value === void 0) {
310
- return result;
311
- }
312
- return { done: result.done, value: this.deserializeValue(result.value) };
313
- },
314
- mapError: (e) => {
315
- if (!(e instanceof ErrorEvent)) {
316
- return e;
317
- }
318
- const deserialized = this.deserializeValue(e.data);
319
- if (isORPCErrorJson(deserialized)) {
320
- return createORPCErrorFromJson(deserialized, { cause: e });
321
- }
322
- return new ErrorEvent(deserialized, { cause: e });
323
- }
324
- });
325
- }
326
- return this.deserializeValue(data);
327
- }
328
- deserializeValue(data) {
329
- if (!(data instanceof FormData)) {
330
- return this.jsonSerializer.deserialize(data);
331
- }
332
- const serialized = JSON.parse(data.get("data"));
333
- const blobs = [];
334
- for (const [key, value] of data.entries()) {
335
- if (value instanceof Blob) {
336
- blobs[Number(key)] = value;
337
- }
338
- }
339
- return this.jsonSerializer.deserialize({ ...serialized, blobs });
340
- }
341
- }
342
-
343
- export { RPCSerializer as R, isInferableError as a, RPCJsonSerializer as b, createORPCErrorFromJson as c, cloneORPCError as d, isORPCErrorJson as i, toORPCError as t, wrapEventIteratorPreservingMeta as w };