IGNITE-11597 Fix for Node.js thin client UUID marshalling

Co-Authored-By: Ruslan Ragimov <ruslan.ragimov@nobitlost.com>
Co-Authored-By: ekaterina-nbl <ekaterina.vergizova@nobitlost.com>
Co-Authored-By: sergey-nbl <sergey.nazarkin@nobitlost.com>
Co-Authored-By: dmelnichuk <39872028+dmelnichuk@users.noreply.github.com>
Co-Authored-By: snork-nbl <snork@nobitlost.com>
Co-Authored-By: Pavel Petroshenko <pavel@petroshenko.com>
Co-Authored-By: alexey-nbl <alexey.kosenchuk@nobitlost.com>

This closes #6527
diff --git a/examples/CachePutGetExample.js b/examples/CachePutGetExample.js
index 94060bd..b37f573 100644
--- a/examples/CachePutGetExample.js
+++ b/examples/CachePutGetExample.js
@@ -62,7 +62,7 @@
     constructor() {
         this._personCache = null;
         this._personObjectType = null;
-        this._binaryObjectCache = null; 
+        this._binaryObjectCache = null;
     }
 
     async start() {
@@ -127,7 +127,7 @@
             new CacheEntry(await personBinaryObject1.getField('id'), personBinaryObject1),
             new CacheEntry(await personBinaryObject2.getField('id'), personBinaryObject2)
         ]);
-        
+
         console.log('Binary Objects put successfully using putAll()');
     }
 
@@ -138,7 +138,7 @@
             this.printPersonObject(person.getValue());
         }
     }
