seroval 1.3.1 → 1.4.0
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 +2637 -2682
- package/dist/cjs/development/index.cjs.map +4 -4
- package/dist/cjs/production/index.cjs +3 -17
- package/dist/esm/development/index.mjs +2637 -2682
- package/dist/esm/development/index.mjs.map +4 -4
- package/dist/esm/production/index.mjs +3 -17
- package/dist/types/core/base-primitives.d.ts +1 -2
- package/dist/types/core/base-primitives.d.ts.map +1 -1
- package/dist/types/core/compat.d.ts +1 -1
- package/dist/types/core/compat.d.ts.map +1 -1
- package/dist/types/core/constants.d.ts +1 -0
- package/dist/types/core/constants.d.ts.map +1 -1
- package/dist/types/core/constructors.d.ts +54 -0
- package/dist/types/core/constructors.d.ts.map +1 -0
- package/dist/types/core/context/async-parser.d.ts +19 -0
- package/dist/types/core/context/async-parser.d.ts.map +1 -0
- package/dist/types/core/context/deserializer.d.ts +35 -37
- package/dist/types/core/context/deserializer.d.ts.map +1 -1
- package/dist/types/core/context/parser.d.ts +32 -19
- package/dist/types/core/context/parser.d.ts.map +1 -1
- package/dist/types/core/context/serializer.d.ts +38 -99
- package/dist/types/core/context/serializer.d.ts.map +1 -1
- package/dist/types/core/context/sync-parser.d.ts +59 -0
- package/dist/types/core/context/sync-parser.d.ts.map +1 -0
- package/dist/types/core/cross/index.d.ts +12 -13
- package/dist/types/core/cross/index.d.ts.map +1 -1
- package/dist/types/core/errors.d.ts.map +1 -1
- package/dist/types/core/function-string.d.ts +2 -2
- package/dist/types/core/function-string.d.ts.map +1 -1
- package/dist/types/core/plugin.d.ts +13 -11
- package/dist/types/core/plugin.d.ts.map +1 -1
- package/dist/types/core/reference.d.ts.map +1 -1
- package/dist/types/core/special-reference.d.ts +3 -2
- package/dist/types/core/special-reference.d.ts.map +1 -1
- package/dist/types/core/stream.d.ts +1 -2
- package/dist/types/core/stream.d.ts.map +1 -1
- package/dist/types/core/symbols.d.ts +14 -0
- package/dist/types/core/symbols.d.ts.map +1 -0
- package/dist/types/core/tree/index.d.ts +3 -2
- package/dist/types/core/tree/index.d.ts.map +1 -1
- package/dist/types/core/types.d.ts +3 -1
- package/dist/types/core/types.d.ts.map +1 -1
- package/dist/types/core/utils/iterator-to-sequence.d.ts.map +1 -1
- package/dist/types/index.d.ts +10 -5
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +17 -19
- package/src/core/base-primitives.ts +0 -27
- package/src/core/compat.ts +2 -1
- package/src/core/constants.ts +28 -26
- package/src/core/constructors.ts +269 -0
- package/src/core/context/async-parser.ts +586 -0
- package/src/core/context/deserializer.ts +504 -307
- package/src/core/context/parser.ts +243 -180
- package/src/core/context/serializer.ts +1058 -827
- package/src/core/context/sync-parser.ts +833 -0
- package/src/core/cross/index.ts +63 -47
- package/src/core/errors.ts +73 -12
- package/src/core/function-string.ts +11 -10
- package/src/core/plugin.ts +20 -11
- package/src/core/reference.ts +8 -5
- package/src/core/special-reference.ts +18 -90
- package/src/core/stream.ts +18 -152
- package/src/core/symbols.ts +18 -0
- package/src/core/tree/index.ts +45 -31
- package/src/core/types.ts +7 -2
- package/src/core/utils/iterator-to-sequence.ts +6 -28
- package/src/index.ts +29 -11
- package/dist/types/core/context/parser/async.d.ts +0 -24
- package/dist/types/core/context/parser/async.d.ts.map +0 -1
- package/dist/types/core/context/parser/stream.d.ts +0 -43
- package/dist/types/core/context/parser/stream.d.ts.map +0 -1
- package/dist/types/core/context/parser/sync.d.ts +0 -30
- package/dist/types/core/context/parser/sync.d.ts.map +0 -1
- package/dist/types/core/cross/async.d.ts +0 -8
- package/dist/types/core/cross/async.d.ts.map +0 -1
- package/dist/types/core/cross/deserializer.d.ts +0 -9
- package/dist/types/core/cross/deserializer.d.ts.map +0 -1
- package/dist/types/core/cross/parser.d.ts +0 -6
- package/dist/types/core/cross/parser.d.ts.map +0 -1
- package/dist/types/core/cross/serializer.d.ts +0 -16
- package/dist/types/core/cross/serializer.d.ts.map +0 -1
- package/dist/types/core/cross/stream.d.ts +0 -8
- package/dist/types/core/cross/stream.d.ts.map +0 -1
- package/dist/types/core/cross/sync.d.ts +0 -8
- package/dist/types/core/cross/sync.d.ts.map +0 -1
- package/dist/types/core/tree/async.d.ts +0 -8
- package/dist/types/core/tree/async.d.ts.map +0 -1
- package/dist/types/core/tree/deserializer.d.ts +0 -13
- package/dist/types/core/tree/deserializer.d.ts.map +0 -1
- package/dist/types/core/tree/serializer.d.ts +0 -29
- package/dist/types/core/tree/serializer.d.ts.map +0 -1
- package/dist/types/core/tree/sync.d.ts +0 -8
- package/dist/types/core/tree/sync.d.ts.map +0 -1
- package/dist/types/core/utils/assert.d.ts +0 -2
- package/dist/types/core/utils/assert.d.ts.map +0 -1
- package/dist/types/core/utils/deferred.d.ts +0 -7
- package/dist/types/core/utils/deferred.d.ts.map +0 -1
- package/src/core/context/parser/async.ts +0 -499
- package/src/core/context/parser/stream.ts +0 -323
- package/src/core/context/parser/sync.ts +0 -408
- package/src/core/cross/async.ts +0 -9
- package/src/core/cross/deserializer.ts +0 -16
- package/src/core/cross/parser.ts +0 -7
- package/src/core/cross/serializer.ts +0 -72
- package/src/core/cross/stream.ts +0 -9
- package/src/core/cross/sync.ts +0 -9
- package/src/core/tree/async.ts +0 -9
- package/src/core/tree/deserializer.ts +0 -26
- package/src/core/tree/serializer.ts +0 -98
- package/src/core/tree/sync.ts +0 -9
- package/src/core/utils/assert.ts +0 -5
- package/src/core/utils/deferred.ts +0 -22
|
@@ -1,17 +1,23 @@
|
|
|
1
1
|
import {
|
|
2
2
|
CONSTANT_VAL,
|
|
3
3
|
ERROR_CONSTRUCTOR,
|
|
4
|
-
SYMBOL_REF,
|
|
5
4
|
SerovalNodeType,
|
|
6
5
|
SerovalObjectFlags,
|
|
6
|
+
SYMBOL_REF,
|
|
7
7
|
} from '../constants';
|
|
8
|
+
import {
|
|
9
|
+
ARRAY_BUFFER_CONSTRUCTOR,
|
|
10
|
+
PROMISE_CONSTRUCTOR,
|
|
11
|
+
type PromiseConstructorResolver,
|
|
12
|
+
} from '../constructors';
|
|
8
13
|
import {
|
|
9
14
|
SerovalDeserializationError,
|
|
10
15
|
SerovalMissingInstanceError,
|
|
11
16
|
SerovalMissingPluginError,
|
|
12
17
|
SerovalUnsupportedNodeError,
|
|
13
18
|
} from '../errors';
|
|
14
|
-
import type {
|
|
19
|
+
import type { PluginAccessOptions } from '../plugin';
|
|
20
|
+
import { SerovalMode } from '../plugin';
|
|
15
21
|
import { getReference } from '../reference';
|
|
16
22
|
import type { Stream } from '../stream';
|
|
17
23
|
import { createStream, streamToAsyncIterable } from '../stream';
|
|
@@ -49,9 +55,6 @@ import type {
|
|
|
49
55
|
SerovalStreamThrowNode,
|
|
50
56
|
SerovalTypedArrayNode,
|
|
51
57
|
} from '../types';
|
|
52
|
-
import assert from '../utils/assert';
|
|
53
|
-
import type { Deferred } from '../utils/deferred';
|
|
54
|
-
import { createDeferred } from '../utils/deferred';
|
|
55
58
|
import type { Sequence } from '../utils/iterator-to-sequence';
|
|
56
59
|
import { sequenceToIterator } from '../utils/iterator-to-sequence';
|
|
57
60
|
import type {
|
|
@@ -76,374 +79,568 @@ function applyObjectFlag(obj: unknown, flag: SerovalObjectFlags): unknown {
|
|
|
76
79
|
type AssignableValue = AggregateError | Error | Iterable<unknown>;
|
|
77
80
|
type AssignableNode = SerovalAggregateErrorNode | SerovalErrorNode;
|
|
78
81
|
|
|
79
|
-
export interface
|
|
82
|
+
export interface BaseDeserializerContextOptions extends PluginAccessOptions {
|
|
80
83
|
refs?: Map<number, unknown>;
|
|
81
84
|
}
|
|
82
85
|
|
|
83
|
-
export
|
|
84
|
-
|
|
85
|
-
{
|
|
86
|
-
abstract readonly mode: SerovalMode;
|
|
87
|
-
|
|
86
|
+
export interface BaseDeserializerContext extends PluginAccessOptions {
|
|
87
|
+
readonly mode: SerovalMode;
|
|
88
88
|
/**
|
|
89
89
|
* Mapping ids to values
|
|
90
|
-
* @private
|
|
91
90
|
*/
|
|
92
91
|
refs: Map<number, unknown>;
|
|
92
|
+
}
|
|
93
93
|
|
|
94
|
-
|
|
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
|
+
}
|
|
95
104
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
105
|
+
export interface VanillaDeserializerContextOptions
|
|
106
|
+
extends Omit<BaseDeserializerContextOptions, 'refs'> {
|
|
107
|
+
markedRefs: number[] | Set<number>;
|
|
108
|
+
}
|
|
100
109
|
|
|
101
|
-
|
|
110
|
+
export interface VanillaDeserializerState {
|
|
111
|
+
marked: Set<number>;
|
|
112
|
+
}
|
|
102
113
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
114
|
+
export interface VanillaDeserializerContext {
|
|
115
|
+
mode: SerovalMode.Vanilla;
|
|
116
|
+
base: BaseDeserializerContext;
|
|
117
|
+
child: DeserializePluginContext | undefined;
|
|
118
|
+
state: VanillaDeserializerState;
|
|
119
|
+
}
|
|
109
120
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
)
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
}
|
|
123
|
-
applyObjectFlag(result, node.o);
|
|
124
|
-
return result;
|
|
125
|
-
}
|
|
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
|
+
}
|
|
126
133
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
if (len) {
|
|
133
|
-
const keys = node.k;
|
|
134
|
-
const vals = node.v;
|
|
135
|
-
for (let i = 0, key: SerovalObjectRecordKey; i < len; i++) {
|
|
136
|
-
key = keys[i];
|
|
137
|
-
if (typeof key === 'string') {
|
|
138
|
-
result[deserializeString(key)] = this.deserialize(vals[i]);
|
|
139
|
-
} else {
|
|
140
|
-
result[this.deserialize(key) as symbol] = this.deserialize(vals[i]);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
return result;
|
|
145
|
-
}
|
|
134
|
+
export interface CrossDeserializerContext {
|
|
135
|
+
mode: SerovalMode.Cross;
|
|
136
|
+
base: BaseDeserializerContext;
|
|
137
|
+
child: DeserializePluginContext | undefined;
|
|
138
|
+
}
|
|
146
139
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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;
|
|
160
161
|
}
|
|
162
|
+
}
|
|
161
163
|
|
|
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);
|
|
164
171
|
}
|
|
172
|
+
return value;
|
|
173
|
+
}
|
|
165
174
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
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);
|
|
171
182
|
}
|
|
183
|
+
return value;
|
|
184
|
+
}
|
|
172
185
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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);
|
|
178
222
|
}
|
|
179
|
-
return result;
|
|
180
223
|
}
|
|
224
|
+
applyObjectFlag(result, node.o);
|
|
225
|
+
return result;
|
|
226
|
+
}
|
|
181
227
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
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
|
+
}
|
|
188
244
|
}
|
|
189
|
-
return result;
|
|
190
245
|
}
|
|
246
|
+
return result;
|
|
247
|
+
}
|
|
191
248
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
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
|
+
}
|
|
197
265
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
node.i,
|
|
205
|
-
new construct(source, node.b, node.l),
|
|
206
|
-
);
|
|
207
|
-
return result;
|
|
208
|
-
}
|
|
266
|
+
function deserializeDate(
|
|
267
|
+
ctx: DeserializerContext,
|
|
268
|
+
node: SerovalDateNode,
|
|
269
|
+
): Date {
|
|
270
|
+
return assignIndexedValue(ctx, node.i, new Date(node.s));
|
|
271
|
+
}
|
|
209
272
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
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
|
+
}
|
|
218
283
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
return result;
|
|
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]));
|
|
228
292
|
}
|
|
293
|
+
return result;
|
|
294
|
+
}
|
|
229
295
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
// either through class or custom properties
|
|
240
|
-
// Make sure to assign extra properties
|
|
241
|
-
return this.deserializeDictionary(node, result);
|
|
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]));
|
|
242
305
|
}
|
|
306
|
+
return result;
|
|
307
|
+
}
|
|
243
308
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
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
|
+
}
|
|
252
320
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
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);
|
|
263
356
|
}
|
|
357
|
+
return result;
|
|
358
|
+
}
|
|
264
359
|
|
|
265
|
-
|
|
266
|
-
|
|
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);
|
|
267
400
|
}
|
|
401
|
+
return result;
|
|
402
|
+
}
|
|
268
403
|
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
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);
|
|
282
424
|
}
|
|
425
|
+
return assignIndexedValue(
|
|
426
|
+
ctx,
|
|
427
|
+
node.i,
|
|
428
|
+
plugin.deserialize(node.s, ctx.child, {
|
|
429
|
+
id: node.i,
|
|
430
|
+
}),
|
|
431
|
+
);
|
|
283
432
|
}
|
|
284
433
|
}
|
|
285
|
-
throw new SerovalMissingPluginError(node.c);
|
|
286
434
|
}
|
|
435
|
+
throw new SerovalMissingPluginError(node.c);
|
|
436
|
+
}
|
|
287
437
|
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
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
|
+
}
|
|
293
448
|
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
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]));
|
|
298
458
|
return undefined;
|
|
299
459
|
}
|
|
460
|
+
throw new SerovalMissingInstanceError('Promise');
|
|
461
|
+
}
|
|
300
462
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
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]));
|
|
305
472
|
return undefined;
|
|
306
473
|
}
|
|
474
|
+
throw new SerovalMissingInstanceError('Promise');
|
|
475
|
+
}
|
|
307
476
|
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
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
|
+
}
|
|
315
485
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
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
|
+
}
|
|
323
494
|
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
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]);
|
|
333
504
|
}
|
|
334
|
-
return result;
|
|
335
505
|
}
|
|
506
|
+
return result;
|
|
507
|
+
}
|
|
336
508
|
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
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));
|
|
341
516
|
return undefined;
|
|
342
517
|
}
|
|
518
|
+
throw new SerovalMissingInstanceError('Stream');
|
|
519
|
+
}
|
|
343
520
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
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));
|
|
348
528
|
return undefined;
|
|
349
529
|
}
|
|
530
|
+
throw new SerovalMissingInstanceError('Stream');
|
|
531
|
+
}
|
|
350
532
|
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
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));
|
|
355
540
|
return undefined;
|
|
356
541
|
}
|
|
542
|
+
throw new SerovalMissingInstanceError('Stream');
|
|
543
|
+
}
|
|
357
544
|
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
545
|
+
function deserializeIteratorFactory(
|
|
546
|
+
ctx: DeserializerContext,
|
|
547
|
+
node: SerovalIteratorFactoryNode,
|
|
548
|
+
): unknown {
|
|
549
|
+
deserialize(ctx, node.f);
|
|
550
|
+
return undefined;
|
|
551
|
+
}
|
|
364
552
|
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
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);
|
|
370
634
|
}
|
|
635
|
+
}
|
|
371
636
|
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
return deserializeString(node.s);
|
|
381
|
-
case SerovalNodeType.BigInt:
|
|
382
|
-
return BigInt(node.s);
|
|
383
|
-
case SerovalNodeType.IndexedValue:
|
|
384
|
-
return this.refs.get(node.i);
|
|
385
|
-
case SerovalNodeType.Reference:
|
|
386
|
-
return this.deserializeReference(node);
|
|
387
|
-
case SerovalNodeType.Array:
|
|
388
|
-
return this.deserializeArray(node);
|
|
389
|
-
case SerovalNodeType.Object:
|
|
390
|
-
case SerovalNodeType.NullConstructor:
|
|
391
|
-
return this.deserializeObject(node);
|
|
392
|
-
case SerovalNodeType.Date:
|
|
393
|
-
return this.deserializeDate(node);
|
|
394
|
-
case SerovalNodeType.RegExp:
|
|
395
|
-
return this.deserializeRegExp(node);
|
|
396
|
-
case SerovalNodeType.Set:
|
|
397
|
-
return this.deserializeSet(node);
|
|
398
|
-
case SerovalNodeType.Map:
|
|
399
|
-
return this.deserializeMap(node);
|
|
400
|
-
case SerovalNodeType.ArrayBuffer:
|
|
401
|
-
return this.deserializeArrayBuffer(node);
|
|
402
|
-
case SerovalNodeType.BigIntTypedArray:
|
|
403
|
-
case SerovalNodeType.TypedArray:
|
|
404
|
-
return this.deserializeTypedArray(node);
|
|
405
|
-
case SerovalNodeType.DataView:
|
|
406
|
-
return this.deserializeDataView(node);
|
|
407
|
-
case SerovalNodeType.AggregateError:
|
|
408
|
-
return this.deserializeAggregateError(node);
|
|
409
|
-
case SerovalNodeType.Error:
|
|
410
|
-
return this.deserializeError(node);
|
|
411
|
-
case SerovalNodeType.Promise:
|
|
412
|
-
return this.deserializePromise(node);
|
|
413
|
-
case SerovalNodeType.WKSymbol:
|
|
414
|
-
return SYMBOL_REF[node.s];
|
|
415
|
-
case SerovalNodeType.Boxed:
|
|
416
|
-
return this.deserializeBoxed(node);
|
|
417
|
-
case SerovalNodeType.Plugin:
|
|
418
|
-
return this.deserializePlugin(node);
|
|
419
|
-
case SerovalNodeType.PromiseConstructor:
|
|
420
|
-
return this.deserializePromiseConstructor(node);
|
|
421
|
-
case SerovalNodeType.PromiseSuccess:
|
|
422
|
-
return this.deserializePromiseResolve(node);
|
|
423
|
-
case SerovalNodeType.PromiseFailure:
|
|
424
|
-
return this.deserializePromiseReject(node);
|
|
425
|
-
case SerovalNodeType.IteratorFactoryInstance:
|
|
426
|
-
return this.deserializeIteratorFactoryInstance(node);
|
|
427
|
-
case SerovalNodeType.AsyncIteratorFactoryInstance:
|
|
428
|
-
return this.deserializeAsyncIteratorFactoryInstance(node);
|
|
429
|
-
case SerovalNodeType.StreamConstructor:
|
|
430
|
-
return this.deserializeStreamConstructor(node);
|
|
431
|
-
case SerovalNodeType.StreamNext:
|
|
432
|
-
return this.deserializeStreamNext(node);
|
|
433
|
-
case SerovalNodeType.StreamThrow:
|
|
434
|
-
return this.deserializeStreamThrow(node);
|
|
435
|
-
case SerovalNodeType.StreamReturn:
|
|
436
|
-
return this.deserializeStreamReturn(node);
|
|
437
|
-
case SerovalNodeType.IteratorFactory:
|
|
438
|
-
return this.deserializeIteratorFactory(node);
|
|
439
|
-
case SerovalNodeType.AsyncIteratorFactory:
|
|
440
|
-
return this.deserializeAsyncIteratorFactory(node);
|
|
441
|
-
// case SerovalNodeType.SpecialReference:
|
|
442
|
-
default:
|
|
443
|
-
throw new SerovalUnsupportedNodeError(node);
|
|
444
|
-
}
|
|
445
|
-
} catch (error) {
|
|
446
|
-
throw new SerovalDeserializationError(error);
|
|
447
|
-
}
|
|
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);
|
|
448
645
|
}
|
|
449
646
|
}
|