Deserializer.ts (2513B)
1 /** 2 * @license 3 * Copyright 2023 Google Inc. 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 7 import type * as Bidi from 'chromium-bidi/lib/cjs/protocol/protocol.js'; 8 9 import {debugError} from '../common/util.js'; 10 11 /** 12 * @internal 13 */ 14 export class BidiDeserializer { 15 static deserialize(result: Bidi.Script.RemoteValue): any { 16 if (!result) { 17 debugError('Service did not produce a result.'); 18 return undefined; 19 } 20 21 switch (result.type) { 22 case 'array': 23 return result.value?.map(value => { 24 return this.deserialize(value); 25 }); 26 case 'set': 27 return result.value?.reduce((acc: Set<unknown>, value) => { 28 return acc.add(this.deserialize(value)); 29 }, new Set()); 30 case 'object': 31 return result.value?.reduce((acc: Record<any, unknown>, tuple) => { 32 const {key, value} = this.#deserializeTuple(tuple); 33 acc[key as any] = value; 34 return acc; 35 }, {}); 36 case 'map': 37 return result.value?.reduce((acc: Map<unknown, unknown>, tuple) => { 38 const {key, value} = this.#deserializeTuple(tuple); 39 return acc.set(key, value); 40 }, new Map()); 41 case 'promise': 42 return {}; 43 case 'regexp': 44 return new RegExp(result.value.pattern, result.value.flags); 45 case 'date': 46 return new Date(result.value); 47 case 'undefined': 48 return undefined; 49 case 'null': 50 return null; 51 case 'number': 52 return this.#deserializeNumber(result.value); 53 case 'bigint': 54 return BigInt(result.value); 55 case 'boolean': 56 return Boolean(result.value); 57 case 'string': 58 return result.value; 59 } 60 61 debugError(`Deserialization of type ${result.type} not supported.`); 62 return undefined; 63 } 64 65 static #deserializeNumber(value: Bidi.Script.SpecialNumber | number): number { 66 switch (value) { 67 case '-0': 68 return -0; 69 case 'NaN': 70 return NaN; 71 case 'Infinity': 72 return Infinity; 73 case '-Infinity': 74 return -Infinity; 75 default: 76 return value; 77 } 78 } 79 80 static #deserializeTuple([serializedKey, serializedValue]: [ 81 Bidi.Script.RemoteValue | string, 82 Bidi.Script.RemoteValue, 83 ]): {key: unknown; value: unknown} { 84 const key = 85 typeof serializedKey === 'string' 86 ? serializedKey 87 : this.deserialize(serializedKey); 88 const value = this.deserialize(serializedValue); 89 90 return {key, value}; 91 } 92 }