-    
+
     async getBinaryObjects() {
         const personBinaryObject = await this._binaryObjectCache.get(3);
         console.log('Binary Object get:');
diff --git a/lib/BinaryObject.js b/lib/BinaryObject.js
index 9be60da..478dbaf 100644
--- a/lib/BinaryObject.js
+++ b/lib/BinaryObject.js
@@ -491,7 +491,7 @@
         else if (offset < 0x10000) {
             return BinaryUtils.TYPE_CODE.SHORT;
         }
-        return BinaryUtils.TYPE_CODE.INTEGER;        
+        return BinaryUtils.TYPE_CODE.INTEGER;
     }
 
     static _fromBuffer(communicator, buffer, offset, length, id) {
diff --git a/lib/CacheClient.js b/lib/CacheClient.js
index f59910b..fad8e71 100644
--- a/lib/CacheClient.js
+++ b/lib/CacheClient.js
@@ -729,7 +729,7 @@
      * @param {*} key - key corresponding to this entry.
      * @param {*} value - value associated with the key.
      *
-     * @return {CacheEntry} - new CacheEntry instance     
+     * @return {CacheEntry} - new CacheEntry instance
      */
     constructor(key, value) {
         this._key = key;
diff --git a/lib/CacheConfiguration.js b/lib/CacheConfiguration.js
index ccf20b9..75f0155 100644
--- a/lib/CacheConfiguration.js
+++ b/lib/CacheConfiguration.js
@@ -29,7 +29,7 @@
  *
  * All configuration settings are optional and have defaults which are defined on a server side.
  *
- * See Apache Ignite documentation for details of every configuration setting. 
+ * See Apache Ignite documentation for details of every configuration setting.
  */
 class CacheKeyConfiguration {
 
@@ -112,7 +112,7 @@
  *
  * All configuration settings are optional and have defaults which are defined on a server side.
  *
- * See Apache Ignite documentation for details of every configuration setting. 
+ * See Apache Ignite documentation for details of every configuration setting.
  */
 class QueryEntity {
 
@@ -238,7 +238,7 @@
     }
 
     /**
-     * 
+     *
      *
      * @param {Array<QueryField>} fields
      *
@@ -250,7 +250,7 @@
     }
 
     /**
-     * 
+     *
      *
      * @return {Array<QueryField>}
      */
@@ -259,7 +259,7 @@
     }
 
     /**
-     * 
+     *
      *
      * @param {Map<string, string>} aliases
      *
@@ -271,7 +271,7 @@
     }
 
     /**
-     * 
+     *
      *
      * @return {Map<string, string>}
      */
@@ -280,7 +280,7 @@
     }
 
     /**
-     * 
+     *
      *
      * @param {Array<QueryIndex>} indexes
      *
@@ -292,7 +292,7 @@
     }
 
     /**
-     * 
+     *
      *
      * @return {Array<QueryIndex>}
      */
@@ -394,7 +394,7 @@
  *
  * All configuration settings are optional and have defaults which are defined on a server side.
  *
- * See Apache Ignite documentation for details of every configuration setting. 
+ * See Apache Ignite documentation for details of every configuration setting.
  */
 class QueryField {
 
@@ -629,7 +629,7 @@
 }
 
 /**
- * 
+ *
  * @typedef QueryIndex.INDEX_TYPE
  * @enum
  * @readonly
@@ -648,10 +648,10 @@
  *
  * All configuration settings are optional and have defaults which are defined on a server side.
  *
- * See Apache Ignite documentation for details of every configuration setting. 
+ * See Apache Ignite documentation for details of every configuration setting.
  */
 class QueryIndex {
-    
+
     /**
      * Public constructor.
      *
@@ -738,7 +738,7 @@
     }
 
     /**
-     * 
+     *
      *
      * @param {Map<string, boolean>} fields
      *
@@ -750,7 +750,7 @@
     }
 
     /**
-     * 
+     *
      *
      * @return {Map<string, boolean>}
      */
@@ -862,7 +862,7 @@
 });
 
 /**
- * 
+ *
  * @typedef CacheConfiguration.CACHE_ATOMICITY_MODE
  * @enum
  * @readonly
@@ -875,7 +875,7 @@
 });
 
 /**
- * 
+ *
  * @typedef CacheConfiguration.CACHE_MODE
  * @enum
  * @readonly
@@ -890,7 +890,7 @@
 });
 
 /**
- * 
+ *
  * @typedef CacheConfiguration.PARTITION_LOSS_POLICY
  * @enum
  * @readonly
@@ -909,7 +909,7 @@
 });
 
 /**
- * 
+ *
  * @typedef CacheConfiguration.REABALANCE_MODE
  * @enum
  * @readonly
@@ -924,7 +924,7 @@
 });
 
 /**
- * 
+ *
  * @typedef CacheConfiguration.WRITE_SYNCHRONIZATION_MODE
  * @enum
  * @readonly
@@ -943,7 +943,7 @@
  *
  * All configuration settings are optional and have defaults which are defined on a server side.
  *
- * See Apache Ignite documentation for details of every configuration setting. 
+ * See Apache Ignite documentation for details of every configuration setting.
  */
 class CacheConfiguration {
 
@@ -1559,7 +1559,7 @@
     }
 
     /**
-     * 
+     *
      *
      * @param {...CacheKeyConfiguration} keyConfigurations
      *
@@ -1574,7 +1574,7 @@
     }
 
     /**
-     * 
+     *
      *
      * @return {Array<CacheKeyConfiguration>}
      */
@@ -1583,7 +1583,7 @@
     }
 
     /**
-     * 
+     *
      *
      * @param {...QueryEntity} queryEntities
      *
@@ -1598,7 +1598,7 @@
     }
 
     /**
-     * 
+     *
      *
      * @return {Array<QueryEntity>}
      */
diff --git a/lib/IgniteClient.js b/lib/IgniteClient.js
index 544c37f..1974352 100644
--- a/lib/IgniteClient.js
+++ b/lib/IgniteClient.js
@@ -53,7 +53,7 @@
 
 /**
  * Class representing Ignite client.
- * 
+ *
  */
 class IgniteClient {
 
diff --git a/lib/ObjectType.js b/lib/ObjectType.js
index f1facfd..00c4d56 100644
--- a/lib/ObjectType.js
+++ b/lib/ObjectType.js
@@ -109,7 +109,7 @@
     COMPLEX_OBJECT : 103
 });
 
