UNPKG

proteus-js-client

Version:

Proteus JavaScript Client

175 lines (130 loc) 6.57 kB
/** * 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 }; }