seroval 0.12.4 → 0.13.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.
Files changed (138) hide show
  1. package/README.md +17 -15
  2. package/dist/cjs/development/index.cjs +1432 -959
  3. package/dist/cjs/development/index.cjs.map +3 -3
  4. package/dist/cjs/production/index.cjs +3 -3
  5. package/dist/esm/development/index.mjs +1432 -959
  6. package/dist/esm/development/index.mjs.map +3 -3
  7. package/dist/esm/production/index.mjs +3 -3
  8. package/dist/types/core/base-primitives.d.ts +12 -1
  9. package/dist/types/core/base-primitives.d.ts.map +1 -1
  10. package/dist/types/core/compat.d.ts +0 -2
  11. package/dist/types/core/compat.d.ts.map +1 -1
  12. package/dist/types/core/constants.d.ts +8 -2
  13. package/dist/types/core/constants.d.ts.map +1 -1
  14. package/dist/types/core/{tree/deserialize.d.ts → context/deserializer.d.ts} +19 -13
  15. package/dist/types/core/context/deserializer.d.ts.map +1 -0
  16. package/dist/types/core/{base → context/parser}/async.d.ts +6 -5
  17. package/dist/types/core/context/parser/async.d.ts.map +1 -0
  18. package/dist/types/core/{base → context/parser}/stream.d.ts +2 -1
  19. package/dist/types/core/context/parser/stream.d.ts.map +1 -0
  20. package/dist/types/core/{base → context/parser}/sync.d.ts +7 -9
  21. package/dist/types/core/context/parser/sync.d.ts.map +1 -0
  22. package/dist/types/core/context/parser.d.ts +27 -0
  23. package/dist/types/core/context/parser.d.ts.map +1 -0
  24. package/dist/types/core/{serializer-context.old.d.ts → context/serializer.d.ts} +21 -22
  25. package/dist/types/core/context/serializer.d.ts.map +1 -0
  26. package/dist/types/core/cross/async.d.ts +2 -2
  27. package/dist/types/core/cross/async.d.ts.map +1 -1
  28. package/dist/types/core/cross/deserializer.d.ts +9 -0
  29. package/dist/types/core/cross/deserializer.d.ts.map +1 -0
  30. package/dist/types/core/cross/index.d.ts +11 -1
  31. package/dist/types/core/cross/index.d.ts.map +1 -1
  32. package/dist/types/core/cross/parser.d.ts +6 -0
  33. package/dist/types/core/cross/parser.d.ts.map +1 -0
  34. package/dist/types/core/cross/{serialize.d.ts → serializer.d.ts} +6 -5
  35. package/dist/types/core/cross/serializer.d.ts.map +1 -0
  36. package/dist/types/core/cross/stream.d.ts +2 -2
  37. package/dist/types/core/cross/stream.d.ts.map +1 -1
  38. package/dist/types/core/cross/sync.d.ts +2 -2
  39. package/dist/types/core/cross/sync.d.ts.map +1 -1
  40. package/dist/types/core/keys.d.ts +3 -1
  41. package/dist/types/core/keys.d.ts.map +1 -1
  42. package/dist/types/core/plugin.d.ts +6 -7
  43. package/dist/types/core/plugin.d.ts.map +1 -1
  44. package/dist/types/core/special-reference.d.ts +6 -0
  45. package/dist/types/core/special-reference.d.ts.map +1 -0
  46. package/dist/types/core/tree/async.d.ts +2 -2
  47. package/dist/types/core/tree/async.d.ts.map +1 -1
  48. package/dist/types/core/tree/deserializer.d.ts +13 -0
  49. package/dist/types/core/tree/deserializer.d.ts.map +1 -0
  50. package/dist/types/core/tree/{serialize.d.ts → serializer.d.ts} +4 -4
  51. package/dist/types/core/tree/serializer.d.ts.map +1 -0
  52. package/dist/types/core/tree/sync.d.ts +2 -2
  53. package/dist/types/core/tree/sync.d.ts.map +1 -1
  54. package/dist/types/core/types.d.ts +47 -6
  55. package/dist/types/core/types.d.ts.map +1 -1
  56. package/dist/types/core/utils/assert.d.ts.map +1 -0
  57. package/dist/types/core/utils/constructors.d.ts.map +1 -0
  58. package/dist/types/core/utils/deferred.d.ts +14 -0
  59. package/dist/types/core/utils/deferred.d.ts.map +1 -0
  60. package/dist/types/core/utils/error.d.ts +5 -0
  61. package/dist/types/core/utils/error.d.ts.map +1 -0
  62. package/dist/types/core/utils/get-identifier.d.ts.map +1 -0
  63. package/dist/types/core/utils/get-object-flag.d.ts +3 -0
  64. package/dist/types/core/utils/get-object-flag.d.ts.map +1 -0
  65. package/dist/types/core/utils/is-valid-identifier.d.ts +2 -0
  66. package/dist/types/core/utils/is-valid-identifier.d.ts.map +1 -0
  67. package/dist/types/core/utils/iterator-to-sequence.d.ts +20 -0
  68. package/dist/types/core/utils/iterator-to-sequence.d.ts.map +1 -0
  69. package/dist/types/core/utils/promise-to-result.d.ts.map +1 -0
  70. package/dist/types/core/utils/typed-array.d.ts +4 -0
  71. package/dist/types/core/utils/typed-array.d.ts.map +1 -0
  72. package/dist/types/core/web-api.d.ts +4 -1
  73. package/dist/types/core/web-api.d.ts.map +1 -1
  74. package/package.json +3 -3
  75. package/src/core/base-primitives.ts +229 -1
  76. package/src/core/compat.ts +0 -2
  77. package/src/core/constants.ts +7 -2
  78. package/src/core/{tree/deserialize.ts → context/deserializer.ts} +159 -66
  79. package/src/core/{base → context/parser}/async.ts +181 -309
  80. package/src/core/{base → context/parser}/stream.ts +89 -14
  81. package/src/core/{base → context/parser}/sync.ts +120 -281
  82. package/src/core/context/parser.ts +259 -0
  83. package/src/core/{serializer-context.old.ts → context/serializer.ts} +241 -166
  84. package/src/core/cross/async.ts +2 -2
  85. package/src/core/cross/deserializer.ts +19 -0
  86. package/src/core/cross/index.ts +68 -47
  87. package/src/core/cross/parser.ts +7 -0
  88. package/src/core/cross/{serialize.ts → serializer.ts} +31 -12
  89. package/src/core/cross/stream.ts +2 -2
  90. package/src/core/cross/sync.ts +2 -2
  91. package/src/core/is-serializable.new.ts +1 -1
  92. package/src/core/keys.ts +8 -2
  93. package/src/core/plugin.ts +7 -7
  94. package/src/core/reference.ts +1 -1
  95. package/src/core/special-reference.ts +9 -0
  96. package/src/core/tree/async.ts +2 -2
  97. package/src/core/tree/deserializer.ts +31 -0
  98. package/src/core/tree/index.ts +2 -2
  99. package/src/core/tree/{serialize.ts → serializer.ts} +5 -16
  100. package/src/core/tree/sync.ts +2 -2
  101. package/src/core/types.ts +60 -7
  102. package/src/core/utils/deferred.ts +49 -0
  103. package/src/core/{shared.ts → utils/error.ts} +3 -60
  104. package/src/core/utils/get-object-flag.ts +14 -0
  105. package/src/core/utils/is-valid-identifier.ts +11 -0
  106. package/src/core/utils/iterator-to-sequence.ts +238 -0
  107. package/src/core/utils/typed-array.ts +30 -0
  108. package/src/core/web-api.ts +75 -1
  109. package/src/example.ts +0 -3
  110. package/dist/types/core/assert.d.ts.map +0 -1
  111. package/dist/types/core/base/async.d.ts.map +0 -1
  112. package/dist/types/core/base/stream.d.ts.map +0 -1
  113. package/dist/types/core/base/sync.d.ts.map +0 -1
  114. package/dist/types/core/constructors.d.ts.map +0 -1
  115. package/dist/types/core/cross/cross-parser.d.ts +0 -8
  116. package/dist/types/core/cross/cross-parser.d.ts.map +0 -1
  117. package/dist/types/core/cross/serialize.d.ts.map +0 -1
  118. package/dist/types/core/get-identifier.d.ts.map +0 -1
  119. package/dist/types/core/parser-context.d.ts +0 -23
  120. package/dist/types/core/parser-context.d.ts.map +0 -1
  121. package/dist/types/core/promise-to-result.d.ts.map +0 -1
  122. package/dist/types/core/serializer-context.old.d.ts.map +0 -1
  123. package/dist/types/core/shared.d.ts +0 -10
  124. package/dist/types/core/shared.d.ts.map +0 -1
  125. package/dist/types/core/tree/deserialize.d.ts.map +0 -1
  126. package/dist/types/core/tree/serialize.d.ts.map +0 -1
  127. package/src/core/cross/cross-parser.ts +0 -9
  128. package/src/core/parser-context.ts +0 -131
  129. package/src/core/serializer-context.new.ts +0 -1168
  130. package/src/core/tree/parser.ts +0 -45
  131. /package/dist/types/core/{assert.d.ts → utils/assert.d.ts} +0 -0
  132. /package/dist/types/core/{constructors.d.ts → utils/constructors.d.ts} +0 -0
  133. /package/dist/types/core/{get-identifier.d.ts → utils/get-identifier.d.ts} +0 -0
  134. /package/dist/types/core/{promise-to-result.d.ts → utils/promise-to-result.d.ts} +0 -0
  135. /package/src/core/{assert.ts → utils/assert.ts} +0 -0
  136. /package/src/core/{constructors.ts → utils/constructors.ts} +0 -0
  137. /package/src/core/{get-identifier.ts → utils/get-identifier.ts} +0 -0
  138. /package/src/core/{promise-to-result.ts → utils/promise-to-result.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promise-to-result.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/promise-to-result.ts"],"names":[],"mappings":"AAAA,wBAA8B,eAAe,CAC3C,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GACxB,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,CAM3B"}
@@ -0,0 +1,4 @@
1
+ type TypedArrayConstructor = Int8ArrayConstructor | Int16ArrayConstructor | Int32ArrayConstructor | Uint8ArrayConstructor | Uint16ArrayConstructor | Uint32ArrayConstructor | Uint8ClampedArrayConstructor | Float32ArrayConstructor | Float64ArrayConstructor | BigInt64ArrayConstructor | BigUint64ArrayConstructor;
2
+ export declare function getTypedArrayConstructor(name: string): TypedArrayConstructor;
3
+ export {};
4
+ //# sourceMappingURL=typed-array.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typed-array.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/typed-array.ts"],"names":[],"mappings":"AAAA,KAAK,qBAAqB,GACtB,oBAAoB,GACpB,qBAAqB,GACrB,qBAAqB,GACrB,qBAAqB,GACrB,sBAAsB,GACtB,sBAAsB,GACtB,4BAA4B,GAC5B,uBAAuB,GACvB,uBAAuB,GACvB,wBAAwB,GACxB,yBAAyB,CAAC;AAE9B,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,CAgB5E"}
@@ -1,5 +1,8 @@
1
- import type { SerovalDOMExceptionNode, SerovalURLNode, SerovalURLSearchParamsNode } from './types';
1
+ import type { SerovalCustomEventNode, SerovalDOMExceptionNode, SerovalEventNode, SerovalNode, SerovalReadableStreamNode, SerovalURLNode, SerovalURLSearchParamsNode } from './types';
2
2
  export declare function createURLNode(id: number, current: URL): SerovalURLNode;
3
3
  export declare function createURLSearchParamsNode(id: number, current: URLSearchParams): SerovalURLSearchParamsNode;
4
4
  export declare function createDOMExceptionNode(id: number, current: DOMException): SerovalDOMExceptionNode;
5
+ export declare function createEventNode(id: number, type: string, options: SerovalNode): SerovalEventNode;
6
+ export declare function createCustomEventNode(id: number, type: string, options: SerovalNode): SerovalCustomEventNode;
7
+ export declare function createReadableStreamNode(id: number, factory: SerovalNode, items: SerovalNode): SerovalReadableStreamNode;
5
8
  //# sourceMappingURL=web-api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"web-api.d.ts","sourceRoot":"","sources":["../../../src/core/web-api.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAEnG,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,GAAG,GACX,cAAc,CAehB;AAED,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,eAAe,GACvB,0BAA0B,CAe5B;AAED,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,YAAY,GACpB,uBAAuB,CAezB"}
1
+ {"version":3,"file":"web-api.d.ts","sourceRoot":"","sources":["../../../src/core/web-api.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACvB,gBAAgB,EAChB,WAAW,EACX,yBAAyB,EACzB,cAAc,EACd,0BAA0B,EAC3B,MAAM,SAAS,CAAC;AAEjB,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,GAAG,GACX,cAAc,CAehB;AAED,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,eAAe,GACvB,0BAA0B,CAe5B;AAED,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,YAAY,GACpB,uBAAuB,CAezB;AAED,wBAAgB,eAAe,CAC7B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,GACnB,gBAAgB,CAelB;AAED,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,GACnB,sBAAsB,CAexB;AAED,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,WAAW,GACjB,yBAAyB,CAkB3B"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "seroval",
3
3
  "type": "module",
4
- "version": "0.12.4",
4
+ "version": "0.13.1",
5
5
  "files": [
6
6
  "dist",
7
7
  "src"
@@ -20,7 +20,7 @@
20
20
  "eslint-config-lxsmnsyc": "^0.6.5",
21
21
  "pridepack": "2.5.1",
22
22
  "tslib": "^2.6.2",
23
- "typescript": "^5.2.2",
23
+ "typescript": "^5.3.2",
24
24
  "vitest": "^0.34.6"
25
25
  },
26
26
  "scripts": {
@@ -66,5 +66,5 @@
66
66
  "typesVersions": {
67
67
  "*": {}
68
68
  },
69
- "gitHead": "4040423d3d896c86679f5f129f8a3309752c9c7a"
69
+ "gitHead": "d977f4e777e01d1c449558c2d1b13d9e04db077c"
70
70
  }
@@ -1,4 +1,5 @@
1
- import assert from './assert';
1
+ import type { BigIntTypedArrayValue, TypedArrayValue } from '../types';
2
+ import assert from './utils/assert';
2
3
  import type { WellKnownSymbols } from './constants';
3
4
  import { INV_SYMBOL_REF, SerovalNodeType } from './constants';
4
5
  import {
@@ -8,20 +9,34 @@ import {
8
9
  NEG_ZERO_NODE,
9
10
  } from './literals';
10
11
  import { getReferenceID } from './reference';
12
+ import { getErrorConstructor } from './utils/error';
11
13
  import { serializeString } from './string';
12
14
  import type {
15
+ SerovalAggregateErrorNode,
13
16
  SerovalArrayBufferNode,
17
+ SerovalArrayNode,
18
+ SerovalAsyncIteratorFactoryInstanceNode,
14
19
  SerovalBigIntNode,
20
+ SerovalBigIntTypedArrayNode,
21
+ SerovalBoxedNode,
15
22
  SerovalConstantNode,
23
+ SerovalDataViewNode,
16
24
  SerovalDateNode,
25
+ SerovalErrorNode,
17
26
  SerovalIndexedValueNode,
27
+ SerovalIteratorFactoryInstanceNode,
28
+ SerovalNode,
18
29
  SerovalNumberNode,
30
+ SerovalObjectRecordNode,
19
31
  SerovalPluginNode,
20
32
  SerovalReferenceNode,
21
33
  SerovalRegExpNode,
34
+ SerovalSetNode,
22
35
  SerovalStringNode,
36
+ SerovalTypedArrayNode,
23
37
  SerovalWKSymbolNode,
24
38
  } from './types';
39
+ import { getObjectFlag } from './utils/get-object-flag';
25
40
 
26
41
  export function createNumberNode(value: number): SerovalConstantNode | SerovalNumberNode {
27
42
  switch (value) {
@@ -228,3 +243,216 @@ export function createPluginNode(
228
243
  o: undefined,
229
244
  };
230
245
  }
246
+
247
+ export function createArrayNode(
248
+ id: number,
249
+ current: unknown[],
250
+ parsedItems: SerovalNode[],
251
+ ): SerovalArrayNode {
252
+ return {
253
+ t: SerovalNodeType.Array,
254
+ i: id,
255
+ s: undefined,
256
+ l: current.length,
257
+ c: undefined,
258
+ m: undefined,
259
+ p: undefined,
260
+ e: undefined,
261
+ a: parsedItems,
262
+ f: undefined,
263
+ b: undefined,
264
+ o: getObjectFlag(current),
265
+ };
266
+ }
267
+
268
+ export function createBoxedNode(
269
+ id: number,
270
+ boxed: SerovalNode,
271
+ ): SerovalBoxedNode {
272
+ return {
273
+ t: SerovalNodeType.Boxed,
274
+ i: id,
275
+ s: undefined,
276
+ l: undefined,
277
+ c: undefined,
278
+ m: undefined,
279
+ p: undefined,
280
+ e: undefined,
281
+ a: undefined,
282
+ f: boxed,
283
+ b: undefined,
284
+ o: undefined,
285
+ };
286
+ }
287
+
288
+ export function createTypedArrayNode(
289
+ id: number,
290
+ current: TypedArrayValue,
291
+ buffer: SerovalNode,
292
+ ): SerovalTypedArrayNode {
293
+ return {
294
+ t: SerovalNodeType.TypedArray,
295
+ i: id,
296
+ s: undefined,
297
+ l: current.length,
298
+ c: current.constructor.name,
299
+ m: undefined,
300
+ p: undefined,
301
+ e: undefined,
302
+ a: undefined,
303
+ f: buffer,
304
+ b: current.byteOffset,
305
+ o: undefined,
306
+ };
307
+ }
308
+
309
+ export function createBigIntTypedArrayNode(
310
+ id: number,
311
+ current: BigIntTypedArrayValue,
312
+ buffer: SerovalNode,
313
+ ): SerovalBigIntTypedArrayNode {
314
+ return {
315
+ t: SerovalNodeType.BigIntTypedArray,
316
+ i: id,
317
+ s: undefined,
318
+ l: current.length,
319
+ c: current.constructor.name,
320
+ m: undefined,
321
+ p: undefined,
322
+ e: undefined,
323
+ a: undefined,
324
+ f: buffer,
325
+ b: current.byteOffset,
326
+ o: undefined,
327
+ };
328
+ }
329
+
330
+ export function createDataViewNode(
331
+ id: number,
332
+ current: DataView,
333
+ buffer: SerovalNode,
334
+ ): SerovalDataViewNode {
335
+ return {
336
+ t: SerovalNodeType.DataView,
337
+ i: id,
338
+ s: undefined,
339
+ l: current.byteLength,
340
+ c: undefined,
341
+ m: undefined,
342
+ p: undefined,
343
+ e: undefined,
344
+ a: undefined,
345
+ f: buffer,
346
+ b: current.byteOffset,
347
+ o: undefined,
348
+ };
349
+ }
350
+
351
+ export function createErrorNode(
352
+ id: number,
353
+ current: Error,
354
+ options: SerovalObjectRecordNode | undefined,
355
+ ): SerovalErrorNode {
356
+ return {
357
+ t: SerovalNodeType.Error,
358
+ i: id,
359
+ s: getErrorConstructor(current),
360
+ l: undefined,
361
+ c: undefined,
362
+ m: serializeString(current.message),
363
+ p: options,
364
+ e: undefined,
365
+ a: undefined,
366
+ f: undefined,
367
+ b: undefined,
368
+ o: undefined,
369
+ };
370
+ }
371
+
372
+ export function createAggregateErrorNode(
373
+ id: number,
374
+ current: AggregateError,
375
+ options: SerovalObjectRecordNode | undefined,
376
+ ): SerovalAggregateErrorNode {
377
+ return {
378
+ t: SerovalNodeType.AggregateError,
379
+ i: id,
380
+ s: getErrorConstructor(current),
381
+ l: undefined,
382
+ c: undefined,
383
+ m: serializeString(current.message),
384
+ p: options,
385
+ e: undefined,
386
+ a: undefined,
387
+ f: undefined,
388
+ b: undefined,
389
+ o: undefined,
390
+ };
391
+ }
392
+
393
+ export function createSetNode(
394
+ id: number,
395
+ size: number,
396
+ items: SerovalNode[],
397
+ ): SerovalSetNode {
398
+ return {
399
+ t: SerovalNodeType.Set,
400
+ i: id,
401
+ s: undefined,
402
+ l: size,
403
+ c: undefined,
404
+ m: undefined,
405
+ p: undefined,
406
+ e: undefined,
407
+ a: items,
408
+ f: undefined,
409
+ b: undefined,
410
+ o: undefined,
411
+ };
412
+ }
413
+
414
+ export function createIteratorFactoryInstanceNode(
415
+ factory: SerovalNode,
416
+ items: SerovalNode,
417
+ ): SerovalIteratorFactoryInstanceNode {
418
+ return {
419
+ t: SerovalNodeType.IteratorFactoryInstance,
420
+ i: undefined,
421
+ s: undefined,
422
+ l: undefined,
423
+ c: undefined,
424
+ m: undefined,
425
+ p: undefined,
426
+ e: undefined,
427
+ a: [
428
+ factory,
429
+ items,
430
+ ],
431
+ f: undefined,
432
+ b: undefined,
433
+ o: undefined,
434
+ };
435
+ }
436
+
437
+ export function createAsyncIteratorFactoryInstanceNode(
438
+ factory: SerovalNode,
439
+ items: SerovalNode,
440
+ ): SerovalAsyncIteratorFactoryInstanceNode {
441
+ return {
442
+ t: SerovalNodeType.AsyncIteratorFactoryInstance,
443
+ i: undefined,
444
+ s: undefined,
445
+ l: undefined,
446
+ c: undefined,
447
+ m: undefined,
448
+ p: undefined,
449
+ e: undefined,
450
+ a: [
451
+ factory,
452
+ items,
453
+ ],
454
+ f: undefined,
455
+ b: undefined,
456
+ o: undefined,
457
+ };
458
+ }
@@ -6,12 +6,10 @@
6
6
 
7
7
  export const enum Feature {
8
8
  AggregateError = 0x01,
9
- ArrayPrototypeValues = 0x02,
10
9
  ArrowFunction = 0x04,
11
10
  BigInt = 0x08,
12
11
  ErrorPrototypeStack = 0x10,
13
12
  Map = 0x20,
14
- MethodShorthand = 0x40,
15
13
  ObjectAssign = 0x80,
16
14
  Promise = 0x100,
17
15
  Set = 0x200,
@@ -51,6 +51,13 @@ export const enum SerovalNodeType {
51
51
  CustomEvent = 38,
52
52
  DOMException = 39,
53
53
  Plugin = 40,
54
+ MapSentinel = 41,
55
+ IteratorFactory = 42,
56
+ IteratorFactoryInstance = 43,
57
+ AsyncIteratorFactory = 44,
58
+ AsyncIteratorFactoryInstance = 45,
59
+ ReadableStream = 46,
60
+ ReadableStreamFactory = 47,
54
61
  }
55
62
 
56
63
  export const enum SerovalObjectFlags {
@@ -186,5 +193,3 @@ export const ERROR_CONSTRUCTOR: Record<ErrorConstructorTag, ErrorConstructors> =
186
193
  [ErrorConstructorTag.TypeError]: TypeError,
187
194
  [ErrorConstructorTag.URIError]: URIError,
188
195
  };
189
-
190
- export const UNIVERSAL_SENTINEL = Symbol('why');
@@ -2,11 +2,11 @@
2
2
  import { deserializeString } from '../string';
3
3
  import type { BigIntTypedArrayValue, TypedArrayValue } from '../../types';
4
4
  import { getReference } from '../reference';
5
- import { getTypedArrayConstructor } from '../shared';
6
5
  import type {
7
6
  SerovalAggregateErrorNode,
8
7
  SerovalArrayBufferNode,
9
8
  SerovalArrayNode,
9
+ SerovalAsyncIteratorFactoryInstanceNode,
10
10
  SerovalBigIntTypedArrayNode,
11
11
  SerovalBlobNode,
12
12
  SerovalBoxedNode,
@@ -19,6 +19,7 @@ import type {
19
19
  SerovalFileNode,
20
20
  SerovalFormDataNode,
21
21
  SerovalHeadersNode,
22
+ SerovalIteratorFactoryInstanceNode,
22
23
  SerovalMapNode,
23
24
  SerovalNode,
24
25
  SerovalNullConstructorNode,
@@ -26,7 +27,15 @@ import type {
26
27
  SerovalObjectRecordKey,
27
28
  SerovalObjectRecordNode,
28
29
  SerovalPluginNode,
30
+ SerovalPromiseConstructorNode,
29
31
  SerovalPromiseNode,
32
+ SerovalPromiseRejectNode,
33
+ SerovalPromiseResolveNode,
34
+ SerovalReadableStreamCloseNode,
35
+ SerovalReadableStreamConstructorNode,
36
+ SerovalReadableStreamEnqueueNode,
37
+ SerovalReadableStreamErrorNode,
38
+ SerovalReadableStreamNode,
30
39
  SerovalReferenceNode,
31
40
  SerovalRegExpNode,
32
41
  SerovalRequestNode,
@@ -36,9 +45,6 @@ import type {
36
45
  SerovalURLNode,
37
46
  SerovalURLSearchParamsNode,
38
47
  } from '../types';
39
- import {
40
- SerovalObjectRecordSpecialKey,
41
- } from '../types';
42
48
  import {
43
49
  CONSTANT_VAL,
44
50
  ERROR_CONSTRUCTOR,
@@ -46,7 +52,18 @@ import {
46
52
  SerovalNodeType,
47
53
  SerovalObjectFlags,
48
54
  } from '../constants';
49
- import type { Plugin, PluginAccessOptions } from '../plugin';
55
+ import type { Plugin, PluginAccessOptions, SerovalMode } from '../plugin';
56
+ import type { Sequence, SerializedAsyncIteratorResult } from '../utils/iterator-to-sequence';
57
+ import {
58
+ readableStreamToAsyncIterator,
59
+ sequenceToAsyncIterator,
60
+ sequenceToIterator,
61
+ sequenceToReadableStream,
62
+ } from '../utils/iterator-to-sequence';
63
+ import { getTypedArrayConstructor } from '../utils/typed-array';
64
+ import type { Deferred, DeferredStream } from '../utils/deferred';
65
+ import { createDeferred, createDeferredStream } from '../utils/deferred';
66
+ import assert from '../utils/assert';
50
67
 
51
68
  function applyObjectFlag(obj: unknown, flag: SerovalObjectFlags): unknown {
52
69
  switch (flag) {
@@ -64,62 +81,30 @@ function applyObjectFlag(obj: unknown, flag: SerovalObjectFlags): unknown {
64
81
  type AssignableValue = AggregateError | Error | Iterable<unknown>
65
82
  type AssignableNode = SerovalAggregateErrorNode | SerovalErrorNode;
66
83
 
67
- interface Deferred {
68
- resolve(value: unknown): void;
69
- reject(value: unknown): void;
70
- promise: Promise<unknown>;
84
+ export interface BaseDeserializerOptions extends PluginAccessOptions {
85
+ refs?: Map<number, unknown>;
71
86
  }
72
87
 
73
- function createDeferred(): Deferred {
74
- let resolve: Deferred['resolve'];
75
- let reject: Deferred['reject'];
76
- return {
77
- resolve(v): void {
78
- resolve(v);
79
- },
80
- reject(v): void {
81
- reject(v);
82
- },
83
- promise: new Promise((res, rej) => {
84
- resolve = res as Deferred['resolve'];
85
- reject = rej as Deferred['reject'];
86
- }),
87
- };
88
- }
88
+ export default abstract class BaseDeserializerContext implements PluginAccessOptions {
89
+ abstract readonly mode: SerovalMode;
89
90
 
90
- export interface DeserializerOptions extends PluginAccessOptions {
91
- markedRefs: number[] | Set<number>;
92
- }
93
-
94
- export default class VanillaDeserializerContext implements PluginAccessOptions {
95
91
  /**
96
92
  * Mapping ids to values
97
93
  * @private
98
94
  */
99
- values: Map<number, unknown> = new Map();
100
-
101
- /**
102
- * Which refs are pre-marked
103
- * @private
104
- */
105
- refs: Set<number>;
95
+ refs: Map<number, unknown>;
106
96
 
107
97
  plugins?: Plugin<any, any>[] | undefined;
108
98
 
109
- constructor(options: DeserializerOptions) {
99
+ constructor(options: BaseDeserializerOptions) {
110
100
  this.plugins = options.plugins;
111
- this.refs = new Set(options.markedRefs);
101
+ this.refs = options.refs || new Map<number, unknown>();
112
102
  }
113
103
 
114
- assignIndexedValue<T>(
115
- index: number,
104
+ protected abstract assignIndexedValue<T>(
105
+ id: number,
116
106
  value: T,
117
- ): T {
118
- if (this.refs.has(index)) {
119
- this.values.set(index, value);
120
- }
121
- return value;
122
- }
107
+ ): T;
123
108
 
124
109
  private deserializeReference(
125
110
  node: SerovalReferenceNode,
@@ -152,22 +137,14 @@ export default class VanillaDeserializerContext implements PluginAccessOptions {
152
137
  ): Record<string | symbol, unknown> {
153
138
  const len = node.s;
154
139
  if (len) {
155
- let key: SerovalObjectRecordKey;
156
- let value: unknown;
157
140
  const keys = node.k;
158
141
  const vals = node.v;
159
- for (let i = 0; i < len; i++) {
142
+ for (let i = 0, key: SerovalObjectRecordKey; i < len; i++) {
160
143
  key = keys[i];
161
- value = this.deserialize(vals[i]);
162
- switch (key) {
163
- case SerovalObjectRecordSpecialKey.SymbolIterator: {
164
- const current = value as unknown[];
165
- result[Symbol.iterator] = (): IterableIterator<unknown> => current.values();
166
- }
167
- break;
168
- default:
169
- result[deserializeString(key)] = value;
170
- break;
144
+ if (typeof key === 'string') {
145
+ result[deserializeString(key)] = this.deserialize(vals[i]);
146
+ } else {
147
+ result[this.deserialize(key) as symbol] = this.deserialize(vals[i]);
171
148
  }
172
149
  }
173
150
  }
@@ -302,14 +279,14 @@ export default class VanillaDeserializerContext implements PluginAccessOptions {
302
279
  node: SerovalPromiseNode,
303
280
  ): Promise<unknown> {
304
281
  const deferred = createDeferred();
305
- const result = this.assignIndexedValue(node.i, deferred.promise);
282
+ const result = this.assignIndexedValue(node.i, deferred);
306
283
  const deserialized = this.deserialize(node.f);
307
284
  if (node.s) {
308
285
  deferred.resolve(deserialized);
309
286
  } else {
310
287
  deferred.reject(deserialized);
311
288
  }
312
- return result;
289
+ return result.promise;
313
290
  }
314
291
 
315
292
  private deserializeURL(
@@ -449,15 +426,107 @@ export default class VanillaDeserializerContext implements PluginAccessOptions {
449
426
  for (let i = 0, len = currentPlugins.length; i < len; i++) {
450
427
  const plugin = currentPlugins[i];
451
428
  if (plugin.tag === node.c) {
452
- return plugin.deserialize(node.s, this, {
453
- id: node.i,
454
- });
429
+ return this.assignIndexedValue(
430
+ node.i,
431
+ plugin.deserialize(node.s, this, {
432
+ id: node.i,
433
+ }),
434
+ );
455
435
  }
456
436
  }
457
437
  }
458
438
  throw new Error('Missing plugin for tag "' + node.c + '".');
459
439
  }
460
440
 
441
+ private deserializePromiseConstructor(node: SerovalPromiseConstructorNode): unknown {
442
+ return this.assignIndexedValue(
443
+ node.i,
444
+ createDeferred(),
445
+ ).promise;
446
+ }
447
+
448
+ private deserializePromiseResolve(node: SerovalPromiseResolveNode): unknown {
449
+ const deferred = this.refs.get(node.i) as Deferred | undefined;
450
+ assert(deferred, new Error('Missing Promise instance.'));
451
+ deferred.resolve(
452
+ this.deserialize(node.f),
453
+ );
454
+ return undefined;
455
+ }
456
+
457
+ private deserializePromiseReject(node: SerovalPromiseRejectNode): unknown {
458
+ const deferred = this.refs.get(node.i) as Deferred | undefined;
459
+ assert(deferred, new Error('Missing Promise instance.'));
460
+ deferred.reject(
461
+ this.deserialize(node.f),
462
+ );
463
+ return undefined;
464
+ }
465
+
466
+ private deserializeReadableStreamConstructor(
467
+ node: SerovalReadableStreamConstructorNode,
468
+ ): unknown {
469
+ return this.assignIndexedValue(
470
+ node.i,
471
+ createDeferredStream(),
472
+ ).stream;
473
+ }
474
+
475
+ private deserializeReadableStreamEnqueue(node: SerovalReadableStreamEnqueueNode): unknown {
476
+ const deferred = this.refs.get(node.i) as DeferredStream | undefined;
477
+ assert(deferred, new Error('Missing ReadableStream instance.'));
478
+ deferred.enqueue(
479
+ this.deserialize(node.f),
480
+ );
481
+ return undefined;
482
+ }
483
+
484
+ private deserializeReadableStreamError(node: SerovalReadableStreamErrorNode): unknown {
485
+ const deferred = this.refs.get(node.i) as DeferredStream | undefined;
486
+ assert(deferred, new Error('Missing Promise instance.'));
487
+ deferred.error(
488
+ this.deserialize(node.f),
489
+ );
490
+ return undefined;
491
+ }
492
+
493
+ private deserializeReadableStreamClose(node: SerovalReadableStreamCloseNode): unknown {
494
+ const deferred = this.refs.get(node.i) as DeferredStream | undefined;
495
+ assert(deferred, new Error('Missing Promise instance.'));
496
+ deferred.close();
497
+ return undefined;
498
+ }
499
+
500
+ private deserializeIteratorFactoryInstance(
501
+ node: SerovalIteratorFactoryInstanceNode,
502
+ ): unknown {
503
+ const source = this.deserialize(node.a[1]);
504
+ return sequenceToIterator(source as Sequence);
505
+ }
506
+
507
+ private deserializeAsyncIteratorFactoryInstance(
508
+ node: SerovalAsyncIteratorFactoryInstanceNode,
509
+ ): unknown {
510
+ const source = this.deserialize(node.a[1]);
511
+ if ((source as object).constructor === ReadableStream) {
512
+ return readableStreamToAsyncIterator(
513
+ source as ReadableStream<SerializedAsyncIteratorResult<unknown>>,
514
+ );
515
+ }
516
+ return sequenceToAsyncIterator(source as Sequence);
517
+ }
518
+
519
+ private deserializeReadableStream(
520
+ node: SerovalReadableStreamNode,
521
+ ): unknown {
522
+ return this.assignIndexedValue(
523
+ node.i,
524
+ sequenceToReadableStream(
525
+ this.deserialize(node.a[1]) as Sequence,
526
+ ),
527
+ );
528
+ }
529
+
461
530
  deserialize(node: SerovalNode): unknown {
462
531
  switch (node.t) {
463
532
  case SerovalNodeType.Constant:
@@ -469,7 +538,7 @@ export default class VanillaDeserializerContext implements PluginAccessOptions {
469
538
  case SerovalNodeType.BigInt:
470
539
  return BigInt(node.s);
471
540
  case SerovalNodeType.IndexedValue:
472
- return this.values.get(node.i);
541
+ return this.refs.get(node.i);
473
542
  case SerovalNodeType.Reference:
474
543
  return this.deserializeReference(node);
475
544
  case SerovalNodeType.Array:
@@ -526,6 +595,30 @@ export default class VanillaDeserializerContext implements PluginAccessOptions {
526
595
  return this.deserializeDOMException(node);
527
596
  case SerovalNodeType.Plugin:
528
597
  return this.deserializePlugin(node);
598
+ case SerovalNodeType.PromiseConstructor:
599
+ return this.deserializePromiseConstructor(node);
600
+ case SerovalNodeType.PromiseResolve:
601
+ return this.deserializePromiseResolve(node);
602
+ case SerovalNodeType.PromiseReject:
603
+ return this.deserializePromiseReject(node);
604
+ case SerovalNodeType.ReadableStreamConstructor:
605
+ return this.deserializeReadableStreamConstructor(node);
606
+ case SerovalNodeType.ReadableStreamEnqueue:
607
+ return this.deserializeReadableStreamEnqueue(node);
608
+ case SerovalNodeType.ReadableStreamError:
609
+ return this.deserializeReadableStreamError(node);
610
+ case SerovalNodeType.ReadableStreamClose:
611
+ return this.deserializeReadableStreamClose(node);
612
+ case SerovalNodeType.IteratorFactoryInstance:
613
+ return this.deserializeIteratorFactoryInstance(node);
614
+ case SerovalNodeType.AsyncIteratorFactoryInstance:
615
+ return this.deserializeAsyncIteratorFactoryInstance(node);
616
+ case SerovalNodeType.ReadableStream:
617
+ return this.deserializeReadableStream(node);
618
+ case SerovalNodeType.MapSentinel:
619
+ case SerovalNodeType.IteratorFactory:
620
+ case SerovalNodeType.AsyncIteratorFactory:
621
+ case SerovalNodeType.ReadableStreamFactory:
529
622
  default:
530
623
  throw new Error('invariant');
531
624
  }