-/** 
+/**
  * Base class representing a type of Ignite object.
  *
  * The class has no public constructor. Only subclasses may be instantiated.
@@ -351,8 +351,8 @@
      * If key and/or value type is not specified then during operations the Ignite client
      * will try to make automatic mapping between JavaScript types and Ignite object types -
      * according to the mapping table defined in the description of the {@link ObjectType} class.
-     * 
-     * @param {MapObjectType.MAP_SUBTYPE} [mapSubType=MAP_SUBTYPE.HASH_MAP] - map subtype, one of the 
+     *
+     * @param {MapObjectType.MAP_SUBTYPE} [mapSubType=MAP_SUBTYPE.HASH_MAP] - map subtype, one of the
      *   {@link MapObjectType.MAP_SUBTYPE} constants.
      * @param {ObjectType.PRIMITIVE_TYPE | CompositeType} [keyType=null] - type of the keys in the map:
      *   - either a type code of primitive (simple) type
@@ -424,8 +424,8 @@
      * If the type of elements is not specified then during operations the Ignite client
      * will try to make automatic mapping between JavaScript types and Ignite object types -
      * according to the mapping table defined in the description of the {@link ObjectType} class.
-     * 
-     * @param {CollectionObjectType.COLLECTION_SUBTYPE} collectionSubType - collection subtype, one of the 
+     *
+     * @param {CollectionObjectType.COLLECTION_SUBTYPE} collectionSubType - collection subtype, one of the
      *  {@link CollectionObjectType.COLLECTION_SUBTYPE} constants.
      * @param {ObjectType.PRIMITIVE_TYPE | CompositeType} [elementType=null] - type of elements in the collection:
      *   - either a type code of primitive (simple) type
@@ -529,7 +529,7 @@
      *
      * By default, the name of the complex type is the name of the JavaScript Object.
      * The name may be explicitely specified using optional typeName parameter in the constructor.
-     * 
+     *
      * @param {object} jsObject - instance of JavaScript Object which will be mapped to/from this complex type.
      * @param {string} [typeName] - name of the complex type.
      *
@@ -560,7 +560,7 @@
      * If the type is not specified then during operations the Ignite client
      * will try to make automatic mapping between JavaScript types and Ignite object types -
      * according to the mapping table defined in the description of the {@link ObjectType} class.
-     * 
+     *
      * @param {string} fieldName - name of the field.
      * @param {ObjectType.PRIMITIVE_TYPE | CompositeType} fieldType - type of the field:
      *   - either a type code of primitive (simple) type
diff --git a/lib/Query.js b/lib/Query.js
index 029ec3d..d3f6f87 100644
--- a/lib/Query.js
+++ b/lib/Query.js
@@ -469,7 +469,7 @@
     /**
      * Sets a partition number over which this query should iterate.
      *
-     * If negative, the query will iterate over all partitions in the cache. 
+     * If negative, the query will iterate over all partitions in the cache.
      *
      * @param {number} partitionNumber - partition number over which this query should iterate.
      *
diff --git a/lib/internal/BinaryCommunicator.js b/lib/internal/BinaryCommunicator.js
index 9418d36..20ddcff 100644
--- a/lib/internal/BinaryCommunicator.js
+++ b/lib/internal/BinaryCommunicator.js
@@ -51,7 +51,7 @@
             buffer.writeString(value);
         }
     }
-    
+
     async send(opCode, payloadWriter, payloadReader = null) {
         await this._socket.send(opCode, payloadWriter, payloadReader);
     }
@@ -218,7 +218,7 @@
     }
 
     _readUUID(buffer) {
-        return [...buffer.readBuffer(BinaryUtils.getSize(BinaryUtils.TYPE_CODE.UUID))];
+        return [...buffer.readBuffer(BinaryUtils.getSize(BinaryUtils.TYPE_CODE.UUID)).swap64()];
     }
 
     async _readEnum(buffer) {
@@ -314,7 +314,7 @@
     }
 
     _writeUUID(buffer, value) {
-        buffer.writeBuffer(Buffer.from(value));
+        buffer.writeBuffer(Buffer.from(value).swap64());
     }
 
     async _writeEnum(buffer, enumValue) {
diff --git a/lib/internal/BinaryType.js b/lib/internal/BinaryType.js
index a111ed0..4a36426 100644
--- a/lib/internal/BinaryType.js
+++ b/lib/internal/BinaryType.js
@@ -393,7 +393,7 @@
             result._fromComplexObjectType(complexObjectType, jsObject);
             BinaryTypeStorage.setByComplexObjectType(complexObjectType, result._type, result._schema);
         }
-        return result;        
+        return result;
     }
 
     getTypeId() {
diff --git a/lib/internal/ClientFailoverSocket.js b/lib/internal/ClientFailoverSocket.js
index 3ef9c76..770c5c6 100644
--- a/lib/internal/ClientFailoverSocket.js
+++ b/lib/internal/ClientFailoverSocket.js
@@ -60,7 +60,7 @@
     }
 
     async _onSocketDisconnect(error = null) {
-        this._changeState(IgniteClient.STATE.CONNECTING, null, error);        
+        this._changeState(IgniteClient.STATE.CONNECTING, null, error);
         this._socket = null;
         this._endpointIndex++;
         try {
diff --git a/lib/internal/MessageBuffer.js b/lib/internal/MessageBuffer.js
index b3be7e9..e282967 100644
--- a/lib/internal/MessageBuffer.js
+++ b/lib/internal/MessageBuffer.js
@@ -115,7 +115,7 @@
                         this._buffer.writeInt8(value, this._position);
                     }
                     else {
-                        this._buffer.writeUInt8(value, this._position);   
+                        this._buffer.writeUInt8(value, this._position);
                     }
                     break;
                 case BinaryUtils.TYPE_CODE.SHORT:
@@ -123,7 +123,7 @@
                         this._buffer.writeInt16LE(value, this._position);
                     }
                     else {
-                        this._buffer.writeUInt16LE(value, this._position);   
+                        this._buffer.writeUInt16LE(value, this._position);
                     }
                     break;
                 case BinaryUtils.TYPE_CODE.INTEGER:
@@ -131,7 +131,7 @@
                         this._buffer.writeInt32LE(value, this._position);
                     }
                     else {
-                        this._buffer.writeUInt32LE(value, this._position);   
+                        this._buffer.writeUInt32LE(value, this._position);
                     }
                     break;
                 case BinaryUtils.TYPE_CODE.FLOAT:
@@ -260,7 +260,7 @@
         if (end === undefined) {
             end = buffer.length;
         }
-        const size = end - start; 
+        const size = end - start;
         this._ensureCapacity(size);
         buffer.copy(this._buffer, this._position, start, end);
         this._position += size;
diff --git a/package.json b/package.json
index 4ffb809..cca390e 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,22 @@
 {
   "name": "apache-ignite-client",
-  "version": "1.0.0",
-  "description": "",
+  "version": "1.0.1",
+  "description": "NodeJS Client for Apache Ignite",
   "main": "index.js",
+  "files": [
+    "/examples",
+    "/lib",
+    "index.js"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/apache/ignite/tree/master/modules/platforms/nodejs"
+  },
+  "keywords": [
+    "apache",
+    "ignite",
+    "client"
+  ],
   "author": "",
   "license": "Apache-2.0",
   "engines": {
diff --git a/spec/TestingHelper.js b/spec/TestingHelper.js
index 78df0cb..25465bb 100644
--- a/spec/TestingHelper.js
+++ b/spec/TestingHelper.js
@@ -62,7 +62,7 @@
 const timestampValueModificator = (data) => { return new Timestamp(new Date(data.getTime() + 12345), data.getNanos() + 123); };
 
 const primitiveValues = {
-    [ObjectType.PRIMITIVE_TYPE.BYTE] : { 
+    [ObjectType.PRIMITIVE_TYPE.BYTE] : {
         values : [-128, 0, 127],
         isMapKey : true,
         modificator : numericValueModificator
@@ -385,7 +385,7 @@
             }
             return true;
         }
-    }    
+    }
 }
 
 module.exports = TestingHelper;
diff --git a/spec/cache/CachePutGetDiffTypes.spec.js b/spec/cache/CachePutGetDiffTypes.spec.js
index a6e1bba..5fd370e 100644
--- a/spec/cache/CachePutGetDiffTypes.spec.js
+++ b/spec/cache/CachePutGetDiffTypes.spec.js
@@ -132,7 +132,7 @@
                             map);
                         await putGetMaps(
                             new MapObjectType(
-                                MapObjectType.MAP_SUBTYPE.LINKED_HASH_MAP, type1, type2), 
+                                MapObjectType.MAP_SUBTYPE.LINKED_HASH_MAP, type1, type2),
                             map);
                         if (typeInfo1.typeOptional) {
                             await putGetMaps(new MapObjectType(MapObjectType.MAP_SUBTYPE.HASH_MAP, null, type2),
@@ -177,7 +177,7 @@
                             new MapObjectType(MapObjectType.MAP_SUBTYPE.HASH_MAP, type1, type2),
                             map);
                         await putGetMaps(
-                            new MapObjectType(MapObjectType.MAP_SUBTYPE.LINKED_HASH_MAP, type1, type2), 
+                            new MapObjectType(MapObjectType.MAP_SUBTYPE.LINKED_HASH_MAP, type1, type2),
                             map);
                         if (typeInfo1.typeOptional) {
                             await putGetMaps(new MapObjectType(MapObjectType.MAP_SUBTYPE.HASH_MAP, null, type2),
@@ -284,14 +284,14 @@
                             map = new Map([...map.entries()].map(([key, value]) => [typeInfo1.modificator(key), typeInfo2.modificator(value)]));
                             array.push(map);
                         }
-                        await putGetObjectArrays(new ObjectArrayType(new MapObjectType(MapObjectType.MAP_SUBTYPE.HASH_MAP, type1, type2)), 
+                        await putGetObjectArrays(new ObjectArrayType(new MapObjectType(MapObjectType.MAP_SUBTYPE.HASH_MAP, type1, type2)),
                             array);
                         if (typeInfo1.typeOptional) {
-                            await putGetObjectArrays(new ObjectArrayType(new MapObjectType(MapObjectType.MAP_SUBTYPE.LINKED_HASH_MAP, null, type2)), 
+                            await putGetObjectArrays(new ObjectArrayType(new MapObjectType(MapObjectType.MAP_SUBTYPE.LINKED_HASH_MAP, null, type2)),
                                 array);
                         }
                         if (typeInfo2.typeOptional) {
-                            await putGetObjectArrays(new ObjectArrayType(new MapObjectType(MapObjectType.MAP_SUBTYPE.LINKED_HASH_MAP, type1)), 
+                            await putGetObjectArrays(new ObjectArrayType(new MapObjectType(MapObjectType.MAP_SUBTYPE.LINKED_HASH_MAP, type1)),
                                 array);
                         }
                         if (typeInfo1.typeOptional && typeInfo2.typeOptional) {
@@ -318,7 +318,7 @@
                         array.push(value);
                     }
                     await putGetObjectArrays(
-                        new ObjectArrayType(type), 
+                        new ObjectArrayType(type),
                         array);
                     if (typeInfo.typeOptional) {
                         await putGetObjectArrays(new ObjectArrayType(), array);
@@ -338,14 +338,14 @@
                     const primitiveType = typeInfo.elemType;
                     const primitiveTypeInfo = TestingHelper.primitiveValues[primitiveType];
                     let values = primitiveTypeInfo.values;
-                    
+
                     const array = new Array();
                     for (let i = 0; i < 10; i++) {
                         values = values.map((value) => primitiveTypeInfo.modificator(value));
                         array.push(values);
                     }
                     await putGetObjectArrays(
-                        new ObjectArrayType(type), 
+                        new ObjectArrayType(type),
                         array);
                     if (typeInfo.typeOptional) {
                         await putGetObjectArrays(new ObjectArrayType(), array);
@@ -372,13 +372,13 @@
                         array.push(set);
                     }
                     await putGetObjectArrays(
-                        new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.USER_SET, type)), 
+                        new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.USER_SET, type)),
                         array);
                     await putGetObjectArrays(
-                        new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.HASH_SET, type)), 
+                        new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.HASH_SET, type)),
                         array);
                     await putGetObjectArrays(
-                        new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.LINKED_HASH_SET, type)), 
+                        new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.LINKED_HASH_SET, type)),
                         array);
                     if (typeInfo.typeOptional) {
                         await putGetObjectArrays(new ObjectArrayType(), array);
@@ -406,17 +406,17 @@
                         array.push(list);
                     }
                     await putGetObjectArrays(
-                        new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.USER_COL, type)), 
+                        new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.USER_COL, type)),
                         array);
                     await putGetObjectArrays(
-                        new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.ARRAY_LIST, type)), 
+                        new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.ARRAY_LIST, type)),
                         array);
                     await putGetObjectArrays(
-                        new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.LINKED_LIST, type)), 
+                        new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.LINKED_LIST, type)),
                         array);
                     if (typeInfo.typeOptional) {
                         await putGetObjectArrays(
-                            new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.ARRAY_LIST)), 
+                            new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.ARRAY_LIST)),
                             array);
                     }
                 }
@@ -613,7 +613,7 @@
             await cache.clearKey(key);
             expect(result instanceof Array).toBe(true,
                 `result is not Array: arrayType=${valueType}, result=${result}`);
-            expect(await TestingHelper.compare(value, result)).toBe(true, 
+            expect(await TestingHelper.compare(value, result)).toBe(true,
                 `Arrays are not equal: arrayType=${valueType}, put array=${TestingHelper.printValue(value)
                 }, get array=${TestingHelper.printValue(result)}`);
         }
@@ -630,7 +630,7 @@
         let result = await cache.get(key);
         expect(result instanceof Map).toBe(true,
             `result is not Map: mapType=${mapType}, result=${result}`);
-        expect(await TestingHelper.compare(value, result)).toBe(true, 
+        expect(await TestingHelper.compare(value, result)).toBe(true,
             `Maps are not equal: valueType=${mapType._valueType}, put value=${TestingHelper.printValue(value)
             }, get value=${TestingHelper.printValue(result)}`);
     }
@@ -647,11 +647,11 @@
         if (!setType || setType._subType !== CollectionObjectType.COLLECTION_SUBTYPE.LINKED_HASH_SET) {
             const valueArr = [...value].sort();
             const resultArr = [...result].sort();
-            expect(await TestingHelper.compare(valueArr, resultArr)).toBe(true, `Sets are not equal: valueType=${setType ? setType._elementType : 
+            expect(await TestingHelper.compare(valueArr, resultArr)).toBe(true, `Sets are not equal: valueType=${setType ? setType._elementType :
                             null}, put value=${TestingHelper.printValue(valueArr)}, get value=${TestingHelper.printValue(resultArr)}`);
         }
         else {
-            expect(await TestingHelper.compare(value, result)).toBe(true, `Sets are not equal: valueType=${setType ? setType._elementType : 
+            expect(await TestingHelper.compare(value, result)).toBe(true, `Sets are not equal: valueType=${setType ? setType._elementType :
                             null}, put value=${TestingHelper.printValue(value)}, get value=${TestingHelper.printValue(result)}`);
         }
     }
@@ -664,7 +664,7 @@
         let result = await cache.get(key);
         expect(result instanceof Array).toBe(true,
             `result is not Array: listType=${listType}, result=${result}`);
-        expect(await TestingHelper.compare(value, result)).toBe(true, `Lists are not equal: valueType=${listType ? listType._elementType : 
+        expect(await TestingHelper.compare(value, result)).toBe(true, `Lists are not equal: valueType=${listType ? listType._elementType :
                         null}, put value=${TestingHelper.printValue(value)}, get value=${TestingHelper.printValue(result)}`);
     }
 
@@ -676,7 +676,7 @@
         let result = await cache.get(key);
         expect(result instanceof Array).toBe(true,
             `result is not Array: arrayType=${arrayType}, result=${result}`);
-        expect(await TestingHelper.compare(value, result)).toBe(true, `Arrays are not equal: valueType=${arrayType ? arrayType._elementType : 
+        expect(await TestingHelper.compare(value, result)).toBe(true, `Arrays are not equal: valueType=${arrayType ? arrayType._elementType :
                         null}, put value=${TestingHelper.printValue(value)}, get value=${TestingHelper.printValue(result)}`);
     }
 
diff --git a/spec/cache/UUID.spec.js b/spec/cache/UUID.spec.js
new file mode 100644
index 0000000..1715113
--- /dev/null
+++ b/spec/cache/UUID.spec.js
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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';
+
+require('jasmine-expect');
+
+const TestingHelper = require('../TestingHelper');
+const IgniteClient = require('apache-ignite-client');
+const CacheConfiguration = IgniteClient.CacheConfiguration;
+const SqlFieldsQuery = IgniteClient.SqlFieldsQuery;
+const ObjectType = IgniteClient.ObjectType;
+
+const CACHE_NAME = '__test_cache';
+const TABLE_NAME = '__test_UUID_table';
+const UUID_STRINGS = [
+    'd57babad-7bc1-4c82-9f9c-e72841b92a85',
+    '5946c0c0-2b76-479d-8694-a2e64a3968da',
+    'a521723d-ad5d-46a6-94ad-300f850ef704'
+];
+
+describe('uuid test suite >', () => {
+    let igniteClient = null;
+
+    beforeAll((done) => {
+        Promise.resolve().
+            then(async () => {
+                await TestingHelper.init();
+                igniteClient = TestingHelper.igniteClient;
+                await testSuiteCleanup(done);
+                await igniteClient.getOrCreateCache(CACHE_NAME, new CacheConfiguration().setSqlSchema('PUBLIC'));
+            }).
+            then(done).
+            catch(error => done.fail(error));
+    }, TestingHelper.TIMEOUT);
+
+    afterAll((done) => {
+        Promise.resolve().
+            then(async () => {
+                await testSuiteCleanup(done);
+                await TestingHelper.cleanUp();
+            }).
+            then(done).
+            catch(error => done.fail(error));
+    }, TestingHelper.TIMEOUT);
+
+    it('insert byte array and select string to check uuid marshalling', (done) => {
+        Promise.resolve().
+            then(async () => {
+                const cache = igniteClient.getCache(CACHE_NAME);
+                const createTable = `CREATE TABLE IF NOT EXISTS ${TABLE_NAME} (id INTEGER PRIMARY KEY, uuid_field UUID)`;
+                (await cache.query(new SqlFieldsQuery(createTable))).getAll();
+
+                const insertQuery = new SqlFieldsQuery(`INSERT INTO ${TABLE_NAME} (id, uuid_field) VALUES (?, ?)`);
+                const dataTypes = [ObjectType.PRIMITIVE_TYPE.INTEGER, ObjectType.PRIMITIVE_TYPE.UUID];
+
+                let id = 1;
+                for (let uuidStr of UUID_STRINGS) {
+                    const args = [id++, uuidToBytes(uuidStr)];
+                    (await cache.query(insertQuery.setArgs(...args).setArgTypes(...dataTypes))).getAll();
+                }
+
+                const selectQuery = `SELECT * FROM ${TABLE_NAME} WHERE uuid_field = ?`;
+
+                for (let uuidStr of UUID_STRINGS) {
+                    const cursor = await cache.query(new SqlFieldsQuery(selectQuery).setArgs(uuidStr));
+                    const rows = await cursor.getAll();
+                    expect(rows.length).toBe(1);
+                    expect(rows[0][1]).toEqual(uuidToBytes(uuidStr));
+                }
+            }).
+            then(done).
+            catch(error => done.fail(error));
+    });
+
+    function uuidToBytes(uuidStr) {
+        const buf = [];
+        uuidStr.toLowerCase().replace(/[0-9a-f]{2}/g, function(oct) {
+            buf.push(parseInt(oct, 16));
+        });
+
+        return buf;
+    }
+
+    async function testSuiteCleanup(done) {
+        const cache = await igniteClient.getOrCreateCache(CACHE_NAME, new CacheConfiguration().setSqlSchema('PUBLIC'));
+        const dropTable = `DROP TABLE IF EXISTS ${TABLE_NAME}`;
+        (await cache.query(new SqlFieldsQuery(dropTable))).getAll();
+        await TestingHelper.destroyCache(CACHE_NAME, done);
+    }
+});
diff --git a/spec/config.js b/spec/config.js
index 4e89875..747170a 100644
--- a/spec/config.js
+++ b/spec/config.js
@@ -19,7 +19,7 @@
 
 exports.endpoints = process.env.APACHE_IGNITE_CLIENT_ENDPOINTS ?
                     process.env.APACHE_IGNITE_CLIENT_ENDPOINTS.split(',') : [];
-exports.debug = process.env.APACHE_IGNITE_CLIENT_DEBUG === 'true' || 
+exports.debug = process.env.APACHE_IGNITE_CLIENT_DEBUG === 'true' ||
                 process.env.APACHE_IGNITE_CLIENT_DEBUG === '1';
 
 
diff --git a/spec/query/SqlQuery.spec.js b/spec/query/SqlQuery.spec.js
index 2bbd0e5..c2e2bb1 100644
--- a/spec/query/SqlQuery.spec.js
+++ b/spec/query/SqlQuery.spec.js
@@ -45,7 +45,7 @@
                 igniteClient = TestingHelper.igniteClient;
                 await testSuiteCleanup(done);
                 await igniteClient.getOrCreateCache(
-                    CACHE_NAME, 
+                    CACHE_NAME,
                     new CacheConfiguration().
                         setQueryEntities(
                             new QueryEntity().