seroval 1.4.0 → 1.4.1
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/cjs/development/index.cjs +524 -364
- package/dist/cjs/development/index.cjs.map +3 -3
- package/dist/cjs/production/index.cjs +3 -3
- package/dist/esm/development/index.mjs +524 -364
- package/dist/esm/development/index.mjs.map +3 -3
- package/dist/esm/production/index.mjs +3 -3
- package/dist/types/core/base-primitives.d.ts +2 -2
- package/dist/types/core/base-primitives.d.ts.map +1 -1
- package/dist/types/core/compat.d.ts +2 -1
- package/dist/types/core/compat.d.ts.map +1 -1
- package/dist/types/core/constants.d.ts +2 -2
- package/dist/types/core/constants.d.ts.map +1 -1
- package/dist/types/core/constructors.d.ts +1 -1
- package/dist/types/core/constructors.d.ts.map +1 -1
- package/dist/types/core/context/async-parser.d.ts +5 -4
- package/dist/types/core/context/async-parser.d.ts.map +1 -1
- package/dist/types/core/context/deserializer.d.ts +7 -2
- package/dist/types/core/context/deserializer.d.ts.map +1 -1
- package/dist/types/core/context/parser.d.ts +3 -1
- package/dist/types/core/context/parser.d.ts.map +1 -1
- package/dist/types/core/context/serializer.d.ts.map +1 -1
- package/dist/types/core/context/sync-parser.d.ts +5 -5
- package/dist/types/core/context/sync-parser.d.ts.map +1 -1
- package/dist/types/core/cross/index.d.ts.map +1 -1
- package/dist/types/core/errors.d.ts +9 -0
- package/dist/types/core/errors.d.ts.map +1 -1
- package/dist/types/core/literals.d.ts.map +1 -1
- package/dist/types/core/node.d.ts +1 -1
- package/dist/types/core/node.d.ts.map +1 -1
- package/dist/types/core/string.d.ts.map +1 -1
- package/dist/types/core/tree/index.d.ts +4 -1
- package/dist/types/core/tree/index.d.ts.map +1 -1
- package/dist/types/core/types.d.ts +2 -11
- package/dist/types/core/types.d.ts.map +1 -1
- package/package.json +2 -3
- package/src/core/Serializer.ts +0 -119
- package/src/core/base-primitives.ts +0 -515
- package/src/core/compat.ts +0 -21
- package/src/core/constants.ts +0 -187
- package/src/core/constructors.ts +0 -269
- package/src/core/context/async-parser.ts +0 -586
- package/src/core/context/deserializer.ts +0 -646
- package/src/core/context/parser.ts +0 -333
- package/src/core/context/serializer.ts +0 -1411
- package/src/core/context/sync-parser.ts +0 -833
- package/src/core/cross/index.ts +0 -186
- package/src/core/errors.ts +0 -163
- package/src/core/function-string.ts +0 -32
- package/src/core/keys.ts +0 -17
- package/src/core/literals.ts +0 -43
- package/src/core/node.ts +0 -40
- package/src/core/opaque-reference.ts +0 -9
- package/src/core/plugin.ts +0 -100
- package/src/core/reference.ts +0 -66
- package/src/core/special-reference.ts +0 -42
- package/src/core/stream.ts +0 -71
- package/src/core/string.ts +0 -84
- package/src/core/symbols.ts +0 -18
- package/src/core/tree/index.ts +0 -125
- package/src/core/types.ts +0 -375
- package/src/core/utils/error.ts +0 -73
- package/src/core/utils/get-identifier.ts +0 -18
- package/src/core/utils/get-object-flag.ts +0 -14
- package/src/core/utils/is-valid-identifier.ts +0 -12
- package/src/core/utils/iterator-to-sequence.ts +0 -44
- package/src/core/utils/promise-to-result.ts +0 -9
- package/src/core/utils/typed-array.ts +0 -56
- package/src/index.ts +0 -36
|
@@ -1,646 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
CONSTANT_VAL,
|
|
3
|
-
ERROR_CONSTRUCTOR,
|
|
4
|
-
SerovalNodeType,
|
|
5
|
-
SerovalObjectFlags,
|
|
6
|
-
SYMBOL_REF,
|
|
7
|
-
} from '../constants';
|
|
8
|
-
import {
|
|
9
|
-
ARRAY_BUFFER_CONSTRUCTOR,
|
|
10
|
-
PROMISE_CONSTRUCTOR,
|
|
11
|
-
type PromiseConstructorResolver,
|
|
12
|
-
} from '../constructors';
|
|
13
|
-
import {
|
|
14
|
-
SerovalDeserializationError,
|
|
15
|
-
SerovalMissingInstanceError,
|
|
16
|
-
SerovalMissingPluginError,
|
|
17
|
-
SerovalUnsupportedNodeError,
|
|
18
|
-
} from '../errors';
|
|
19
|
-
import type { PluginAccessOptions } from '../plugin';
|
|
20
|
-
import { SerovalMode } from '../plugin';
|
|
21
|
-
import { getReference } from '../reference';
|
|
22
|
-
import type { Stream } from '../stream';
|
|
23
|
-
import { createStream, streamToAsyncIterable } from '../stream';
|
|
24
|
-
import { deserializeString } from '../string';
|
|
25
|
-
import type {
|
|
26
|
-
SerovalAggregateErrorNode,
|
|
27
|
-
SerovalArrayBufferNode,
|
|
28
|
-
SerovalArrayNode,
|
|
29
|
-
SerovalAsyncIteratorFactoryInstanceNode,
|
|
30
|
-
SerovalAsyncIteratorFactoryNode,
|
|
31
|
-
SerovalBigIntTypedArrayNode,
|
|
32
|
-
SerovalBoxedNode,
|
|
33
|
-
SerovalDataViewNode,
|
|
34
|
-
SerovalDateNode,
|
|
35
|
-
SerovalErrorNode,
|
|
36
|
-
SerovalIteratorFactoryInstanceNode,
|
|
37
|
-
SerovalIteratorFactoryNode,
|
|
38
|
-
SerovalMapNode,
|
|
39
|
-
SerovalNode,
|
|
40
|
-
SerovalNullConstructorNode,
|
|
41
|
-
SerovalObjectNode,
|
|
42
|
-
SerovalObjectRecordKey,
|
|
43
|
-
SerovalObjectRecordNode,
|
|
44
|
-
SerovalPluginNode,
|
|
45
|
-
SerovalPromiseConstructorNode,
|
|
46
|
-
SerovalPromiseNode,
|
|
47
|
-
SerovalPromiseRejectNode,
|
|
48
|
-
SerovalPromiseResolveNode,
|
|
49
|
-
SerovalReferenceNode,
|
|
50
|
-
SerovalRegExpNode,
|
|
51
|
-
SerovalSetNode,
|
|
52
|
-
SerovalStreamConstructorNode,
|
|
53
|
-
SerovalStreamNextNode,
|
|
54
|
-
SerovalStreamReturnNode,
|
|
55
|
-
SerovalStreamThrowNode,
|
|
56
|
-
SerovalTypedArrayNode,
|
|
57
|
-
} from '../types';
|
|
58
|
-
import type { Sequence } from '../utils/iterator-to-sequence';
|
|
59
|
-
import { sequenceToIterator } from '../utils/iterator-to-sequence';
|
|
60
|
-
import type {
|
|
61
|
-
BigIntTypedArrayValue,
|
|
62
|
-
TypedArrayValue,
|
|
63
|
-
} from '../utils/typed-array';
|
|
64
|
-
import { getTypedArrayConstructor } from '../utils/typed-array';
|
|
65
|
-
|
|
66
|
-
function applyObjectFlag(obj: unknown, flag: SerovalObjectFlags): unknown {
|
|
67
|
-
switch (flag) {
|
|
68
|
-
case SerovalObjectFlags.Frozen:
|
|
69
|
-
return Object.freeze(obj);
|
|
70
|
-
case SerovalObjectFlags.NonExtensible:
|
|
71
|
-
return Object.preventExtensions(obj);
|
|
72
|
-
case SerovalObjectFlags.Sealed:
|
|
73
|
-
return Object.seal(obj);
|
|
74
|
-
default:
|
|
75
|
-
return obj;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
type AssignableValue = AggregateError | Error | Iterable<unknown>;
|
|
80
|
-
type AssignableNode = SerovalAggregateErrorNode | SerovalErrorNode;
|
|
81
|
-
|
|
82
|
-
export interface BaseDeserializerContextOptions extends PluginAccessOptions {
|
|
83
|
-
refs?: Map<number, unknown>;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
export interface BaseDeserializerContext extends PluginAccessOptions {
|
|
87
|
-
readonly mode: SerovalMode;
|
|
88
|
-
/**
|
|
89
|
-
* Mapping ids to values
|
|
90
|
-
*/
|
|
91
|
-
refs: Map<number, unknown>;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
export function createBaseDeserializerContext(
|
|
95
|
-
mode: SerovalMode,
|
|
96
|
-
options: BaseDeserializerContextOptions,
|
|
97
|
-
): BaseDeserializerContext {
|
|
98
|
-
return {
|
|
99
|
-
mode,
|
|
100
|
-
plugins: options.plugins,
|
|
101
|
-
refs: options.refs || new Map(),
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
export interface VanillaDeserializerContextOptions
|
|
106
|
-
extends Omit<BaseDeserializerContextOptions, 'refs'> {
|
|
107
|
-
markedRefs: number[] | Set<number>;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
export interface VanillaDeserializerState {
|
|
111
|
-
marked: Set<number>;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
export interface VanillaDeserializerContext {
|
|
115
|
-
mode: SerovalMode.Vanilla;
|
|
116
|
-
base: BaseDeserializerContext;
|
|
117
|
-
child: DeserializePluginContext | undefined;
|
|
118
|
-
state: VanillaDeserializerState;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
export function createVanillaDeserializerContext(
|
|
122
|
-
options: VanillaDeserializerContextOptions,
|
|
123
|
-
): VanillaDeserializerContext {
|
|
124
|
-
return {
|
|
125
|
-
mode: SerovalMode.Vanilla,
|
|
126
|
-
base: createBaseDeserializerContext(SerovalMode.Vanilla, options),
|
|
127
|
-
child: undefined,
|
|
128
|
-
state: {
|
|
129
|
-
marked: new Set(options.markedRefs),
|
|
130
|
-
},
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
export interface CrossDeserializerContext {
|
|
135
|
-
mode: SerovalMode.Cross;
|
|
136
|
-
base: BaseDeserializerContext;
|
|
137
|
-
child: DeserializePluginContext | undefined;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
export type CrossDeserializerContextOptions = BaseDeserializerContextOptions;
|
|
141
|
-
|
|
142
|
-
export function createCrossDeserializerContext(
|
|
143
|
-
options: CrossDeserializerContextOptions,
|
|
144
|
-
): CrossDeserializerContext {
|
|
145
|
-
return {
|
|
146
|
-
mode: SerovalMode.Cross,
|
|
147
|
-
base: createBaseDeserializerContext(SerovalMode.Cross, options),
|
|
148
|
-
child: undefined,
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
type DeserializerContext =
|
|
153
|
-
| VanillaDeserializerContext
|
|
154
|
-
| CrossDeserializerContext;
|
|
155
|
-
|
|
156
|
-
export class DeserializePluginContext {
|
|
157
|
-
constructor(private _p: DeserializerContext) {}
|
|
158
|
-
|
|
159
|
-
deserialize<T>(node: SerovalNode): T {
|
|
160
|
-
return deserialize(this._p, node) as T;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
function assignIndexedValueVanilla<T>(
|
|
165
|
-
ctx: VanillaDeserializerContext,
|
|
166
|
-
id: number,
|
|
167
|
-
value: T,
|
|
168
|
-
): T {
|
|
169
|
-
if (ctx.state.marked.has(id)) {
|
|
170
|
-
ctx.base.refs.set(id, value);
|
|
171
|
-
}
|
|
172
|
-
return value;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
function assignIndexedValueCross<T>(
|
|
176
|
-
ctx: CrossDeserializerContext,
|
|
177
|
-
id: number,
|
|
178
|
-
value: T,
|
|
179
|
-
): T {
|
|
180
|
-
if (!ctx.base.refs.has(id)) {
|
|
181
|
-
ctx.base.refs.set(id, value);
|
|
182
|
-
}
|
|
183
|
-
return value;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
function assignIndexedValue<T>(
|
|
187
|
-
ctx: DeserializerContext,
|
|
188
|
-
id: number,
|
|
189
|
-
value: T,
|
|
190
|
-
): T {
|
|
191
|
-
return ctx.mode === SerovalMode.Vanilla
|
|
192
|
-
? assignIndexedValueVanilla(ctx, id, value)
|
|
193
|
-
: assignIndexedValueCross(ctx, id, value);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
function deserializeReference(
|
|
197
|
-
ctx: DeserializerContext,
|
|
198
|
-
node: SerovalReferenceNode,
|
|
199
|
-
): unknown {
|
|
200
|
-
return assignIndexedValue(
|
|
201
|
-
ctx,
|
|
202
|
-
node.i,
|
|
203
|
-
getReference(deserializeString(node.s)),
|
|
204
|
-
);
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
function deserializeArray(
|
|
208
|
-
ctx: DeserializerContext,
|
|
209
|
-
node: SerovalArrayNode,
|
|
210
|
-
): unknown[] {
|
|
211
|
-
const len = node.l;
|
|
212
|
-
const result: unknown[] = assignIndexedValue(
|
|
213
|
-
ctx,
|
|
214
|
-
node.i,
|
|
215
|
-
new Array<unknown>(len),
|
|
216
|
-
);
|
|
217
|
-
let item: SerovalNode | undefined;
|
|
218
|
-
for (let i = 0; i < len; i++) {
|
|
219
|
-
item = node.a[i];
|
|
220
|
-
if (item) {
|
|
221
|
-
result[i] = deserialize(ctx, item);
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
applyObjectFlag(result, node.o);
|
|
225
|
-
return result;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
function deserializeProperties(
|
|
229
|
-
ctx: DeserializerContext,
|
|
230
|
-
node: SerovalObjectRecordNode,
|
|
231
|
-
result: Record<string | symbol, unknown>,
|
|
232
|
-
): Record<string | symbol, unknown> {
|
|
233
|
-
const len = node.s;
|
|
234
|
-
if (len) {
|
|
235
|
-
const keys = node.k;
|
|
236
|
-
const vals = node.v;
|
|
237
|
-
for (let i = 0, key: SerovalObjectRecordKey; i < len; i++) {
|
|
238
|
-
key = keys[i];
|
|
239
|
-
if (typeof key === 'string') {
|
|
240
|
-
result[deserializeString(key)] = deserialize(ctx, vals[i]);
|
|
241
|
-
} else {
|
|
242
|
-
result[deserialize(ctx, key) as symbol] = deserialize(ctx, vals[i]);
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
return result;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
function deserializeObject(
|
|
250
|
-
ctx: DeserializerContext,
|
|
251
|
-
node: SerovalObjectNode | SerovalNullConstructorNode,
|
|
252
|
-
): Record<string, unknown> {
|
|
253
|
-
const result = assignIndexedValue(
|
|
254
|
-
ctx,
|
|
255
|
-
node.i,
|
|
256
|
-
(node.t === SerovalNodeType.Object ? {} : Object.create(null)) as Record<
|
|
257
|
-
string,
|
|
258
|
-
unknown
|
|
259
|
-
>,
|
|
260
|
-
);
|
|
261
|
-
deserializeProperties(ctx, node.p, result);
|
|
262
|
-
applyObjectFlag(result, node.o);
|
|
263
|
-
return result;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
function deserializeDate(
|
|
267
|
-
ctx: DeserializerContext,
|
|
268
|
-
node: SerovalDateNode,
|
|
269
|
-
): Date {
|
|
270
|
-
return assignIndexedValue(ctx, node.i, new Date(node.s));
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
function deserializeRegExp(
|
|
274
|
-
ctx: DeserializerContext,
|
|
275
|
-
node: SerovalRegExpNode,
|
|
276
|
-
): RegExp {
|
|
277
|
-
return assignIndexedValue(
|
|
278
|
-
ctx,
|
|
279
|
-
node.i,
|
|
280
|
-
new RegExp(deserializeString(node.c), node.m),
|
|
281
|
-
);
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
function deserializeSet(
|
|
285
|
-
ctx: DeserializerContext,
|
|
286
|
-
node: SerovalSetNode,
|
|
287
|
-
): Set<unknown> {
|
|
288
|
-
const result = assignIndexedValue(ctx, node.i, new Set<unknown>());
|
|
289
|
-
const items = node.a;
|
|
290
|
-
for (let i = 0, len = node.l; i < len; i++) {
|
|
291
|
-
result.add(deserialize(ctx, items[i]));
|
|
292
|
-
}
|
|
293
|
-
return result;
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
function deserializeMap(
|
|
297
|
-
ctx: DeserializerContext,
|
|
298
|
-
node: SerovalMapNode,
|
|
299
|
-
): Map<unknown, unknown> {
|
|
300
|
-
const result = assignIndexedValue(ctx, node.i, new Map<unknown, unknown>());
|
|
301
|
-
const keys = node.e.k;
|
|
302
|
-
const vals = node.e.v;
|
|
303
|
-
for (let i = 0, len = node.e.s; i < len; i++) {
|
|
304
|
-
result.set(deserialize(ctx, keys[i]), deserialize(ctx, vals[i]));
|
|
305
|
-
}
|
|
306
|
-
return result;
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
function deserializeArrayBuffer(
|
|
310
|
-
ctx: DeserializerContext,
|
|
311
|
-
node: SerovalArrayBufferNode,
|
|
312
|
-
): ArrayBuffer {
|
|
313
|
-
const result = assignIndexedValue(
|
|
314
|
-
ctx,
|
|
315
|
-
node.i,
|
|
316
|
-
ARRAY_BUFFER_CONSTRUCTOR(node.l, deserializeString(node.s)),
|
|
317
|
-
);
|
|
318
|
-
return result;
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
function deserializeTypedArray(
|
|
322
|
-
ctx: DeserializerContext,
|
|
323
|
-
node: SerovalTypedArrayNode | SerovalBigIntTypedArrayNode,
|
|
324
|
-
): TypedArrayValue | BigIntTypedArrayValue {
|
|
325
|
-
const construct = getTypedArrayConstructor(node.c) as Int8ArrayConstructor;
|
|
326
|
-
const source = deserialize(ctx, node.f) as ArrayBuffer;
|
|
327
|
-
const result = assignIndexedValue(
|
|
328
|
-
ctx,
|
|
329
|
-
node.i,
|
|
330
|
-
new construct(source, node.b, node.l),
|
|
331
|
-
);
|
|
332
|
-
return result;
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
function deserializeDataView(
|
|
336
|
-
ctx: DeserializerContext,
|
|
337
|
-
node: SerovalDataViewNode,
|
|
338
|
-
): DataView {
|
|
339
|
-
const source = deserialize(ctx, node.f) as ArrayBuffer;
|
|
340
|
-
const result = assignIndexedValue(
|
|
341
|
-
ctx,
|
|
342
|
-
node.i,
|
|
343
|
-
new DataView(source, node.b, node.l),
|
|
344
|
-
);
|
|
345
|
-
return result;
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
function deserializeDictionary<T extends AssignableValue>(
|
|
349
|
-
ctx: DeserializerContext,
|
|
350
|
-
node: AssignableNode,
|
|
351
|
-
result: T,
|
|
352
|
-
): T {
|
|
353
|
-
if (node.p) {
|
|
354
|
-
const fields = deserializeProperties(ctx, node.p, {});
|
|
355
|
-
Object.assign(result, fields);
|
|
356
|
-
}
|
|
357
|
-
return result;
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
function deserializeAggregateError(
|
|
361
|
-
ctx: DeserializerContext,
|
|
362
|
-
node: SerovalAggregateErrorNode,
|
|
363
|
-
): AggregateError {
|
|
364
|
-
// Serialize the required arguments
|
|
365
|
-
const result = assignIndexedValue(
|
|
366
|
-
ctx,
|
|
367
|
-
node.i,
|
|
368
|
-
new AggregateError([], deserializeString(node.m)),
|
|
369
|
-
);
|
|
370
|
-
// `AggregateError` might've been extended
|
|
371
|
-
// either through class or custom properties
|
|
372
|
-
// Make sure to assign extra properties
|
|
373
|
-
return deserializeDictionary(ctx, node, result);
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
function deserializeError(
|
|
377
|
-
ctx: DeserializerContext,
|
|
378
|
-
node: SerovalErrorNode,
|
|
379
|
-
): Error {
|
|
380
|
-
const construct = ERROR_CONSTRUCTOR[node.s];
|
|
381
|
-
const result = assignIndexedValue(
|
|
382
|
-
ctx,
|
|
383
|
-
node.i,
|
|
384
|
-
new construct(deserializeString(node.m)),
|
|
385
|
-
);
|
|
386
|
-
return deserializeDictionary(ctx, node, result);
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
function deserializePromise(
|
|
390
|
-
ctx: DeserializerContext,
|
|
391
|
-
node: SerovalPromiseNode,
|
|
392
|
-
): Promise<unknown> {
|
|
393
|
-
const deferred = PROMISE_CONSTRUCTOR();
|
|
394
|
-
const result = assignIndexedValue(ctx, node.i, deferred.p);
|
|
395
|
-
const deserialized = deserialize(ctx, node.f);
|
|
396
|
-
if (node.s) {
|
|
397
|
-
deferred.s(deserialized);
|
|
398
|
-
} else {
|
|
399
|
-
deferred.f(deserialized);
|
|
400
|
-
}
|
|
401
|
-
return result;
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
function deserializeBoxed(
|
|
405
|
-
ctx: DeserializerContext,
|
|
406
|
-
node: SerovalBoxedNode,
|
|
407
|
-
): unknown {
|
|
408
|
-
// biome-ignore lint/style/useConsistentBuiltinInstantiation: intended
|
|
409
|
-
return assignIndexedValue(ctx, node.i, Object(deserialize(ctx, node.f)));
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
function deserializePlugin(
|
|
413
|
-
ctx: DeserializerContext,
|
|
414
|
-
node: SerovalPluginNode,
|
|
415
|
-
): unknown {
|
|
416
|
-
const currentPlugins = ctx.base.plugins;
|
|
417
|
-
if (currentPlugins) {
|
|
418
|
-
const tag = deserializeString(node.c);
|
|
419
|
-
for (let i = 0, len = currentPlugins.length; i < len; i++) {
|
|
420
|
-
const plugin = currentPlugins[i];
|
|
421
|
-
if (plugin.tag === tag) {
|
|
422
|
-
if (ctx.child == null) {
|
|
423
|
-
ctx.child = new DeserializePluginContext(ctx);
|
|
424
|
-
}
|
|
425
|
-
return assignIndexedValue(
|
|
426
|
-
ctx,
|
|
427
|
-
node.i,
|
|
428
|
-
plugin.deserialize(node.s, ctx.child, {
|
|
429
|
-
id: node.i,
|
|
430
|
-
}),
|
|
431
|
-
);
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
throw new SerovalMissingPluginError(node.c);
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
function deserializePromiseConstructor(
|
|
439
|
-
ctx: DeserializerContext,
|
|
440
|
-
node: SerovalPromiseConstructorNode,
|
|
441
|
-
): unknown {
|
|
442
|
-
return assignIndexedValue(
|
|
443
|
-
ctx,
|
|
444
|
-
node.i,
|
|
445
|
-
assignIndexedValue(ctx, node.s, PROMISE_CONSTRUCTOR()).p,
|
|
446
|
-
);
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
function deserializePromiseResolve(
|
|
450
|
-
ctx: DeserializerContext,
|
|
451
|
-
node: SerovalPromiseResolveNode,
|
|
452
|
-
): unknown {
|
|
453
|
-
const deferred = ctx.base.refs.get(node.i) as
|
|
454
|
-
| PromiseConstructorResolver
|
|
455
|
-
| undefined;
|
|
456
|
-
if (deferred) {
|
|
457
|
-
deferred.s(deserialize(ctx, node.a[1]));
|
|
458
|
-
return undefined;
|
|
459
|
-
}
|
|
460
|
-
throw new SerovalMissingInstanceError('Promise');
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
function deserializePromiseReject(
|
|
464
|
-
ctx: DeserializerContext,
|
|
465
|
-
node: SerovalPromiseRejectNode,
|
|
466
|
-
): unknown {
|
|
467
|
-
const deferred = ctx.base.refs.get(node.i) as
|
|
468
|
-
| PromiseConstructorResolver
|
|
469
|
-
| undefined;
|
|
470
|
-
if (deferred) {
|
|
471
|
-
deferred.f(deserialize(ctx, node.a[1]));
|
|
472
|
-
return undefined;
|
|
473
|
-
}
|
|
474
|
-
throw new SerovalMissingInstanceError('Promise');
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
function deserializeIteratorFactoryInstance(
|
|
478
|
-
ctx: DeserializerContext,
|
|
479
|
-
node: SerovalIteratorFactoryInstanceNode,
|
|
480
|
-
): unknown {
|
|
481
|
-
deserialize(ctx, node.a[0]);
|
|
482
|
-
const source = deserialize(ctx, node.a[1]);
|
|
483
|
-
return sequenceToIterator(source as Sequence);
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
function deserializeAsyncIteratorFactoryInstance(
|
|
487
|
-
ctx: DeserializerContext,
|
|
488
|
-
node: SerovalAsyncIteratorFactoryInstanceNode,
|
|
489
|
-
): unknown {
|
|
490
|
-
deserialize(ctx, node.a[0]);
|
|
491
|
-
const source = deserialize(ctx, node.a[1]);
|
|
492
|
-
return streamToAsyncIterable(source as Stream<any>);
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
function deserializeStreamConstructor(
|
|
496
|
-
ctx: DeserializerContext,
|
|
497
|
-
node: SerovalStreamConstructorNode,
|
|
498
|
-
): unknown {
|
|
499
|
-
const result = assignIndexedValue(ctx, node.i, createStream());
|
|
500
|
-
const len = node.a.length;
|
|
501
|
-
if (len) {
|
|
502
|
-
for (let i = 0; i < len; i++) {
|
|
503
|
-
deserialize(ctx, node.a[i]);
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
return result;
|
|
507
|
-
}
|
|
508
|
-
|
|
509
|
-
function deserializeStreamNext(
|
|
510
|
-
ctx: DeserializerContext,
|
|
511
|
-
node: SerovalStreamNextNode,
|
|
512
|
-
): unknown {
|
|
513
|
-
const deferred = ctx.base.refs.get(node.i) as Stream<unknown> | undefined;
|
|
514
|
-
if (deferred) {
|
|
515
|
-
deferred.next(deserialize(ctx, node.f));
|
|
516
|
-
return undefined;
|
|
517
|
-
}
|
|
518
|
-
throw new SerovalMissingInstanceError('Stream');
|
|
519
|
-
}
|
|
520
|
-
|
|
521
|
-
function deserializeStreamThrow(
|
|
522
|
-
ctx: DeserializerContext,
|
|
523
|
-
node: SerovalStreamThrowNode,
|
|
524
|
-
): unknown {
|
|
525
|
-
const deferred = ctx.base.refs.get(node.i) as Stream<unknown> | undefined;
|
|
526
|
-
if (deferred) {
|
|
527
|
-
deferred.throw(deserialize(ctx, node.f));
|
|
528
|
-
return undefined;
|
|
529
|
-
}
|
|
530
|
-
throw new SerovalMissingInstanceError('Stream');
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
function deserializeStreamReturn(
|
|
534
|
-
ctx: DeserializerContext,
|
|
535
|
-
node: SerovalStreamReturnNode,
|
|
536
|
-
): unknown {
|
|
537
|
-
const deferred = ctx.base.refs.get(node.i) as Stream<unknown> | undefined;
|
|
538
|
-
if (deferred) {
|
|
539
|
-
deferred.return(deserialize(ctx, node.f));
|
|
540
|
-
return undefined;
|
|
541
|
-
}
|
|
542
|
-
throw new SerovalMissingInstanceError('Stream');
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
function deserializeIteratorFactory(
|
|
546
|
-
ctx: DeserializerContext,
|
|
547
|
-
node: SerovalIteratorFactoryNode,
|
|
548
|
-
): unknown {
|
|
549
|
-
deserialize(ctx, node.f);
|
|
550
|
-
return undefined;
|
|
551
|
-
}
|
|
552
|
-
|
|
553
|
-
function deserializeAsyncIteratorFactory(
|
|
554
|
-
ctx: DeserializerContext,
|
|
555
|
-
node: SerovalAsyncIteratorFactoryNode,
|
|
556
|
-
): unknown {
|
|
557
|
-
deserialize(ctx, node.a[1]);
|
|
558
|
-
return undefined;
|
|
559
|
-
}
|
|
560
|
-
export function deserialize(
|
|
561
|
-
ctx: DeserializerContext,
|
|
562
|
-
node: SerovalNode,
|
|
563
|
-
): unknown {
|
|
564
|
-
switch (node.t) {
|
|
565
|
-
case SerovalNodeType.Constant:
|
|
566
|
-
return CONSTANT_VAL[node.s];
|
|
567
|
-
case SerovalNodeType.Number:
|
|
568
|
-
return node.s;
|
|
569
|
-
case SerovalNodeType.String:
|
|
570
|
-
return deserializeString(node.s);
|
|
571
|
-
case SerovalNodeType.BigInt:
|
|
572
|
-
return BigInt(node.s);
|
|
573
|
-
case SerovalNodeType.IndexedValue:
|
|
574
|
-
return ctx.base.refs.get(node.i);
|
|
575
|
-
case SerovalNodeType.Reference:
|
|
576
|
-
return deserializeReference(ctx, node);
|
|
577
|
-
case SerovalNodeType.Array:
|
|
578
|
-
return deserializeArray(ctx, node);
|
|
579
|
-
case SerovalNodeType.Object:
|
|
580
|
-
case SerovalNodeType.NullConstructor:
|
|
581
|
-
return deserializeObject(ctx, node);
|
|
582
|
-
case SerovalNodeType.Date:
|
|
583
|
-
return deserializeDate(ctx, node);
|
|
584
|
-
case SerovalNodeType.RegExp:
|
|
585
|
-
return deserializeRegExp(ctx, node);
|
|
586
|
-
case SerovalNodeType.Set:
|
|
587
|
-
return deserializeSet(ctx, node);
|
|
588
|
-
case SerovalNodeType.Map:
|
|
589
|
-
return deserializeMap(ctx, node);
|
|
590
|
-
case SerovalNodeType.ArrayBuffer:
|
|
591
|
-
return deserializeArrayBuffer(ctx, node);
|
|
592
|
-
case SerovalNodeType.BigIntTypedArray:
|
|
593
|
-
case SerovalNodeType.TypedArray:
|
|
594
|
-
return deserializeTypedArray(ctx, node);
|
|
595
|
-
case SerovalNodeType.DataView:
|
|
596
|
-
return deserializeDataView(ctx, node);
|
|
597
|
-
case SerovalNodeType.AggregateError:
|
|
598
|
-
return deserializeAggregateError(ctx, node);
|
|
599
|
-
case SerovalNodeType.Error:
|
|
600
|
-
return deserializeError(ctx, node);
|
|
601
|
-
case SerovalNodeType.Promise:
|
|
602
|
-
return deserializePromise(ctx, node);
|
|
603
|
-
case SerovalNodeType.WKSymbol:
|
|
604
|
-
return SYMBOL_REF[node.s];
|
|
605
|
-
case SerovalNodeType.Boxed:
|
|
606
|
-
return deserializeBoxed(ctx, node);
|
|
607
|
-
case SerovalNodeType.Plugin:
|
|
608
|
-
return deserializePlugin(ctx, node);
|
|
609
|
-
case SerovalNodeType.PromiseConstructor:
|
|
610
|
-
return deserializePromiseConstructor(ctx, node);
|
|
611
|
-
case SerovalNodeType.PromiseSuccess:
|
|
612
|
-
return deserializePromiseResolve(ctx, node);
|
|
613
|
-
case SerovalNodeType.PromiseFailure:
|
|
614
|
-
return deserializePromiseReject(ctx, node);
|
|
615
|
-
case SerovalNodeType.IteratorFactoryInstance:
|
|
616
|
-
return deserializeIteratorFactoryInstance(ctx, node);
|
|
617
|
-
case SerovalNodeType.AsyncIteratorFactoryInstance:
|
|
618
|
-
return deserializeAsyncIteratorFactoryInstance(ctx, node);
|
|
619
|
-
case SerovalNodeType.StreamConstructor:
|
|
620
|
-
return deserializeStreamConstructor(ctx, node);
|
|
621
|
-
case SerovalNodeType.StreamNext:
|
|
622
|
-
return deserializeStreamNext(ctx, node);
|
|
623
|
-
case SerovalNodeType.StreamThrow:
|
|
624
|
-
return deserializeStreamThrow(ctx, node);
|
|
625
|
-
case SerovalNodeType.StreamReturn:
|
|
626
|
-
return deserializeStreamReturn(ctx, node);
|
|
627
|
-
case SerovalNodeType.IteratorFactory:
|
|
628
|
-
return deserializeIteratorFactory(ctx, node);
|
|
629
|
-
case SerovalNodeType.AsyncIteratorFactory:
|
|
630
|
-
return deserializeAsyncIteratorFactory(ctx, node);
|
|
631
|
-
// case SerovalNodeType.SpecialReference:
|
|
632
|
-
default:
|
|
633
|
-
throw new SerovalUnsupportedNodeError(node);
|
|
634
|
-
}
|
|
635
|
-
}
|
|
636
|
-
|
|
637
|
-
export function deserializeTop(
|
|
638
|
-
ctx: DeserializerContext,
|
|
639
|
-
node: SerovalNode,
|
|
640
|
-
): unknown {
|
|
641
|
-
try {
|
|
642
|
-
return deserialize(ctx, node);
|
|
643
|
-
} catch (error) {
|
|
644
|
-
throw new SerovalDeserializationError(error);
|
|
645
|
-
}
|
|
646
|
-
}
|