-
Notifications
You must be signed in to change notification settings - Fork 367
/
NetMqExtensions.cs
50 lines (40 loc) · 1.65 KB
/
NetMqExtensions.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using Microsoft.DotNet.Interactive.Jupyter.Messaging;
using NetMQ;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Microsoft.DotNet.Interactive.Jupyter.ZMQ;
public static class NetMQExtensions
{
public static Message GetMessage(this NetMQSocket socket)
{
// There may be additional ZMQ identities attached; read until the delimiter <IDS|MSG>"
// and store them in message.identifiers
// http://ipython.org/ipython-doc/dev/development/messaging.html#the-wire-protocol
var delimiterAsBytes = Encoding.ASCII.GetBytes(Constants.DELIMITER);
var identifiers = new List<byte[]>();
while (true)
{
var delimiter = socket.ReceiveFrameBytes();
if (delimiter.SequenceEqual(delimiterAsBytes))
{
break;
}
identifiers.Add(delimiter);
}
// Getting Hmac
var signature = socket.ReceiveFrameString();
// Getting Header
var headerJson = socket.ReceiveFrameString();
// Getting parent header
var parentHeaderJson = socket.ReceiveFrameString();
// Getting metadata
var metadataJson = socket.ReceiveFrameString();
// Getting content
var contentJson = socket.ReceiveFrameString();
var message = MessageExtensions.DeserializeMessage(signature, headerJson, parentHeaderJson, metadataJson, contentJson, identifiers);
return message;
}
}