tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }