proteus-js-client
Version:
Proteus JavaScript Client
175 lines (130 loc) • 6.57 kB
JavaScript
/**
* Copyright (c) 2017-present, Netifi Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*
*/
'use strict';
/* eslint-disable consistent-return, no-bitwise */
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.encodeDestinationSetupFrame = encodeDestinationSetupFrame;
exports.decodeDestinationSetupFrame = decodeDestinationSetupFrame;
var _Frame = require('./Frame');
var _FrameHeaderFlyweight = require('./FrameHeaderFlyweight');
var _rsocketCore = require('rsocket-core');
var _ipaddr = require('ipaddr.js');
var _ipaddr2 = _interopRequireDefault(_ipaddr);
var _RSocketBufferUtils = require('rsocket-core/build/RSocketBufferUtils');
var _ConnectionId = require('./ConnectionId');
var _ConnectionId2 = _interopRequireDefault(_ConnectionId);
var _AdditionalFlags = require('./AdditionalFlags');
var _AdditionalFlags2 = _interopRequireDefault(_AdditionalFlags);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var INET_ADDRESS_LENGTH_SIZE = 4;
var GROUP_LENGTH_SIZE = 4;
var ACCESS_KEY_SIZE = 8;
var ACCESS_TOKEN_LENGTH_SIZE = 4;
var CONNECTION_ID_SIZE = 16;
var ADDITIONAL_FLAGS_SIZE = 2;
var KEY_LENGTH_SIZE = 4;
var VALUE_LENGTH_SIZE = 4;
function encodeDestinationSetupFrame(frame) {
var inetAddress = frame.inetAddress != null ? Buffer.from(frame.inetAddress.toByteArray()) : Buffer.alloc(0);
var inetAddressLength = _rsocketCore.BufferEncoder.byteLength(inetAddress);
var groupLength = _rsocketCore.UTF8Encoder.byteLength(frame.group);
var accessTokenLength = _rsocketCore.BufferEncoder.byteLength(frame.accessToken);
var tagsLength = Object.entries(frame.tags).reduce(function (acc, _ref) {
var key = _ref[0],
value = _ref[1];
var keyLength = _rsocketCore.UTF8Encoder.byteLength(key);
var valueLength = _rsocketCore.UTF8Encoder.byteLength(value);
return acc + KEY_LENGTH_SIZE + keyLength + VALUE_LENGTH_SIZE + valueLength;
}, 0);
var buffer = (0, _rsocketCore.createBuffer)(_FrameHeaderFlyweight.FRAME_HEADER_SIZE + INET_ADDRESS_LENGTH_SIZE + inetAddressLength + GROUP_LENGTH_SIZE + groupLength + CONNECTION_ID_SIZE + ACCESS_KEY_SIZE + ACCESS_TOKEN_LENGTH_SIZE + accessTokenLength + ADDITIONAL_FLAGS_SIZE + tagsLength);
var offset = (0, _FrameHeaderFlyweight.encodeFrameHeader)(buffer, frame);
offset = buffer.writeUInt32BE(inetAddressLength, offset);
offset = _rsocketCore.BufferEncoder.encode(inetAddress, buffer, offset, offset + inetAddressLength);
offset = buffer.writeUInt32BE(groupLength, offset);
offset = _rsocketCore.UTF8Encoder.encode(frame.group, buffer, offset, offset + groupLength);
offset = (0, _RSocketBufferUtils.writeUInt64BE)(buffer, frame.accessKey, offset);
offset = buffer.writeUInt32BE(accessTokenLength, offset);
offset = _rsocketCore.BufferEncoder.encode(frame.accessToken, buffer, offset, offset + accessTokenLength);
offset = _rsocketCore.BufferEncoder.encode(Buffer.from(frame.connectionId.bytes()), buffer, offset, offset + CONNECTION_ID_SIZE);
offset = _rsocketCore.BufferEncoder.encode(Buffer.from(frame.additionalFlags.bytes()), buffer, offset, offset + ADDITIONAL_FLAGS_SIZE);
Object.entries(frame.tags).forEach(function (_ref2) {
var key = _ref2[0],
value = _ref2[1];
var keyLength = _rsocketCore.UTF8Encoder.byteLength(key);
var valueLength = _rsocketCore.UTF8Encoder.byteLength(value);
offset = buffer.writeUInt32BE(keyLength, offset);
offset = _rsocketCore.UTF8Encoder.encode(key, buffer, offset, offset + keyLength);
offset = buffer.writeUInt32BE(valueLength, offset);
offset = _rsocketCore.UTF8Encoder.encode(value, buffer, offset, offset + valueLength);
});
return buffer;
}
function decodeDestinationSetupFrame(buffer, majorVersion, minorVersion) {
var offset = _FrameHeaderFlyweight.FRAME_HEADER_SIZE;
var inetAddressLength = buffer.readUInt32BE(offset);
offset += INET_ADDRESS_LENGTH_SIZE;
var inetAddress = null;
if (inetAddressLength > 0) {
inetAddress = _ipaddr2.default.fromByteArray(_rsocketCore.BufferEncoder.decode(buffer, offset, offset + inetAddressLength));
offset += inetAddressLength;
}
var groupLength = buffer.readUInt32BE(offset);
offset += GROUP_LENGTH_SIZE;
var group = _rsocketCore.UTF8Encoder.decode(buffer, offset, offset + groupLength);
offset += groupLength;
var accessKey = (0, _RSocketBufferUtils.readUInt64BE)(buffer, offset);
offset += ACCESS_KEY_SIZE;
var accessTokenLength = buffer.readUInt32BE(offset);
offset += ACCESS_TOKEN_LENGTH_SIZE;
var accessToken = _rsocketCore.BufferEncoder.decode(buffer, offset, offset + accessTokenLength);
offset += accessTokenLength;
var connectionIdBuffer = _rsocketCore.BufferEncoder.decode(buffer, offset, offset + CONNECTION_ID_SIZE);
var connectionIdBytes = Uint8Array.from(connectionIdBuffer);
var connectionId = _ConnectionId2.default.fromBytes(connectionIdBytes);
offset += CONNECTION_ID_SIZE;
var additionalFlagBuffer = _rsocketCore.BufferEncoder.decode(buffer, offset, offset + ADDITIONAL_FLAGS_SIZE);
var additionalFlagSum = additionalFlagBuffer.readIntBE(0, 2);
var additionalFlags = _AdditionalFlags2.default.fromSum(additionalFlagSum);
offset += ADDITIONAL_FLAGS_SIZE;
var tags = {};
while (offset < buffer.length) {
var keyLength = buffer.readUInt32BE(offset);
offset += KEY_LENGTH_SIZE;
var key = _rsocketCore.UTF8Encoder.decode(buffer, offset, offset + keyLength);
offset += keyLength;
var valueLength = buffer.readUInt32BE(offset);
offset += VALUE_LENGTH_SIZE;
var value = _rsocketCore.UTF8Encoder.decode(buffer, offset, offset + valueLength);
offset += valueLength;
tags[key] = value;
}
return {
type: _Frame.FrameTypes.DESTINATION_SETUP,
majorVersion: majorVersion,
minorVersion: minorVersion,
inetAddress: inetAddress,
group: group,
connectionId: connectionId,
accessKey: accessKey,
accessToken: accessToken,
additionalFlags: additionalFlags,
tags: tags
};
}