tor-browser

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

arrayParser.js (8853B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 "use strict";
      6 
      7 // An implementation for WAMP messages parsing https://wamp-proto.org/
      8 var WampMessageType;
      9 (function (wampMessageTypeEnum) {
     10  wampMessageTypeEnum[(wampMessageTypeEnum.Hello = 1)] = "Hello";
     11  wampMessageTypeEnum[(wampMessageTypeEnum.Welcome = 2)] = "Welcome";
     12  wampMessageTypeEnum[(wampMessageTypeEnum.Abort = 3)] = "Abort";
     13  wampMessageTypeEnum[(wampMessageTypeEnum.Challenge = 4)] = "Challenge";
     14  wampMessageTypeEnum[(wampMessageTypeEnum.Authenticate = 5)] = "Authenticate";
     15  wampMessageTypeEnum[(wampMessageTypeEnum.Goodbye = 6)] = "Goodbye";
     16  wampMessageTypeEnum[(wampMessageTypeEnum.Error = 8)] = "Error";
     17  wampMessageTypeEnum[(wampMessageTypeEnum.Publish = 16)] = "Publish";
     18  wampMessageTypeEnum[(wampMessageTypeEnum.Published = 17)] = "Published";
     19  wampMessageTypeEnum[(wampMessageTypeEnum.Subscribe = 32)] = "Subscribe";
     20  wampMessageTypeEnum[(wampMessageTypeEnum.Subscribed = 33)] = "Subscribed";
     21  wampMessageTypeEnum[(wampMessageTypeEnum.Unsubscribe = 34)] = "Unsubscribe";
     22  wampMessageTypeEnum[(wampMessageTypeEnum.Unsubscribed = 35)] = "Unsubscribed";
     23  wampMessageTypeEnum[(wampMessageTypeEnum.Event = 36)] = "Event";
     24  wampMessageTypeEnum[(wampMessageTypeEnum.Call = 48)] = "Call";
     25  wampMessageTypeEnum[(wampMessageTypeEnum.Cancel = 49)] = "Cancel";
     26  wampMessageTypeEnum[(wampMessageTypeEnum.Result = 50)] = "Result";
     27  wampMessageTypeEnum[(wampMessageTypeEnum.Register = 64)] = "Register";
     28  wampMessageTypeEnum[(wampMessageTypeEnum.Registered = 65)] = "Registered";
     29  wampMessageTypeEnum[(wampMessageTypeEnum.Unregister = 66)] = "Unregister";
     30  wampMessageTypeEnum[(wampMessageTypeEnum.Unregistered = 67)] = "Unregistered";
     31  wampMessageTypeEnum[(wampMessageTypeEnum.Invocation = 68)] = "Invocation";
     32  wampMessageTypeEnum[(wampMessageTypeEnum.Interrupt = 69)] = "Interrupt";
     33  wampMessageTypeEnum[(wampMessageTypeEnum.Yield = 70)] = "Yield";
     34 })(WampMessageType || (WampMessageType = {}));
     35 
     36 // The WAMP protocol consists of many messages, disable complexity for one time
     37 // eslint-disable-next-line complexity
     38 function parseWampArray(messageArray) {
     39  const [messageType, ...args] = messageArray;
     40  switch (messageType) {
     41    case WampMessageType.Hello:
     42      return new HelloMessage(args);
     43    case WampMessageType.Welcome:
     44      return new WelcomeMessage(args);
     45    case WampMessageType.Abort:
     46      return new AbortMessage(args);
     47    case WampMessageType.Challenge:
     48      return new ChallengeMessage(args);
     49    case WampMessageType.Authenticate:
     50      return new AuthenticateMessage(args);
     51    case WampMessageType.Goodbye:
     52      return new GoodbyeMessage(args);
     53    case WampMessageType.Error:
     54      return new ErrorMessage(args);
     55    case WampMessageType.Publish:
     56      return new PublishMessage(args);
     57    case WampMessageType.Published:
     58      return new PublishedMessage(args);
     59    case WampMessageType.Subscribe:
     60      return new SubscribeMessage(args);
     61    case WampMessageType.Subscribed:
     62      return new SubscribedMessage(args);
     63    case WampMessageType.Unsubscribe:
     64      return new UnsubscribeMessage(args);
     65    case WampMessageType.Unsubscribed:
     66      return new UnsubscribedMessage(args);
     67    case WampMessageType.Event:
     68      return new EventMessage(args);
     69    case WampMessageType.Call:
     70      return new CallMessage(args);
     71    case WampMessageType.Cancel:
     72      return new CancelMessage(args);
     73    case WampMessageType.Result:
     74      return new ResultMessage(args);
     75    case WampMessageType.Register:
     76      return new RegisterMessage(args);
     77    case WampMessageType.Registered:
     78      return new RegisteredMessage(args);
     79    case WampMessageType.Unregister:
     80      return new UnregisterMessage(args);
     81    case WampMessageType.Unregistered:
     82      return new UnregisteredMessage(args);
     83    case WampMessageType.Invocation:
     84      return new InvocationMessage(args);
     85    case WampMessageType.Interrupt:
     86      return new InterruptMessage(args);
     87    case WampMessageType.Yield:
     88      return new YieldMessage(args);
     89    default:
     90      return null;
     91  }
     92 }
     93 class WampMessage {
     94  constructor(code) {
     95    this.messageCode = code;
     96    this.messageName = WampMessageType[code].toUpperCase();
     97  }
     98 }
     99 class HelloMessage extends WampMessage {
    100  constructor(messageArgs) {
    101    super(WampMessageType.Hello);
    102    [this.realm, this.details] = messageArgs;
    103  }
    104 }
    105 class WelcomeMessage extends WampMessage {
    106  constructor(messageArgs) {
    107    super(WampMessageType.Welcome);
    108    [this.session, this.details] = messageArgs;
    109  }
    110 }
    111 class AbortMessage extends WampMessage {
    112  constructor(messageArgs) {
    113    super(WampMessageType.Abort);
    114    [this.details, this.reason] = messageArgs;
    115  }
    116 }
    117 class ChallengeMessage extends WampMessage {
    118  constructor(messageArgs) {
    119    super(WampMessageType.Challenge);
    120    [this.authMethod, this.extra] = messageArgs;
    121  }
    122 }
    123 class AuthenticateMessage extends WampMessage {
    124  constructor(messageArgs) {
    125    super(WampMessageType.Authenticate);
    126    [this.signature, this.extra] = messageArgs;
    127  }
    128 }
    129 class GoodbyeMessage extends WampMessage {
    130  constructor(messageArgs) {
    131    super(WampMessageType.Goodbye);
    132    [this.details, this.reason] = messageArgs;
    133  }
    134 }
    135 class ErrorMessage extends WampMessage {
    136  constructor(messageArgs) {
    137    super(WampMessageType.Error);
    138    [
    139      this.type,
    140      this.request,
    141      this.details,
    142      this.error,
    143      this.arguments,
    144      this.argumentsKw,
    145    ] = messageArgs;
    146  }
    147 }
    148 class PublishMessage extends WampMessage {
    149  constructor(messageArgs) {
    150    super(WampMessageType.Publish);
    151    [this.request, this.options, this.topic, this.arguments, this.argumentsKw] =
    152      messageArgs;
    153  }
    154 }
    155 class PublishedMessage extends WampMessage {
    156  constructor(messageArgs) {
    157    super(WampMessageType.Published);
    158    [this.request, this.publication] = messageArgs;
    159  }
    160 }
    161 class SubscribeMessage extends WampMessage {
    162  constructor(messageArgs) {
    163    super(WampMessageType.Subscribe);
    164    [this.request, this.options, this.topic] = messageArgs;
    165  }
    166 }
    167 class SubscribedMessage extends WampMessage {
    168  constructor(messageArgs) {
    169    super(WampMessageType.Subscribed);
    170    [this.request, this.subscription] = messageArgs;
    171  }
    172 }
    173 class UnsubscribeMessage extends WampMessage {
    174  constructor(messageArgs) {
    175    super(WampMessageType.Unsubscribe);
    176    [this.request, this.subscription] = messageArgs;
    177  }
    178 }
    179 class UnsubscribedMessage extends WampMessage {
    180  constructor(messageArgs) {
    181    super(WampMessageType.Unsubscribed);
    182    [this.request] = messageArgs;
    183  }
    184 }
    185 class EventMessage extends WampMessage {
    186  constructor(messageArgs) {
    187    super(WampMessageType.Event);
    188    [
    189      this.subscription,
    190      this.publication,
    191      this.details,
    192      this.arguments,
    193      this.argumentsKw,
    194    ] = messageArgs;
    195  }
    196 }
    197 class CallMessage extends WampMessage {
    198  constructor(messageArgs) {
    199    super(WampMessageType.Call);
    200    [
    201      this.request,
    202      this.options,
    203      this.procedure,
    204      this.arguments,
    205      this.argumentsKw,
    206    ] = messageArgs;
    207  }
    208 }
    209 class CancelMessage extends WampMessage {
    210  constructor(messageArgs) {
    211    super(WampMessageType.Cancel);
    212    [this.request, this.options] = messageArgs;
    213  }
    214 }
    215 class ResultMessage extends WampMessage {
    216  constructor(messageArgs) {
    217    super(WampMessageType.Result);
    218    [this.request, this.details, this.arguments, this.argumentsKw] =
    219      messageArgs;
    220  }
    221 }
    222 class RegisterMessage extends WampMessage {
    223  constructor(messageArgs) {
    224    super(WampMessageType.Register);
    225    [this.request, this.options, this.procedure] = messageArgs;
    226  }
    227 }
    228 class RegisteredMessage extends WampMessage {
    229  constructor(messageArgs) {
    230    super(WampMessageType.Registered);
    231    [this.request, this.registration] = messageArgs;
    232  }
    233 }
    234 class UnregisterMessage extends WampMessage {
    235  constructor(messageArgs) {
    236    super(WampMessageType.Unregister);
    237    [this.request, this.registration] = messageArgs;
    238  }
    239 }
    240 class UnregisteredMessage extends WampMessage {
    241  constructor(messageArgs) {
    242    super(WampMessageType.Unregistered);
    243    [this.request] = messageArgs;
    244  }
    245 }
    246 class InvocationMessage extends WampMessage {
    247  constructor(messageArgs) {
    248    super(WampMessageType.Invocation);
    249    [
    250      this.request,
    251      this.registration,
    252      this.details,
    253      this.arguments,
    254      this.argumentsKw,
    255    ] = messageArgs;
    256  }
    257 }
    258 class InterruptMessage extends WampMessage {
    259  constructor(messageArgs) {
    260    super(WampMessageType.Interrupt);
    261    [this.request, this.options] = messageArgs;
    262  }
    263 }
    264 class YieldMessage extends WampMessage {
    265  constructor(messageArgs) {
    266    super(WampMessageType.Yield);
    267    [this.request, this.options, this.arguments, this.argumentsKw] =
    268      messageArgs;
    269  }
    270 }
    271 
    272 module.exports = {
    273  parseWampArray,
    274 };