summaryrefslogtreecommitdiffstats
path: root/devtools/client/netmonitor/src/components/messages/parsers/wamp
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/netmonitor/src/components/messages/parsers/wamp')
-rw-r--r--devtools/client/netmonitor/src/components/messages/parsers/wamp/arrayParser.js274
-rw-r--r--devtools/client/netmonitor/src/components/messages/parsers/wamp/moz.build8
-rw-r--r--devtools/client/netmonitor/src/components/messages/parsers/wamp/serializers.js73
3 files changed, 355 insertions, 0 deletions
diff --git a/devtools/client/netmonitor/src/components/messages/parsers/wamp/arrayParser.js b/devtools/client/netmonitor/src/components/messages/parsers/wamp/arrayParser.js
new file mode 100644
index 0000000000..de73a7986c
--- /dev/null
+++ b/devtools/client/netmonitor/src/components/messages/parsers/wamp/arrayParser.js
@@ -0,0 +1,274 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+// An implementation for WAMP messages parsing https://wamp-proto.org/
+var WampMessageType;
+(function (wampMessageTypeEnum) {
+ wampMessageTypeEnum[(wampMessageTypeEnum.Hello = 1)] = "Hello";
+ wampMessageTypeEnum[(wampMessageTypeEnum.Welcome = 2)] = "Welcome";
+ wampMessageTypeEnum[(wampMessageTypeEnum.Abort = 3)] = "Abort";
+ wampMessageTypeEnum[(wampMessageTypeEnum.Challenge = 4)] = "Challenge";
+ wampMessageTypeEnum[(wampMessageTypeEnum.Authenticate = 5)] = "Authenticate";
+ wampMessageTypeEnum[(wampMessageTypeEnum.Goodbye = 6)] = "Goodbye";
+ wampMessageTypeEnum[(wampMessageTypeEnum.Error = 8)] = "Error";
+ wampMessageTypeEnum[(wampMessageTypeEnum.Publish = 16)] = "Publish";
+ wampMessageTypeEnum[(wampMessageTypeEnum.Published = 17)] = "Published";
+ wampMessageTypeEnum[(wampMessageTypeEnum.Subscribe = 32)] = "Subscribe";
+ wampMessageTypeEnum[(wampMessageTypeEnum.Subscribed = 33)] = "Subscribed";
+ wampMessageTypeEnum[(wampMessageTypeEnum.Unsubscribe = 34)] = "Unsubscribe";
+ wampMessageTypeEnum[(wampMessageTypeEnum.Unsubscribed = 35)] = "Unsubscribed";
+ wampMessageTypeEnum[(wampMessageTypeEnum.Event = 36)] = "Event";
+ wampMessageTypeEnum[(wampMessageTypeEnum.Call = 48)] = "Call";
+ wampMessageTypeEnum[(wampMessageTypeEnum.Cancel = 49)] = "Cancel";
+ wampMessageTypeEnum[(wampMessageTypeEnum.Result = 50)] = "Result";
+ wampMessageTypeEnum[(wampMessageTypeEnum.Register = 64)] = "Register";
+ wampMessageTypeEnum[(wampMessageTypeEnum.Registered = 65)] = "Registered";
+ wampMessageTypeEnum[(wampMessageTypeEnum.Unregister = 66)] = "Unregister";
+ wampMessageTypeEnum[(wampMessageTypeEnum.Unregistered = 67)] = "Unregistered";
+ wampMessageTypeEnum[(wampMessageTypeEnum.Invocation = 68)] = "Invocation";
+ wampMessageTypeEnum[(wampMessageTypeEnum.Interrupt = 69)] = "Interrupt";
+ wampMessageTypeEnum[(wampMessageTypeEnum.Yield = 70)] = "Yield";
+})(WampMessageType || (WampMessageType = {}));
+
+// The WAMP protocol consists of many messages, disable complexity for one time
+// eslint-disable-next-line complexity
+function parseWampArray(messageArray) {
+ const [messageType, ...args] = messageArray;
+ switch (messageType) {
+ case WampMessageType.Hello:
+ return new HelloMessage(args);
+ case WampMessageType.Welcome:
+ return new WelcomeMessage(args);
+ case WampMessageType.Abort:
+ return new AbortMessage(args);
+ case WampMessageType.Challenge:
+ return new ChallengeMessage(args);
+ case WampMessageType.Authenticate:
+ return new AuthenticateMessage(args);
+ case WampMessageType.Goodbye:
+ return new GoodbyeMessage(args);
+ case WampMessageType.Error:
+ return new ErrorMessage(args);
+ case WampMessageType.Publish:
+ return new PublishMessage(args);
+ case WampMessageType.Published:
+ return new PublishedMessage(args);
+ case WampMessageType.Subscribe:
+ return new SubscribeMessage(args);
+ case WampMessageType.Subscribed:
+ return new SubscribedMessage(args);
+ case WampMessageType.Unsubscribe:
+ return new UnsubscribeMessage(args);
+ case WampMessageType.Unsubscribed:
+ return new UnsubscribedMessage(args);
+ case WampMessageType.Event:
+ return new EventMessage(args);
+ case WampMessageType.Call:
+ return new CallMessage(args);
+ case WampMessageType.Cancel:
+ return new CancelMessage(args);
+ case WampMessageType.Result:
+ return new ResultMessage(args);
+ case WampMessageType.Register:
+ return new RegisterMessage(args);
+ case WampMessageType.Registered:
+ return new RegisteredMessage(args);
+ case WampMessageType.Unregister:
+ return new UnregisterMessage(args);
+ case WampMessageType.Unregistered:
+ return new UnregisteredMessage(args);
+ case WampMessageType.Invocation:
+ return new InvocationMessage(args);
+ case WampMessageType.Interrupt:
+ return new InterruptMessage(args);
+ case WampMessageType.Yield:
+ return new YieldMessage(args);
+ default:
+ return null;
+ }
+}
+class WampMessage {
+ constructor(code) {
+ this.messageCode = code;
+ this.messageName = WampMessageType[code].toUpperCase();
+ }
+}
+class HelloMessage extends WampMessage {
+ constructor(messageArgs) {
+ super(WampMessageType.Hello);
+ [this.realm, this.details] = messageArgs;
+ }
+}
+class WelcomeMessage extends WampMessage {
+ constructor(messageArgs) {
+ super(WampMessageType.Welcome);
+ [this.session, this.details] = messageArgs;
+ }
+}
+class AbortMessage extends WampMessage {
+ constructor(messageArgs) {
+ super(WampMessageType.Abort);
+ [this.details, this.reason] = messageArgs;
+ }
+}
+class ChallengeMessage extends WampMessage {
+ constructor(messageArgs) {
+ super(WampMessageType.Challenge);
+ [this.authMethod, this.extra] = messageArgs;
+ }
+}
+class AuthenticateMessage extends WampMessage {
+ constructor(messageArgs) {
+ super(WampMessageType.Authenticate);
+ [this.signature, this.extra] = messageArgs;
+ }
+}
+class GoodbyeMessage extends WampMessage {
+ constructor(messageArgs) {
+ super(WampMessageType.Goodbye);
+ [this.details, this.reason] = messageArgs;
+ }
+}
+class ErrorMessage extends WampMessage {
+ constructor(messageArgs) {
+ super(WampMessageType.Error);
+ [
+ this.type,
+ this.request,
+ this.details,
+ this.error,
+ this.arguments,
+ this.argumentsKw,
+ ] = messageArgs;
+ }
+}
+class PublishMessage extends WampMessage {
+ constructor(messageArgs) {
+ super(WampMessageType.Publish);
+ [this.request, this.options, this.topic, this.arguments, this.argumentsKw] =
+ messageArgs;
+ }
+}
+class PublishedMessage extends WampMessage {
+ constructor(messageArgs) {
+ super(WampMessageType.Published);
+ [this.request, this.publication] = messageArgs;
+ }
+}
+class SubscribeMessage extends WampMessage {
+ constructor(messageArgs) {
+ super(WampMessageType.Subscribe);
+ [this.request, this.options, this.topic] = messageArgs;
+ }
+}
+class SubscribedMessage extends WampMessage {
+ constructor(messageArgs) {
+ super(WampMessageType.Subscribed);
+ [this.request, this.subscription] = messageArgs;
+ }
+}
+class UnsubscribeMessage extends WampMessage {
+ constructor(messageArgs) {
+ super(WampMessageType.Unsubscribe);
+ [this.request, this.subscription] = messageArgs;
+ }
+}
+class UnsubscribedMessage extends WampMessage {
+ constructor(messageArgs) {
+ super(WampMessageType.Unsubscribed);
+ [this.request] = messageArgs;
+ }
+}
+class EventMessage extends WampMessage {
+ constructor(messageArgs) {
+ super(WampMessageType.Event);
+ [
+ this.subscription,
+ this.publication,
+ this.details,
+ this.arguments,
+ this.argumentsKw,
+ ] = messageArgs;
+ }
+}
+class CallMessage extends WampMessage {
+ constructor(messageArgs) {
+ super(WampMessageType.Call);
+ [
+ this.request,
+ this.options,
+ this.procedure,
+ this.arguments,
+ this.argumentsKw,
+ ] = messageArgs;
+ }
+}
+class CancelMessage extends WampMessage {
+ constructor(messageArgs) {
+ super(WampMessageType.Cancel);
+ [this.request, this.options] = messageArgs;
+ }
+}
+class ResultMessage extends WampMessage {
+ constructor(messageArgs) {
+ super(WampMessageType.Result);
+ [this.request, this.details, this.arguments, this.argumentsKw] =
+ messageArgs;
+ }
+}
+class RegisterMessage extends WampMessage {
+ constructor(messageArgs) {
+ super(WampMessageType.Register);
+ [this.request, this.options, this.procedure] = messageArgs;
+ }
+}
+class RegisteredMessage extends WampMessage {
+ constructor(messageArgs) {
+ super(WampMessageType.Registered);
+ [this.request, this.registration] = messageArgs;
+ }
+}
+class UnregisterMessage extends WampMessage {
+ constructor(messageArgs) {
+ super(WampMessageType.Unregister);
+ [this.request, this.registration] = messageArgs;
+ }
+}
+class UnregisteredMessage extends WampMessage {
+ constructor(messageArgs) {
+ super(WampMessageType.Unregistered);
+ [this.request] = messageArgs;
+ }
+}
+class InvocationMessage extends WampMessage {
+ constructor(messageArgs) {
+ super(WampMessageType.Invocation);
+ [
+ this.request,
+ this.registration,
+ this.details,
+ this.arguments,
+ this.argumentsKw,
+ ] = messageArgs;
+ }
+}
+class InterruptMessage extends WampMessage {
+ constructor(messageArgs) {
+ super(WampMessageType.Interrupt);
+ [this.request, this.options] = messageArgs;
+ }
+}
+class YieldMessage extends WampMessage {
+ constructor(messageArgs) {
+ super(WampMessageType.Yield);
+ [this.request, this.options, this.arguments, this.argumentsKw] =
+ messageArgs;
+ }
+}
+
+module.exports = {
+ parseWampArray,
+};
diff --git a/devtools/client/netmonitor/src/components/messages/parsers/wamp/moz.build b/devtools/client/netmonitor/src/components/messages/parsers/wamp/moz.build
new file mode 100644
index 0000000000..b6b7c91036
--- /dev/null
+++ b/devtools/client/netmonitor/src/components/messages/parsers/wamp/moz.build
@@ -0,0 +1,8 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DevToolsModules(
+ "arrayParser.js",
+ "serializers.js",
+)
diff --git a/devtools/client/netmonitor/src/components/messages/parsers/wamp/serializers.js b/devtools/client/netmonitor/src/components/messages/parsers/wamp/serializers.js
new file mode 100644
index 0000000000..c2139d320c
--- /dev/null
+++ b/devtools/client/netmonitor/src/components/messages/parsers/wamp/serializers.js
@@ -0,0 +1,73 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+const {
+ parseWampArray,
+} = require("resource://devtools/client/netmonitor/src/components/messages/parsers/wamp/arrayParser.js");
+const msgpack = require("resource://devtools/client/netmonitor/src/components/messages/msgpack.js");
+const cbor = require("resource://devtools/client/netmonitor/src/components/messages/cbor.js");
+
+class WampSerializer {
+ deserializeMessage(payload) {
+ const array = this.deserializeToArray(payload);
+ const result = parseWampArray(array);
+ return result;
+ }
+
+ stringToBinary(str) {
+ const result = new Uint8Array(str.length);
+ for (let i = 0; i < str.length; i++) {
+ result[i] = str[i].charCodeAt(0);
+ }
+ return result;
+ }
+}
+
+class JsonSerializer extends WampSerializer {
+ constructor() {
+ super(...arguments);
+ this.subProtocol = "wamp.2.json";
+ this.description = "WAMP JSON";
+ }
+ deserializeToArray(payload) {
+ return JSON.parse(payload);
+ }
+}
+
+class MessagePackSerializer extends WampSerializer {
+ constructor() {
+ super(...arguments);
+ this.subProtocol = "wamp.2.msgpack";
+ this.description = "WAMP MessagePack";
+ }
+ deserializeToArray(payload) {
+ const binary = this.stringToBinary(payload);
+ return msgpack.deserialize(binary);
+ }
+}
+
+class CBORSerializer extends WampSerializer {
+ constructor() {
+ super(...arguments);
+ this.subProtocol = "wamp.2.cbor";
+ this.description = "WAMP CBOR";
+ }
+ deserializeToArray(payload) {
+ const binaryBuffer = this.stringToBinary(payload).buffer;
+ return cbor.decode(binaryBuffer);
+ }
+}
+
+const serializers = {};
+for (var serializer of [
+ new JsonSerializer(),
+ new MessagePackSerializer(),
+ new CBORSerializer(),
+]) {
+ serializers[serializer.subProtocol] = serializer;
+}
+
+module.exports = { wampSerializers: serializers };